如何使用WMI格式化磁盘卷 [英] how do I use WMI to format a disk volume
本文介绍了如何使用WMI格式化磁盘卷的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以下是我使用的代码,但总是失败,错误0x8004101e(wbemErrIllegalOperation引用 WbemErrorEnum(Windows) [ ^ ])致电
the following is the code I used, but alway failed with error 0x8004101e(wbemErrIllegalOperation reference here WbemErrorEnum (Windows)[^]) when call
hr = pclsObj->GetMethod(bstrMethod, 0, &pInParamsDefinition, &pOutParamsDefinition);
,我真的不知道为什么,任何建议都表示赞赏。提前谢谢。
,I really don't know why, any suggestions is appreciated. thanks in advance.
HRESULT WMI_FormatVolume(BYTE volumeLetter, eFileSystem fs, const WCHAR* szLabel, bool bQuickFormat, UINT clusterSize, bool bEnableCompression)
{
HRESULT hr = S_OK;
hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
if( FAILED(hr) )
return hr;
IWbemLocator *pLocator = NULL;
IWbemServices *pSvc = NULL;
do
{
hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if( !SUCCEEDED(hr) )
break;
hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLocator));
if( !SUCCEEDED(hr) )
break;
hr = pLocator->ConnectServer(_bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pSvc);
if( !SUCCEEDED(hr) )
break;
hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if( !SUCCEEDED(hr) )
break;
_bstr_t bstrMethod(L"Format");
_bstr_t bstrClassName(L"Win32_Volume");
// IWbemClassObject* pClass = NULL;
// hr = pSvc->GetObject(bstrClassName, 0, NULL, &pClass, NULL);
// if( !SUCCEEDED(hr) )
// break;
//
// IWbemClassObject* pInParamsDefinition = NULL;
// hr = pClass->GetMethod(bstrMethod, 0, &pInParamsDefinition, NULL);
// if( !SUCCEEDED(hr) )
// break;
//
// IWbemClassObject* pClassInstance = NULL;
// hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
// if( !SUCCEEDED(hr) )
// break;
// execute QWL to query volume info
IEnumWbemClassObject* pEnumerator = NULL;
WCHAR szWQL[128] = L""; swprintf_s(szWQL, L"SELECT * FROM Win32_Volume WHERE DriveLetter = '%c:'", volumeLetter);
hr = pSvc->ExecQuery(_bstr_t(L"WQL"), _bstr_t(szWQL), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if( !SUCCEEDED(hr) )
break;
while ( pEnumerator )
{
ULONG uReturn = 0;
IWbemClassObject *pclsObj = NULL;
hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if( !SUCCEEDED(hr) )
break;
IWbemClassObject* pInParamsDefinition = NULL;
IWbemClassObject* pOutParamsDefinition = NULL;
hr = pclsObj->GetMethod(bstrMethod, 0, &pInParamsDefinition, &pOutParamsDefinition);
if( !SUCCEEDED(hr) )
break;
IWbemClassObject* pClassInstance = NULL;
hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
if( !SUCCEEDED(hr) )
break;
_variant_t varFileSystem(GetFileSystemStr(fs));
_variant_t varQuickFormat(bQuickFormat);
_variant_t varClusterSize(clusterSize);
_variant_t varLabel(szLabel);
_variant_t varEnableCompression(bEnableCompression);
hr = pClassInstance->Put(L"FileSystem", 0, &varFileSystem, 0);
hr = pClassInstance->Put(L"QuickFormat", 0, &varQuickFormat, 0);
hr = pClassInstance->Put(L"ClusterSize", 0, &varClusterSize, 0);
hr = pClassInstance->Put(L"Label", 0, &varLabel, 0);
hr = pClassInstance->Put(L"EnableCompression", 0, &varEnableCompression, 0);
IWbemClassObject* pOutParams = NULL;
hr = pSvc->ExecMethod(bstrClassName, bstrMethod, 0, NULL, pClassInstance, &pOutParams, NULL);
if( !SUCCEEDED(hr) )
break;
}
} while ( 0 );
if ( NULL != pLocator )
pLocator->Release();
if ( NULL != pSvc )
pSvc->Release();
CoUninitialize();
return hr;
}
推荐答案
这里是调用Format使用WMI的正确方法。参考网站如下。
如何通过C ++格式化Windows中的RAW磁盘wreckor [ ^ ]
blog.aaronballman.com/2011/07/calling-instance-methods-in-wmi /#comment-48687
here is the right way to call Format use WMI. reference websites are as follow.
How to format a RAW disk in windows by C++ | wreckor[^]
blog.aaronballman.com/2011/07/calling-instance-methods-in-wmi/#comment-48687
namespace Utility
{
const WCHAR* GetFileSystemStr(eFileSystem fs)
{
switch ( fs )
{
case FS_FAT32:
return L"FAT32";
case FS_FAT:
return L"FAT";
case FS_NTFS:
default:
return L"NTFS";
}
}
HRESULT WMI_FormatVolume(BYTE volumeLetter, const TCHAR* szLabel, int* pErrorCode, eFileSystem fs, bool bQuickFormat, LONG clusterSize, bool bEnableCompression)
{
HRESULT hr = S_OK;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if( S_OK != hr )
return hr;
IWbemLocator *pLocator = NULL;
IWbemServices *pService = NULL;
IWbemClassObject* pClass = NULL;
IWbemClassObject* pInParamsDefinition = NULL;
IWbemClassObject* pClassInstance = NULL;
IEnumWbemClassObject* pEnumerator = NULL;
do
{
hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if( S_OK != hr )
break;
hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<lpvoid*>(&pLocator));
if( S_OK != hr )
break;
hr = pLocator->ConnectServer(_bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pService);
if( S_OK != hr )
break;
hr = CoSetProxyBlanket(pService, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if( S_OK != hr )
break;
_bstr_t bstrMethod(L"Format");
_bstr_t bstrClassName(L"Win32_Volume");
// get class and method here
hr = pService->GetObject(bstrClassName, 0, NULL, &pClass, NULL);
if( S_OK != hr )
break;
hr = pClass->GetMethod(bstrMethod, 0, &pInParamsDefinition, NULL);
if( S_OK != hr )
break;
hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
if( S_OK != hr )
break;
// execute QWL to query volume info
WCHAR szWQL[128] = L""; swprintf_s(szWQL, L"SELECT * FROM Win32_Volume WHERE DriveLetter = '%c:'", volumeLetter);
hr = pService->ExecQuery(_bstr_t(L"WQL"), _bstr_t(szWQL), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if( S_OK != hr )
break;
while ( pEnumerator )
{
ULONG uReturn = 0;
IWbemClassObject* pVolumeObj = NULL;
hr = pEnumerator->Next(WBEM_INFINITE, 1, &pVolumeObj, &uReturn);
if ( 0 == uReturn )
break;
// set format param
_variant_t varFileSystem(GetFileSystemStr(fs));
_variant_t varQuickFormat(bQuickFormat);
_variant_t varClusterSize(clusterSize);
_variant_t varLabel(szLabel);
_variant_t varEnableCompression(bEnableCompression);
hr = pClassInstance->Put(L"FileSystem", 0, &varFileSystem, 0);
hr = pClassInstance->Put(L"QuickFormat", 0, &varQuickFormat, 0);
hr = pClassInstance->Put(L"ClusterSize", 0, &varClusterSize, 0);
hr = pClassInstance->Put(L"Label", 0, &varLabel, 0);
hr = pClassInstance->Put(L"EnableCompression", 0, &varEnableCompression, 0);
// key!!! get class object
_variant_t var;
hr = pVolumeObj->Get(L"__PATH", 0, &var, NULL, NULL);
pVolumeObj->Release();
if( S_OK != hr )
break;
IWbemClassObject* pOutParams = NULL;
hr = pService->ExecMethod(var.bstrVal, bstrMethod, 0, NULL, pClassInstance, &pOutParams, NULL);
if( S_OK != hr )
break;
_variant_t varReturnValue;
pOutParams->Get(L"ReturnValue", 0, &varReturnValue, NULL, 0);
pOutParams->Release();
int formatResult = varReturnValue.intVal;
if ( 0 != formatResult )
hr = S_FALSE;
if ( NULL != pErrorCode )
*pErrorCode = formatResult;
}
} while( 0 );
if ( NULL != pLocator )
pLocator->Release();
if ( NULL != pService )
pService->Release();
if ( NULL != pClass )
pClass->Release();
if ( NULL != pInParamsDefinition )
pInParamsDefinition->Release();
if ( NULL != pClassInstance )
pClassInstance->Release();
if ( NULL != pEnumerator )
pEnumerator->Release();
CoUninitialize();
return hr;
}
}
这篇关于如何使用WMI格式化磁盘卷的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文