MIDL编译器为代理/存根的代码带有注册例程,这些例程写入hkey_local_machine。有什么方法(最好是不黑客入侵MIDL生成的代码,而不绕过所有生成代码以自定义代码的代码)在HKEY_CURRENT_USER中注册MIDL生成的P/S?
另外:如果P/S和COM服务器都是这样注册的?我刚刚发现(经过非常令人沮丧的48小时之后),如果COM服务器已注册,则P/S注册机器在整个机器范围内无法正常工作。具体来说,在这种情况下,P/S的异步呼叫逻辑(ICAllFactory :: CreateCall)将失败。
使用regoverridePredefkey是正确的答案。然后注册:
regsvr32 /n /i:user C:srcmyCode.dll
使用"/i:用户" regsvr32调用您的" dllinstall"功能而不是dllregisterserver。
dllinstall的实现:
extern "C" STDAPI DllInstall(BOOL bInstall, _In_opt_ LPCWSTR pszCmdLine)
{
HRESULT hr = E_FAIL;
static const wchar_t szUserSwitch[] = L"user";
if (pszCmdLine != NULL)
{
if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0)
{
ATL::AtlSetPerUserRegistration(true); // is this really needed??
}
}
LSTATUS status = RegCreateKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\Classes", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hkcu_classes, &disposition);
if (status == ERROR_SUCCESS)
{
status = RegOverridePredefKey(HKEY_CLASSES_ROOT, hkcu_classes);
}
hr = HRESULT_FROM_NT(status);
if (SUCCEEDED(hr))
{
if (bInstall)
{
hr = DllRegisterServer();
if (FAILED(hr))
{
DllUnregisterServer();
}
}
else
{
hr = DllUnregisterServer();
}
}
}