【发布时间】:2012-05-28 22:58:37
【问题描述】:
我一直在尝试按照以下MSDN tutorial 从 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 位注册表项。
我做错了什么? 提前感谢您的宝贵时间。
【问题讨论】:
标签: c++ windows visual-c++ wmi