0

会社指定の WMI メソッドを呼び出そうとする C++ コードのブロックがあります。パラメータを表す IWbemClassObject を構築しようとすると、WBEM_E_NOT_FOUND エラー メッセージが表示されます。MSDN サイトによると 、これは有効な HRESULT ではありません。

/* pSvc has been setup already, all calls returned S_OK. Ugly Debugging statements have been sprinkled throughout the code. */
HRESULT hres;
IWbemClassObject* DataInClass;
IWbemClassObject* DataOutClass;
IWbemClassObject* CallingObject;
/* Grab the types of parameters we will be using for Input and Output.
DataIn and DataOut are set to the classes we will  be using */
hres = pSvc->GetObject(
    _bstr_t("ObjectName"),
    WBEM_FLAG_RETURN_WBEM_COMPLETE,
    NULL,
    &CallingObject,
    NULL
    );
cout << "GetObject:" << hres << endl;

string function_type = "MethodName";

hres = CallingObject->GetMethod(
    _bstr_t(function_type.c_str()),
    0,
    &DataInClass,
    &DataOutClass
    );
cout << "GetMethod:" << hres << endl;
if(hres == WBEM_S_NO_ERROR) cout << "No Error" << endl;
if(hres == WBEM_E_NOT_FOUND) cout << "Not found" << endl;
if(hres == WBEM_E_OUT_OF_MEMORY) cout << "OOM" << endl;
/* Create an instance of DataIn and DataOut and populate the parameters */
IWbemClassObject* DataIn;
IWbemClassObject* DataOut;
hres = DataInClass->SpawnInstance(0, &DataIn);
hres = DataOutClass->SpawnInstance(0, &DataOut);

/* NOTE: up to this point, all HRESULTS have been returning S_OK. I'm getting appropriate pointer values, so it appears that the code can connect to WMI. */

/* Set all of the parameters needed for DataIn */
VARIANT var;
// Active: true
_variant_t varActive(true);
var = varActive.Detach();
hres = DataIn->Put(_bstr_t("Active"), 0, &var, 0);
VariantClear(&var);
switch(hres){
case WBEM_E_FAILED: cout << "Failed" << endl; break;
case WBEM_E_INVALID_PARAMETER: cout << "ip" << endl; break;
case WBEM_E_INVALID_PROPERTY_TYPE: cout << "ipt" << endl; break;
case WBEM_E_OUT_OF_MEMORY: cout << "oom" << endl; break;
case WBEM_E_TYPE_MISMATCH: cout << "typem" << endl; break;
case WBEM_S_NO_ERROR: cout << "ok" << endl; break;
case WBEM_E_NOT_FOUND: cout << "WHAT!?" << endl; break; // This is the error code being returned from DataIn->Put
default: cout << "nota?" << endl; break;
}

なぜこれが起こっているのか、どうすれば修正できるのか誰か知っていますか?

よろしくお願いします、ザック

4

1 に答える 1

1

通常、このエラーは「GET」コマンドで発生します。ほとんどの場合、エラーの特定の原因は、アクセスしようとしている WMI クラスによって異なります。たとえば、WMIDiagは、パフォーマンス カウンターに接続しようとしたときにこのエラーが返される場合について、次のように述べています。

WMI パフォーマンス クラスが見つからない場合 (つまり、'Win32_PerfRawData_TermService_TerminalServices')、一般的には、WMI パフォーマンス カウンターを公開する WMI クラス プロバイダーのバッファー更新が不足していることが原因です。
次のコマンドを使用して、WMI クラス プロバイダーのバッファーを更新できます:
'WINMGMT.EXE /SYNCPERF'

それ以外の場合、このエラーは、破損したリポジトリが原因であることが最も一般的です。例については、このMS KB 記事を参照してください。

「会社指定」の WMI メソッドについて言及したので、独自の WMI プロバイダーを登録していると思います。リポジトリを再構築する前に、このプロバイダーが WMI に適切に登録されていない可能性があります。

あなたが質問してからほぼ1年が経ちましたが、おそらくあなたはそれを理解したと思います. もしそうなら、他のユーザーが恩恵を受けることができるように、コミュニティはあなたの結果をここに投稿していただければ幸いです.

于 2013-12-09T17:44:13.520 に答える