2012-01-30 8 views
12

많은 모달 대화 상자를 사용했으며 AFX_MANAGE_STATE을 사용하지 않아도 정상적으로 작동했지만 최근에 다른 리소스를 가진 프로젝트에서 작업하고있었습니다. dll. 나는 웹 서핑을하고 위의 라인을 발견하고 다이얼로그를 시작하기 전에 그것을 삽입했을 때 작동했다. 아마 우리가 다른 dll을 가지고 있기 때문에 대화 상자를 시작하기 위해 주 dll의 상태를로드해야하지만 확실하지 않습니다. 인터넷 어디서나 좋은 설명을 찾을 수 없었습니다. 아무도 간단한 용어로 설명해 주시겠습니까 AFX_MANAGE_STATE 그리고 왜 갑자기 그것을 사용했다.AFX_MANAGE_STATE (AfxGetStaticModuleState())가 정확히 수행하는 작업

감사합니다.

+0

MFC 모듈 상태 구현 Microsoft 기술 자료 058에는 AFX_MANAGE_STATE 사용에 대한 몇 가지 추가 정보가 있습니다. https://msdn.microsoft.com/en-us/library/vstudio/ft1t4bbc(v=vs.100).aspx 약간 날짜가있을 수 있지만. –

답변

17

모든 .exe 및 .dll에는 대화 상자 및 기타 리소스를 가리키는 내부 리소스 핸들이 있습니다. DLL에서 함수를 호출하면 현재 리소스 핸들이 .exe의 리소스를 가리키고 있으며 이는 잘못되어 DLL의 리소스로 변경해야합니다.

이것은 AFX_MANAGE_STATE입니다.

14

은 리소스 기능을 호출하는 매크로이므로 특정 DLL이 아니라이 DLL에서만 조회되며 특정 함수가 호출되는 DLL은 제외됩니다. 이 매크로는 또한 AFX_MAINTAIN_STATE 클래스를 스택에 넣습니다. 이 클래스는 함수가 끝나면 리소스 조회를 다시 설정하므로이 내 보낸 함수를 호출 한 EXE/DLL에서 리소스 검색을 다시 가져옵니다. C++ 측면에서

:이 매크로의

int GetSomething() 
{ 
     SetResourceSearchingToThisDLL(); 

     AFX_MAINTAIN_STATE state_RAII; 

     //Use resource 

     // Compiler will put destroctor call for state_RAII object here 
     // which will mean AFX_MAINTAIN_STATE::~AFX_MAINTAIN_STATE() 
     // And that would call something like: 
     ResetResourceSearching(); 
} 

사용, 같은 DLL 호출 스택 내에서 늘 사람이 상처 자원 검색 중 가입일 :

// Some exported function that launches GUI or uses other resources 
int GetSomething() 
{ 
    AFX_MANAGE_STATE(); 
    ... 
} 

같은 것을 (정확히)시겠습니까에는 사용 카운터가있어 0에 도달 한 경우에만 호출자 (DLL/EXE 리소스)로 되돌려집니다.

모든 MFC DLL은이 매크로를 사용해야합니다. DLL이 비 MFC 클라이언트에 의해로드 된 경우, C 클라이언트, C++ 콘솔 기반 응용 프로그램, .NET 클라이언트 등일 수 있습니다 (예, MFC Windows 응용 프로그램 클라이언트 일 수도 있음).

EXE와 DLL이 동일한 MFC/컴파일러/링커 버전을 사용하는 MFC로 만들어지고 하나의 CWinApp 개체를 가지고 있다면이 매크로를 사용할 필요가 없습니다.

관련 문제