3

次の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ビットレジストリキー。

私は何を間違っていますか?お時間をいただきありがとうございます。

4

2 に答える 2

1

少し遅れていますが、アーカイブ用です(MSはそのようなサンプルを提供できないため):

  HRESULT hres;
  IWbemLocator *pLoc = NULL;
  hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); 
  if (FAILED(hres))
  {
    m_nExitCode = TCP1;
    return FALSE;
  }

  IWbemContext *pContext = NULL;
  hres = CoCreateInstance(CLSID_WbemContext, 0, CLSCTX_INPROC_SERVER, IID_IWbemContext, (LPVOID *) &pContext); 
  if (FAILED(hres))
  {
    m_nExitCode = TCP1_2;
    return FALSE;
  }

  VARIANT vArchitecture;
  VariantInit(&vArchitecture);
  V_VT(&vArchitecture) = VT_I4;
  V_INT(&vArchitecture) = 64;
  hres = pContext->SetValue(_bstr_t(L"__ProviderArchitecture"), 0, &vArchitecture);
  VariantClear(&vArchitecture);

  //VARIANT vRequiredArchicture;
  //VariantInit(&vRequiredArchicture);
  //V_VT(&vRequiredArchicture) = VT_BOOL;
  //V_BOOL(&vRequiredArchicture) = VARIANT_TRUE;
  //hres = pContext->SetValue(_bstr_t(L"__RequiredArchitecture"), 0, &vRequiredArchicture);
  //VariantClear(&vRequiredArchicture);

  IWbemServices *pSvc = NULL;

  hres = pLoc->ConnectServer(
     _bstr_t(L"root\\Microsoft\\SqlServer\\ComputerManagement10"), // Object path of WMI namespace
     NULL,                    // User name. NULL = current user
     NULL,                    // User password. NULL = current
     0,                       // Locale. NULL indicates current
     NULL,                    // Security flags.
     0,                       // Authority (for example, Kerberos)
     pContext,               // Context object 
     &pSvc                    // pointer to IWbemServices proxy
     );

RequiredArchitecture のブロックはテストされておらず、不要のようです。PS: エラー処理を改善する必要があります!

于 2013-03-26T07:30:51.783 に答える
0

http://msdn.microsoft.com/en-us/library/windows/desktop/aa393067(v=vs.85).aspxを見て、 "__RequiredArchitecture" = TRUE も設定してみましたか?

また、最初に同じコードが示すように (つまり、64 ビットから 32 ビットに) 動作させるようにしなければなりませんか?

于 2012-10-03T16:58:41.737 に答える