Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在从DLL创建的CDialog中的常用控件上启用视觉样式?_C++_Winapi_Dll_Mfc_Common Controls - Fatal编程技术网

C++ 如何在从DLL创建的CDialog中的常用控件上启用视觉样式?

C++ 如何在从DLL创建的CDialog中的常用控件上启用视觉样式?,c++,winapi,dll,mfc,common-controls,C++,Winapi,Dll,Mfc,Common Controls,我有一个DLL,可以使用以下MFC代码显示对话框窗口: void ShowMyDialog() { BOOL bInitted = SUCCEEDED(::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)); INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.d

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

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:


但还是没有雪茄。我在这里遗漏了什么?

我认为这行不通。当AppWizard生成一个项目时,当它包含公共控件6时,它会使用类似于以下内容的杂注:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
如果在EXE中嵌入了清单,则清单加载器默认加载清单时,其ID必须为0。你有其他身份证,所以你不可能成功

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


另外,在InitInstance()方法中,作为附带注释,调用AfxOleInit(),而不是在ShowMyDialog()函数中调用CoInitializeEx()。我还将AfxEnableControlContainer()放在initInAsance()中。当然,它必须在调用ShowMyDialog()之前完成。

资源ID 123来自“使用控制面板中的ComCtl32版本6或由RunDll32.exe运行的DLL”一节。如果此DLL是控制面板页,则123是必需的。如果这是由rundll32.DLL运行的DLL。OP明确地说他们正在制作一个DLL,所以尽管你关于可执行文件的建议是正确的,但它并没有回答这个问题。我在上面的评论中提供了更多的指导。@andlabs:嗯,我无法控制这个DLL可以加载到哪个进程。@c00000fd这与DLL加载到哪个进程无关;这是关于DLL的预期用例是什么。预期用例是什么?您阅读的部分,我认为您阅读它是偶然的,因为部分名称同样不好,是关于拟由控制面板系统或rundll32.dll运行的dll。我不知道Windows中有任何东西要求您使用rundll32.dll…@andlabs:哦,那么您的意思是,要应用视觉样式,加载程序会在进程中查找,而不是我的清单文件dll,哈?所以我必须为一个特定的进程定制它,我不能仅仅假设“任何进程”都可以加载我的DLL。对吗?@c0000fd不,我是说你的DLL的加载方式取决于加载它的内容。如果您只是编写一个加载到大多数程序中的DLL,那么USE123下面一节中关于隔离意识的部分适用于您。但是如果您正在编写控制面板页面,那么关于使用资源ID 123的部分适用于您,因为控制面板页面的加载方式不同。我不是Windows团队成员,所以我不知道如何或为什么。那么,您是在编写控制面板页面,还是在为特定应用程序编写DLL?如果是,那么哪个?资源ID 123来自“在控制面板中使用ComCtl32版本6或运行DLL32.exe的DLL”部分。此DLL是控制面板页吗?如果是这样的话,那么123是必要的,还有其他一些问题。如果这是由rundll32.DLL运行的DLL。如果这两个都不正确,那么您看到的是错误的部分。您可能希望“向扩展、插件、MMC管理单元或进程中引入的DLL添加视觉样式支持”。是的,我同意这些节名不好。@Davidsheffernan:谢谢您指出这一点。哇!谁会想到人们需要使用那些
CreateActCtx
API?如果你使用的是原始Win32,那么你可以通过启用
ISOLATION\u-AWARE\u-ENABLED
而逃脱惩罚,但我认为MFC不会因此而上当。