wmi에서 가져온 메소드 실행 함수 실행시 나오는 반환값에 대하여 질문드립니다. Execmethod

ehaakdl의 이미지

msdn에서 지원하는 win32_volume class format method를 사용하는 도중 execmethod 반환값이 WBEM_E_INVALID_METHOD_PARAMETERS이것이 나와 질문 드립니다.

wmi에서 연결후 보시는바와 같이 메소드 실행 하엿는대 반환값이 WBEM_E_INVALID_METHOD_PARAMETERS 이렇게 나왔습니다. 찾아본 결과 execmethod로 넣어준 파라

미터가 유효하지 않거나 클래스가 정적으로 ?? 만들어져서?? 원인이 두가지 라는대 제가 보기엔 넘겨준 값들은 다 리턴값 체크해서 확인한 뒤 넣은건데 왜 이런

반환값이 나오는지 의문이 듭니다.

이건 에러값에 대한 정보입니다.
https://msdn.microsoft.com/ko-kr/library/aa392103(v=vs.85).aspx

int main(void)
{
 
	HRESULT hresult = 0;
	IWbemLocator *pLoc = 0;
	IWbemServices *pSvc = 0;
	IWbemClassObject *pObj = NULL;
	BSTR ClassName = SysAllocString(L"Win32_Volume");
	BSTR MethodName = SysAllocString(L"Format");
 
 
	//초기화 com
	hresult = CoInitializeEx(NULL, COINIT_MULTITHREADED);
	if (FAILED(hresult))
	{
		return hresult;
	}
 
 
 
	hresult = CoInitializeSecurity(
		NULL,                       // security descriptor
		-1,                          // use this simple setting
		NULL,                        // use this simple setting
		NULL,                        // reserved
		RPC_C_AUTHN_LEVEL_DEFAULT,   // authentication level  
		RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
		NULL,                        // use this simple setting
		EOAC_NONE,                   // no special capabilities
		NULL);
	if (FAILED(hresult))
	{
		CoUninitialize();
		wprintf(L"Failed to initialize security.");
		//cout << "Failed to initialize security. Error code = 0x"
		//	<< hex << hcomSecurityhr << endl;
		return hresult;
	}
 
 
	hresult = CoCreateInstance(CLSID_WbemLocator, 0,
		CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
 
	if (FAILED(hresult))
	{
		wprintf(L"Failed to create IWbemLocator object. \n");
		//cout << "Failed to create IWbemLocator object. Err code = 0x"
		//	<< hex << hr << endl;
		CoUninitialize();
		return hresult;     // Program has failed.
	}
 
 
	// Connect to the root\default namespace with the current user.
	hresult = pLoc->ConnectServer(
		BSTR(L"ROOT\\CIMV2"),  //namespace
		NULL,       // User name 
		NULL,       // User password
		0,         // Locale 
		NULL,     // Security flags
		0,         // Authority 
		0,        // Context object 
		&pSvc);   // IWbemServices proxy
 
 
	if (FAILED(hresult))
	{
		wprintf(L"Could not connect\n");
		//cout << "Could not connect. Error code = 0x"
		//	<< hex << hr << endl;
		pLoc->Release();
		CoUninitialize();
		return hresult;      // Program has failed.
	}
	wprintf(L"connect wmi succes\n");
	//cout << "Connected to WMI" << endl;
	// Step 5: --------------------------------------------------
	// Set security levels for the proxy ------------------------
 
	hresult = CoSetProxyBlanket(
		pSvc,                        // Indicates the proxy to set
		RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx 
		RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx 
		NULL,                        // Server principal name 
		RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
		RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
		NULL,                        // client identity
		EOAC_NONE                    // proxy capabilities 
	);
 
	if (FAILED(hresult))
	{
		wprintf(L"Could not set proxy blanket\n");
		//cout << "Could not set proxy blanket. Error code = 0x"
		//	<< hex << hresult << endl;
		pSvc->Release();
		pLoc->Release();
		CoUninitialize();
		return 1;               // Program has failed.
	}
	//get class
 
 
 
	//The pWbemSvc pointer is of type IWbemServices*
	//BSTR ClassName = SysAllocString(L"WINMGMTS:\\\\.\\ROOT\\CIMV2:Win32_Volume");
	/*
	TCHAR Drive[250];
	TCHAR ClassDir[1024];
	wprintf(L"드라이브 입력:");
	wscanf_s(L"%s",Drive,sizeof(TCHAR)*250);
	wsprintf(ClassDir,L"WINMGMTS:\\\\.\\ROOT\\CIMV2:Win32_Volume.Driveletter=%s",Drive);
	BSTR ClassName = SysAllocString(ClassDir);
	*/
	//BSTR ClassName = SysAllocString(L"WINMGMTS:\\\\.\\ROOT\\CIMV2:Win32_Volume");
 
 
 
 
	hresult = pSvc->GetObject(ClassName, 0, 0, &pObj, 0);
	if (FAILED(hresult))
	{
		wprintf(L"Fail GetObject\n");
		pSvc->Release();
		CoUninitialize();
		switch (hresult)
		{
		case WBEM_E_ACCESS_DENIED:
			wprintf(L"WBEM_E_ACCESS_DENIED\n");
			break;
		case WBEM_E_FAILED:
			wprintf(L"WBEM_E_FAILED\n");
			break;
		case WBEM_E_INVALID_CLASS:
			wprintf(L"WBEM_E_INVALID_CLASS\n");
			break;
		case WBEM_E_INVALID_PARAMETER:
			wprintf(L"WBEM_E_INVALID_PARAMETER\n");
			break;
		case WBEM_E_INVALID_OBJECT_PATH:
			wprintf(L"WBEM_E_INVALID_OBJECT_PATH\n");
			break;
		case  WBEM_E_NOT_FOUND:
			wprintf(L"WBEM_E_NOT_FOUND\n");
			break;
		case WBEM_E_OUT_OF_MEMORY:
			wprintf(L"WBEM_E_OUT_OF_MEMORY\n");
			break;
		case WBEM_E_SHUTTING_DOWN:
			wprintf(L"WBEM_E_SHUTTING_DO​​WN\n");
			break;
		case  WBEM_E_TRANSPORT_FAILURE:
			wprintf(L"WBEM_E_TRANSPORT_FAILURE\n");
			break;
		case WBEM_S_NO_ERROR:
			wprintf(L"WBEM_S_NO_ERROR\n");
		default:
			break;
		}
		return hresult;
	}
	wprintf(L"Class Succes\n");
	VARIANT v_DriveLetter;
	VariantInit(&v_DriveLetter);
	V_VT(&v_DriveLetter) = VT_BSTR;
	v_DriveLetter.bstrVal = L"D:";
	hresult = pObj->Put(L"DriveLetter", 0, &v_DriveLetter, 0);
	if (FAILED(hresult)) wprintf(L"var fail\n");
 
	//get method
	IWbemClassObject* pInParamsDefinition = NULL;
	hresult = pObj->GetMethod(MethodName,0,&pInParamsDefinition, NULL);
	if (FAILED(hresult))
	{
 
		wprintf(L"Method Fail\n");
		pSvc->Release();
		CoUninitialize();
		return hresult;
	}
	wprintf(L"Method Succes\n");
 
 
	//메소드 인스턴스화
	IWbemClassObject *pInMethodInst = 0;
	hresult = pInParamsDefinition->SpawnInstance(0, &pInMethodInst);
	if (FAILED(hresult))
	{
		wprintf(L"Method inst FAILED\n");
	}
 
 
	//실질적인 매개변수 넘기는 곳
	VARIANT v_FileSystem,v_QuickFormat;
 
	VariantInit(&v_FileSystem);
	v_FileSystem.vt = VT_BSTR;
	v_FileSystem.bstrVal = L"NTFS";
	hresult = pInMethodInst->Put(L"FileSystem",0,&v_FileSystem, 0);
	if (FAILED(hresult)) wprintf(L"var fail\n");
 
	VariantInit(&v_QuickFormat);
	v_QuickFormat.vt = VT_BOOL;
	v_QuickFormat.boolVal = VARIANT_TRUE;
	hresult = pInMethodInst->Put(L"QuickFormat", 0, &v_QuickFormat,0);
	if (FAILED(hresult)) wprintf(L"var fail\n");
 
	//pOutParams 로 메소드의 리턴값 가져올수있음 get
	IWbemClassObject *pOutParams = NULL;
	hresult = pSvc->ExecMethod(ClassName,MethodName,0,NULL,pInMethodInst,&pOutParams,NULL);
	if (FAILED(hresult))
	{
		switch (hresult)
		{
		case WBEM_E_FAILED:
			wprintf(L"FAILED\n");
			break;
		case WBEM_E_INVALID_CLASS:
			wprintf(L"class no\n");
			break;
		case WBEM_E_INVALID_PARAMETER:
			wprintf(L"WBEM_E_INVALID_PARAMETER\n");
			break;
		case WBEM_E_METHOD_DISABLED:
			wprintf(L"WBEM_E_METHOD_DISABLED\n");
			break;
		case WBEM_E_METHOD_NOT_IMPLEMENTED:
			wprintf(L"WBEM_E_METHOD_NOT_IMPLEMENTED\n");
			break;
		case WBEM_E_NOT_FOUND:
			wprintf(L"WBEM_E_NOT_FOUND\n");
			break;
		case WBEM_E_PROVIDER_NOT_CAPABLE:
			wprintf(L"WBEM_E_PROVIDER_NOT_CAPABLE\n");
			break;
		case WBEM_E_OUT_OF_MEMORY:
			wprintf(L"WBEM_E_OUT_OF_MEMORY\n");
			break;
		case WBEM_E_SHUTTING_DOWN:
			wprintf(L"WBEM_E_SHUTTING_DO​​WN\n");
			break;
		case WBEM_E_TRANSPORT_FAILURE:
			wprintf(L"WBEM_E_TRANSPORT_FAILURE\n");
			break;
		case WBEM_E_INVALID_METHOD:
			wprintf(L"WBEM_E_INVALID_METHOD\n");
			break;
		case WBEM_E_ACCESS_DENIED:
			wprintf(L"WBEM_E_ACCESS_DENIED\n");
			break;
		case WBEM_E_INVALID_METHOD_PARAMETERS:
			wprintf(L"WBEM_E_INVALID_METHOD_PARAMETERS\n");
			break;
		case WBEM_S_NO_ERROR:
			wprintf(L"WBEM_S_NO_ERROR\n");
			break;
		default:
			break;
		}
		wprintf(L"Exec Fail\n");
		pSvc->Release();
		CoUninitialize();
		return hresult;
	}
 
 
	CoUninitialize(); //com 해제
 
 
 
	return 0;
}