在hkey_current_user中注册代理/存根



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();
        }
    }
}

最新更新