내보낸 DLL 함수 시작 지점
DLL의 내보낸 함수의 경우 AFX_MANAGE_STATE 매크로를 사용하여 DLL 모듈에서 호출 애플리케이션의 DLL로 전환할 때 적절한 전역 상태를 기본.
호출되면 이 매크로는 모듈에 대한 전역 데이터가 포함된 구조체에 대한 포인터 AFX_MODULE_STATE
를 함수의 포함하는 범위의 re기본der에 대한 유효 모듈 상태로 설정합니다pModuleState
. 매크로가 포함된 범위를 벗어나면 이전 유효 모듈 상태가 자동으로 복원됩니다.
이 전환은 스택에 클래스의 인스턴스를 AFX_MODULE_STATE
생성하여 수행됩니다. 해당 생성자에서 이 클래스는 현재 모듈 상태에 대한 포인터를 가져와서 멤버 변수에 저장한 다음, 새 유효 모듈 상태로 설정합니다 pModuleState
. 소멸자에서 이 클래스는 멤버 변수에 저장된 포인터를 유효 모듈 상태로 복원합니다.
DLL에서 대화 상자를 시작하는 함수와 같이 내보낸 함수가 있는 경우 함수의 시작 부분에 다음 코드를 추가해야 합니다.
AFX_MANAGE_STATE(AfxGetStaticModuleState())
이렇게 하면 현재 모듈 상태를 AfxGetStaticModuleState에서 반환된 상태로 현재 범위가 끝날 때까지 바꿉니다.
매크로를 사용하지 않으면 DLL의 AFX_MANAGE_STATE
리소스에 문제가 발생합니다. 기본적으로 MFC는 기본 애플리케이션의 리소스 핸들을 사용하여 리소스 템플릿을 로드합니다. 이 템플릿은 실제로 DLL에 저장됩니다. 근본 원인은 MFC의 모듈 상태 정보가 매크로에 의해 전환되지 않았기 때문에 AFX_MANAGE_STATE
발생합니다. 리소스 핸들은 MFC의 모듈 상태에서 복구됩니다. 모듈 상태를 전환하지 않으면 잘못된 리소스 핸들이 사용됩니다.
AFX_MANAGE_STATE
는 DLL의 모든 함수에 넣을 필요가 없습니다. 예를 들어 InitInstance
MFC가 모듈 상태를 자동으로 이전 InitInstance
상태로 이동한 다음 반환 후 InitInstance
다시 전환하기 때문에 애플리케이션 AFX_MANAGE_STATE
의 MFC 코드에서 호출할 수 있습니다. 모든 메시지 맵 처리기에서도 마찬가지입니다. 일반 MFC DLL에는 메시지를 라우팅하기 전에 모듈 상태를 자동으로 전환하는 특수 마스터 창 프로시저가 있습니다.