2017-01-18 2 views
0

나는 다음 MFC 코드를 사용하여 대화 상자를 표시 할 수있는 DLL이이 작동DLL에서 만든 CDialog의 공용 컨트롤에 시각적 스타일을 설정하는 방법은 무엇입니까?

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

,하지만 비주얼 스타일이없는 같은 대화 상자가 활성화 :

enter image description here

I을 DLL에 시각적 스타일을 사용하는 방법에 대해 this article을 찾았습니다. 그래서 제안 매니페스트 내용으로 리소스 파일 추가 :

enter image description here

을하고 (123)의 ID 자원 주었다

enter image description here

하지만 여전히 시가. 내가 여기서 무엇을 놓치고 있니?

+0

리소스 ID 123은 "제어판에서 ComCtl32 버전 6을 사용하거나 RunDll32.exe로 실행되는 DLL"섹션에서 가져옵니다. 이 DLL이 제어판 페이지입니까? 그렇다면 123이 필요하고 다른 것이 잘못되었습니다. rundll32.dll에 의해 실행되는 DLL 인 경우 [정상적인 일반 프로그램으로 변환해야합니다] (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). 둘 중 어느 것도 맞지 않으면 잘못된 부분을보고있는 것입니다. 대신 "확장, 플러그인, MMC 스냅인 또는 프로세스로 가져온 DLL에 시각적 스타일 지원 추가"가 필요할 것입니다. – andlabs

+0

예, 해당 섹션 이름이 좋지 않다고 동의합니다. – andlabs

+0

@DavisHeffernan : 지적 해 주셔서 감사합니다. 와우. 누가 그 CreateActCtx API를 사용해야한다고 생각했을까요? – c00000fd

답변

0

나는 그것이 효과가 있다고 생각하지 않습니다. 응용 프로그램 마법사에서 프로젝트를 생성 할 때이 공통 컨트롤 (6)를 포함 할 때, 그것은이 유사한 프라그 마를 사용

#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 응용 프로그램 마법사 응용 프로그램을 생성하고 해당 프로젝트에서 #pragma 지시어를 복사하는 것입니다. 일반적으로 응용 프로그램 마법사는 stdafx.h 파일에 저장하지만 일반적으로 원하는 모든 소스 파일에 넣을 수 있습니다.

또한 SideInstance() 메서드에서 ShowMyDialog() 함수에서 CoInitializeEx()를 호출하는 대신 AfxOleInit() 메서드를 호출하십시오. 나는 또한 AfxEnableControlContainer()를 InitInsance()에 넣을 것이다. 물론 ShowMyDialog()가 호출되기 전에 반드시 있어야합니다.

+0

리소스 ID 123은 "제어판에서 ComCtl32 버전 6을 사용하거나 RunDll32.exe로 실행되는 DLL"섹션에서 가져옵니다. 이 DLL이 제어판 페이지이면 123이 필요합니다. rundll32.dll에 의해 실행되는 DLL 인 경우 [정상적인 일반 프로그램으로 변환해야합니다] (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). OP는 구체적으로 DLL을 만들고 있다고 말 했으므로 실행 파일에 대한 조언이 정확하지만 질문에는 대답하지 않습니다. 나는 더 많은 지침으로 위에서 언급했다. – andlabs

+0

@andlabs : 음,이 DLL을로드 할 수있는 프로세스를 제어 할 수 없습니다. – c00000fd

+0

@ c00000fd 이것은 DLL이로드되는 프로세스가 아닙니다. 그것은 DLL의 의도 된 유스 케이스가 무엇인지에 관한 것입니다. 의도 한 유스 케이스는 무엇입니까?읽은 부분이고 섹션 이름이 잘못 되었기 때문에 우연히 읽은 것으로 가정합니다. * 제어판 시스템이나 rundll32.dll에서 * 실행하려는 * DLL에 대한 것입니다. 나는 Windows에서 rundll32.dll을 사용해야하는 어떤 것도 알지 못합니다 ... – andlabs

관련 문제