次のMSDN チュートリアルに従って、32 ビット アプリケーションから 64 ビット レジストリ プロバイダーにクエリを実行しようとしています。
悲しいことに、例はすべて VB で書かれており、私は何かに行き詰まっています。
C++ 開発者の場合、この記事では次のことについて言及しています...
C++ アプリケーションは、IWbemServices::ExecMethod で IWbemContext インターフェイスを使用して、既定以外のプロバイダーの使用を WMI に伝えることができます。
...ただし、サンプルの VB コードを見ると、コンテキスト オブジェクトもConnectServer
メソッドで使用されています。
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
これをVC ++で再現しようとしました:
HRESULT res;
CComPtr<IWbemContext> ctx;
if (!create_registry_redirection_context_(hive, ctx)) {
return false;
}
res = locator_->ConnectServer(CComBSTR(namespace_.c_str()), // Namespace to use
0, // Current security context (username)
0, // Current security context (password)
0, // Use current locale
WBEM_FLAG_CONNECT_USE_MAX_WAIT, // Return if connexion is unsuccessful after 2 minutes
0, // Name of the domain of the user to authenticate
ctx, // Optional context
&service_); // Fill this pointer
このcreate_registry_redirection_context_
メソッドを使用CoCreateInstance
してコンテキストをインスタンス化し、次の行を使用してアーキテクチャを設定します。
CComVariant value_arch(64, VT_I4);
ctx->SetValue(L"__ProviderArchitecture", 0, &value_arch);
問題は、ConnectServer
メソッドがエラー (0x80041008 - WMI 無効なパラメーター) を返すことです。この行をコメントアウトするとctx->SetValue(L"__ProviderArchitecture", 0, &value_arch);
、すべてが正常に機能しますが、もちろん、最終的に 32 ビットのレジストリ プロバイダーにクエリを実行することになります。
また、通話中にコンテキストを設定せず、ConnectServer
通話中のみExecMethod
(MSDN の記事で指定されているように) 設定しようとしましたが、エラーは発生しませんが、32 ビット プロバイダーにクエリを実行していて、表示されません私の64ビットレジストリキー。
私は何を間違っていますか?お時間をいただきありがとうございます。