2016-05-12 12 views
1

WMIインスタンスの削除のためにC#とVBSでいくつかのサンプルが見つかりましたが、これはC++で実装する必要があります。C++でWMIインスタンスを削除する

私のサンプルコード:

CoInitialize(NULL); 

HRESULT hRes; 

//Obtain the initial locator to WMI 
CComPtr<IWbemLocator> pLoc = NULL; 
hRes = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*) &pLoc); 
if(FAILED(hRes)) 
    return 1; 

//Connect to WMI through the IWbemLocator::ConnectServer method 
CComPtr<IWbemServices> pSvc = NULL; 
//Connect to the root namespace with the current user and obtain pointer pSvc to make IWbemServices calls. 
hRes = pLoc->ConnectServer(L"ROOT\\SUBSCRIPTION", NULL, NULL, 0, NULL, 0, 0, &pSvc); 
if(FAILED(hRes)) 
    return 1; 

hRes = pSvc->DeleteInstance(
      L"CommandLineEventConsumer.Name='{709782F3-E860-488E-BD8A-89FBC8C1495C}'", 
      WBEM_FLAG_RETURN_IMMEDIATELY, NULL, NULL); 

return 0; 

私はherehereを見つけたことによると、私のコードは動作するはずです。 (コールへのパラメータの一つが正しくない)私は確かに{709782F3-E860-488E-BD8A-89FBC8C1495C}

という名前CommandLineEventConsumerを持っており、私のコードはIWbemServices::DeleteInstanceに失敗し、エラーコード0x80041008

誰かが私のコードで間違いを発見したら、私は感謝します。それを行うにはいくつかの特権が必要でしょうか?

答えて

0

私は2つの解決策を発見しました。

_bstr_t objPath(L"CommandLineEventConsumer.Name='{709782F3-E860-488E-BD8A-89FBC8C1495C}'"); 
hRes = pSvc->DeleteInstance(objPath, 0, NULL, NULL); 

2.結果のためのIWbemCallResult

_bstr_t objPath(L"CommandLineEventConsumer.Name='{709782F3-E860-488E-BD8A-89FBC8C1495C}'"); 
CComPtr<IWbemCallResult> pRes = NULL; 
hRes = pSvc->DeleteInstance(objPath, WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pRes); 

多くの調査はしませんでしたが、両方の方法で動作します。スペックが100%正しくないように見えます。

2

IWbemServices::DeleteInstanceの最初のパラメータは、BSTRです。 BSTRは、UTF-16でエンコードされたCスタイルの文字列とは異なり、明示的な長さの引数を格納します。 BSTRwchar_t*の型ですが、BSTRの代わりにプレーンな文字列リテラルを渡すことはできません。また

BSTR objPath = ::SysAllocString(L"CommandLineEventConsumer.Name='{709782F3-E860-488E-BD8A-89FBC8C1495C}'"); 
hRes = pSvc->DeleteInstance(
     objPath, 
     WBEM_FLAG_RETURN_IMMEDIATELY, NULL, NULL); 
::SysFreeString(objPath); 

、あなたはすでにあなたがあなたの人生を容易にするためにCComBSTRを使用することができCComPtrのためのATLを使用しているので、::

CComBSTR objPath(L"CommandLineEventConsumer.Name='{709782F3-E860-488E-BD8A-89FBC8C1495C}'"); 
hRes = pSvc->DeleteInstance(
     objPath, 
     WBEM_FLAG_RETURN_IMMEDIATELY, NULL, NULL); 
あなたが SysAllocStringを呼び出す必要があり、文字列リテラルから BSTRを作成するには


注: IWbemLocator::ConnectServerもパラメータとして BSTRを必要とします。ドキュメントページに用意されているサンプルはCのスタイルの文字列を渡すので、 IWbemLocatorのインターフェースは、無効なパラメータが与えられたときにもっと寛容です。

1.Remove WBEM_FLAG_RETURN_IMMEDIATELYフラグ:

+0

'BSTR'でも' CComBSTR'でも動作しません。また、 'BSTR'は' OLECHAR * '、' OLECHAR'を 'WCHAR'、' WCHAR'を 'wchar_t'として型定義されています。基本的に 'BSTR'と' wchar_t * 'は同じです。 – ST3

+1

@ ST3: 'BSTR'と' wchar_t * 'は、C言語やC++では**同じ**タイプですが、根本的に異なるセマンティクスを持っています。 [BSTR](https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069.aspx)は、長さ接頭辞、データ文字列、およびターミネータで構成される複合データ型です。カウントされた文字列として、埋め込まれたNUL文字を含むことができます。一方、Cスタイルの文字列はゼロ終端されているため、NUL文字を含めることはできません。これは、明示的な長さ接頭辞を保持しないためです。実際の 'BSTR'を使用するときにどんなエラーコードが表示されますか? – IInspectable

+0

エラーコードは「0x80041008」と同じです。 – ST3

関連する問題