我一直在尝试按照以下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位注册表项。
我做错了什么? 提前感谢您的时间。
答案 0 :(得分: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:错误处理需要改进!
答案 1 :(得分:0)
还必须尝试以相同代码显示(即64位到32位)的方式使其工作吗?