相信很多人都一直希望能够修改网络映射磁盘的Lable,但伤心的是使用SetVolumValue不可用,其仅适用于本地磁盘的Label修改。
修改网络磁盘的方法可以采用注册表的形式,这里该方法就不拿来说明,网上很容易找到的。
这里提供一种采用COM 的API方式来修改:
void RenameDrive(BSTR strNewName, BSTR strDriveLetter)
{
IShellDispatch* pShellDispatch = NULL;
if ( SUCCEEDED( CoInitialize(NULL) ) )
{
// 如果成功初始化COM库,则继续初始化并运行应用程序...
// 对于Win32应用程序, CoInitialize函数的pvReserved参数,必须为NULL. 此参数不能被用于32位COM,
// CoInitialize将会返回E_INVALIDARG,如果传递一个非NULL参数.
}
else
{
// 如果初始化COM库失败,则退出.
}
HRESULT hr = CoCreateInstance(CLSID_Shell,
NULL,
CLSCTX_INPROC_SERVER,
IID_IShellDispatch,
(void**)&pShellDispatch);
if (SUCCEEDED(hr) && pShellDispatch)
{
Folder* pFolder = NULL;
VARIANT vt = {};
VariantInit(&vt);
vt.vt = VT_BSTR;
vt.bstrVal = strDriveLetter;
hr = pShellDispatch->NameSpace(vt, &pFolder);
VariantClear(&vt);
if (SUCCEEDED(hr) && pFolder)
{
Folder2* pFolder2 = NULL;
hr = pFolder->QueryInterface(IID_Folder2, (void**)&pFolder2);
if (SUCCEEDED(hr) && pFolder2)
{
FolderItem* pFolderItem = NULL;
hr = pFolder2->get_Self(&pFolderItem);
if (SUCCEEDED(hr) && pFolderItem)
{
pFolderItem->put_Name(strNewName);
pFolderItem->Release();
}
pFolder2->Release();
}
pFolder->Release();
}
pShellDispatch->Release();
CoUninitialize();
}
}
测试代码:
int _tmain(int argc, _TCHAR* argv[])
{
BSTR bstrLabel = ::SysAllocString( L"TestLabel" );
if (bstrLabel == NULL)
return E_OUTOFMEMORY;
BSTR bstrLetter = ::SysAllocString( L"Z:" );
if (bstrLetter == NULL)
return E_OUTOFMEMORY;
RenameDrive(bstrLabel, bstrLetter);
::SysFreeString( bstrLabel );
::SysFreeString( bstrLetter );
return 0;
}
OK
转载请注明出处: