0

我有一个可以使用以下 MFC 代码显示对话框窗口的 DLL:

void ShowMyDialog()
{
    BOOL bInitted = SUCCEEDED(::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));

    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);
    //InitCommonControls();    //Tried also with just this call

    AfxEnableControlContainer();

    HMODULE hDll = NULL;
    if(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
        (LPCWSTR) ShowMyDialog,
        &hDll) &&
        hDll)
    {
        AfxSetResourceHandle(hDll);

        CMyDialog dl;       //Derived from CDialog
        dl.DoModal();
    }

    if(bInitted)
        ::CoUninitialize();
}

这可行,但显示的对话框没有启用视觉样式:

在此处输入图像描述

我找到了这篇关于如何为 DLL 启用视觉样式的文章。所以我添加了带有建议清单内容的资源文件:

在此处输入图像描述

并给它资源 ID 123:

在此处输入图像描述

但仍然没有雪茄。我在这里想念什么?

4

1 回答 1

1

我认为这行不通。当 AppWizard 生成一个项目时,当它包含 Common 控件 6 时,它使用类似于以下的 pragma:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

当您在 EXE 中嵌入清单时,要使其默认由清单加载器加载,它的 ID 必须为 0。您还有其他 ID,因此您没有机会使其正常工作。

我的简单建议是生成一个测试 MFC App Wizard 应用程序并从该项目复制 #pragma 指令。通常应用程序向导将其放在 stdafx.h 文件中,但您通常可以将其放在您想要的任何源文件中。

此外,作为旁注,在您的 InitInstance() 方法中,调用 AfxOleInit() 而不是在 ShowMyDialog() 函数中调用 CoInitializeEx()。我还将 AfxEnableControlContainer() 也放入 InitInsance() 中。当然,它必须在调用 ShowMyDialog() 之前。

于 2017-01-18T03:36:38.153 回答