我一直在尝试按照以下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 位注册表项。
我究竟做错了什么?在此先感谢您的时间。