3

我一直在尝试按照以下MSDN 教程从 32 位应用程序中查询 64 位注册表提供程序。

可悲的是,这些示例都是用 VB 编写的,我遇到了一些问题。

对于 C++ 开发人员,文章提到...

C++ 应用程序可以使用 IWbemContext 接口和 IWbemServices::ExecMethod 将非默认提供程序的使用传达给 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 回答