DLL을 관리하기 위한 매크로 및 함수

이름 설명
AFX_EXT_CLASS] 클래스를 내보냅니다.
AFX_MANAGE_STATE DLL에서 내보낸 함수를 보호합니다.
AfxOleInitModule MFC에 동적으로 연결된 일반 MFC DLL에서 OLE 지원을 제공합니다.
AfxNetInitModule MFC에 동적으로 연결된 일반 MFC DLL에서 MFC 소켓 지원을 제공합니다.
AfxGetAmbientActCtx 모듈별 상태 플래그의 현재 상태를 가져옵니다.
AfxGetStaticModuleState 초기화 전에 모듈 상태를 설정하고 클린 후 이전 모듈 상태를 복원합니다.
AfxInitExtensionModule DLL을 초기화합니다.
AfxSetAmbientActCtx MFC의 WinSxS 동작에 영향을 주는 모듈별 상태 플래그를 설정합니다.
AfxTermExtensionModule 각 프로세스가 DLL에서 분리되면 MFC에서 MFC 확장 DLL을 클린 수 있습니다.

AFX_EXT_CLASS

MFC 확장 DLL은 매크로 AFX_EXT_CLASS 를 사용하여 클래스를 내보냅니다. MFC 확장 DLL에 연결되는 실행 파일은 매크로를 사용하여 클래스를 가져옵니다.

설명

매크로를 AFX_EXT_CLASS 사용하면 MFC 확장 DLL을 빌드하는 데 사용되는 동일한 헤더 파일을 DLL에 연결하는 실행 파일과 함께 사용할 수 있습니다.

DLL의 헤더 파일에서 다음과 같이 클래스 선언에 키워드(keyword) 추가 AFX_EXT_CLASS 합니다.

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

자세한 내용은 다음을 사용하여 내보내기 및 가져오기를 AFX_EXT_CLASS참조하세요.

요구 사항

헤더:<afxv_dll.h>

AFX_MANAGE_STATE

이 매크로를 호출하여 DLL에서 내보낸 함수를 보호합니다.

구문

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

매개 변수

pModuleState
구조체에 대한 포인터입니다 AFX_MODULE_STATE .

설명

이 매크로가 호출될 pModuleState 때 즉시 포함된 범위의 나머지 부분에 대한 유효 모듈 상태입니다. 범위를 벗어나면 이전 유효 모듈 상태가 자동으로 복원됩니다.

구조체에는 AFX_MODULE_STATE 모듈에 대한 전역 데이터, 즉 푸시되거나 팝된 모듈 상태의 일부가 포함됩니다.

기본적으로 MFC는 기본 애플리케이션의 리소스 핸들을 사용하여 리소스 템플릿을 로드합니다. DLL에서 대화 상자를 시작하는 함수와 같이 DLL에 내보낸 함수가 있는 경우 리소스 템플릿은 DLL 모듈에 저장됩니다. 올바른 핸들을 사용할 모듈 상태를 전환해야 합니다. 함수의 시작 부분에 다음 코드를 추가하여 상태를 전환할 수 있습니다.

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

이 매크로는 현재 모듈 상태를 현재 범위의 끝까지 반환된 AfxGetStaticModuleState 상태로 바꿉니다.

모듈 상태 및 MFC에 대한 자세한 내용은 MFC 모듈Technical Note 58의 상태 데이터 관리를 참조하세요.

참고 항목

MFC는 어셈블리에 대한 활성화 컨텍스트를 만들 때 컨텍스트를 만들고 활성화하고 AFX_MANAGE_STATE 비활성화하는 데 사용합니다AfxWinInit. 또한 MFC 코드가 AFX_MANAGE_STATE 사용자 DLL에서 선택한 적절한 활성화 컨텍스트에서 실행되도록 허용하기 위해 정적 MFC 라이브러리 및 MFC DLL에 대해 사용하도록 설정됩니다. 자세한 내용은 MFC 모듈 상태의 활성화 컨텍스트 지원을 참조하세요.

요구 사항

헤더:<afxstat_.h>

AfxOleInitModule

MFC에 동적으로 연결된 일반 MFC DLL에서 OLE 지원을 받으려면 일반 MFC DLL 함수 CWinApp::InitInstance 에서 이 함수를 호출하여 MFC OLE DLL을 초기화합니다.

구문

void AFXAPI AfxOleInitModule( );

설명

MFC OLE DLL은 MFC 확장 DLL입니다. MFC 확장 DLL이 체인에 CDynLinkLibrary 연결되려면 이를 사용할 모든 모듈의 컨텍스트에서 개체를 만들어야 CDynLinkLibrary 합니다. AfxOleInitModuleCDynLinkLibrary 는 일반 MFC DLL의 개체 체인에 연결되도록 일반 MFC DLL의 컨텍스트에서 CDynLinkLibrary 개체를 만듭니다.

OLE 컨트롤을 빌드하고 사용 COleControlModule중인 경우 호출에 대한 COleControlModuleAfxOleInitModule멤버 함수 때문에 InitInstance 호출 AfxOleInitModule 하면 안 됩니다.

요구 사항

헤더: <afxdll_.h>

AfxNetInitModule

MFC에 동적으로 연결된 일반 MFC DLL의 MFC 소켓 지원을 위해 일반 MFC DLL 함수 CWinApp::InitInstance 에서 이 함수에 대한 호출을 추가하여 MFC 소켓 DLL을 초기화합니다.

구문

void AFXAPI AfxNetInitModule( );

설명

MFC 소켓 DLL은 MFC 확장 DLL입니다. MFC 확장 DLL이 체인에 CDynLinkLibrary 연결되려면 이를 사용할 모든 모듈의 컨텍스트에서 개체를 만들어야 CDynLinkLibrary 합니다. AfxNetInitModuleCDynLinkLibrary 는 일반 MFC DLL의 개체 체인에 연결되도록 일반 MFC DLL의 컨텍스트에서 CDynLinkLibrary 개체를 만듭니다.

요구 사항

헤더:<afxdll_.h>

AfxGetAmbientActCtx

이 함수를 사용하여 MFC의 WinSxS 동작에 영향을 주는 모듈별 상태 플래그의 현재 상태를 가져옵니다.

구문

BOOL AFXAPI AfxGetAmbientActCtx();

Return Value

모듈 상태 플래그 현재 값입니다.

설명

플래그가 설정되고(기본값) 스레드가 MFC 모듈에 들어가면(참조 AFX_MANAGE_STATE) 모듈의 컨텍스트가 활성화됩니다.

플래그가 설정되지 않으면 모듈의 컨텍스트가 항목에서 활성화되지 않습니다.

모듈의 컨텍스트는 종종 모듈 리소스에 포함된 매니페스트에서 결정됩니다.

요구 사항

헤더:<afxcomctl32.h>

AfxGetStaticModuleState

초기화 전에 모듈 상태를 설정하고 클린 후 이전 모듈 상태를 복원하려면 이 함수를 호출합니다.

구문

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

Return Value

구조체에 대한 포인터입니다 AFX_MODULE_STATE .

설명

구조체에는 AFX_MODULE_STATE 모듈에 대한 전역 데이터, 즉 푸시되거나 팝된 모듈 상태의 일부가 포함됩니다.

기본적으로 MFC는 기본 애플리케이션의 리소스 핸들을 사용하여 리소스 템플릿을 로드합니다. DLL에서 대화 상자를 시작하는 함수와 같이 DLL에 내보낸 함수가 있는 경우 리소스 템플릿은 DLL 모듈에 저장됩니다. 올바른 핸들을 사용할 모듈 상태를 전환해야 합니다. 함수의 시작 부분에 다음 코드를 추가하여 상태를 전환할 수 있습니다.

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

이 매크로는 현재 모듈 상태를 현재 범위의 끝까지 반환된 AfxGetStaticModuleState 상태로 바꿉니다.

모듈 상태 및 MFC에 대한 자세한 내용은 MFC 모듈Technical Note 58의 상태 데이터 관리를 참조하세요.

요구 사항

헤더:<afxstat_.h>

AfxInitExtensionModule

MFC 확장 DLL DllMain 에서 이 함수를 호출하여 DLL을 초기화합니다.

구문

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state,  HMODULE hModule );

매개 변수

state
초기화 후 MFC 확장 DLL 모듈의 상태를 포함하는 Structure 구조체에 대한 참조 AFX_EXTENSION_MODULE 입니다. 상태에는 MFC 확장 DLL에 의해 입력되기 전에 DllMain 실행된 일반 정적 개체 생성의 일부로 초기화된 런타임 클래스 개체의 복사본이 포함됩니다.

hModule
MFC 확장 DLL 모듈의 핸들입니다.

Return Value

TRUEMFC 확장 DLL이 성공적으로 초기화되면 이고, 그렇지 않으면 . FALSE

설명

예시:

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Initializing!\n");

        // MFC extension DLL one-time initialization
        if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
            return 0;
...

AfxInitExtensionModule는 DLL의 HMODULE 복사본을 만들고 나중에 개체를 만들 때 CDynLinkLibrary 사용할 DLL의 런타임 클래스(CRuntimeClass구조) 및 해당 개체 팩터리(COleObjectFactory개체)도 캡처합니다. MFC 확장 DLL은 함수에서 DllMain 다음 두 가지 작업을 수행해야 합니다.

각 프로세스가 MFC 확장 DLL에서 분리될 때(프로세스가 종료되거나 DLL이 호출에 의해 AfxFreeLibrary 언로드될 때) MFC 확장 DLL을 클린 호출 AfxTermExtensionModule 할 수 있습니다.

요구 사항

헤더:<afxdll_.h>

AfxSetAmbientActCtx

MFC의 WinSxS 동작에 영향을 주는 모듈별 상태 플래그를 설정하려면 이 함수를 사용합니다.

구문

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

매개 변수

bSet
모듈 상태 플래그의 새 값입니다.

설명

플래그가 설정되고(기본값) 스레드가 MFC 모듈에 들어가면(참조 AFX_MANAGE_STATE) 모듈의 컨텍스트가 활성화됩니다. 플래그가 설정되지 않으면 모듈의 컨텍스트가 항목에서 활성화되지 않습니다. 모듈의 컨텍스트는 종종 모듈 리소스에 포함된 매니페스트에서 결정됩니다.

예시

BOOL CMFCListViewApp::InitInstance()
{
   AfxSetAmbientActCtx(FALSE);
   // Remainder of function definition omitted.
}

요구 사항

헤더:<afxcomctl32.h>

AfxTermExtensionModule

각 프로세스가 DLL에서 분리될 때(프로세스가 종료되거나 DLL이 호출에 의해 언로드될 때) MFC가 MFC 확장 DLL을 클린 수 있도록 이 함수를 AfxFreeLibrary 호출합니다.

구문

void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );

매개 변수

state
MFC 확장 DLL 모듈의 상태를 포함하는 구조체에 대한 참조 AFX_EXTENSION_MODULE 입니다.

bAll
TRUE이면 모든 MFC 확장 DLL 모듈을 클린. 그렇지 않으면 현재 DLL 모듈만 클린.

설명

AfxTermExtensionModule 는 모듈에 연결된 로컬 스토리지를 삭제하고 메시지 맵 캐시에서 항목을 제거합니다. 예시:

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Initializing!\n");

        // MFC extension DLL one-time initialization
        if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
            return 0;

        new CMyDynLinkLibrary(NVC_MFC_DLLDLL);

    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Terminating!\n");

        // Terminate the library before destructors are called
        AfxTermExtensionModule(NVC_MFC_DLLDLL);
    }
    return 1;   // ok
}

애플리케이션이 동적으로 MFC 확장 DLL을 로드하고 해제하는 경우 호출 AfxTermExtensionModule해야 합니다. 대부분의 MFC 확장 DLL은 동적으로 로드되지 않으므로(일반적으로 가져오기 라이브러리를 통해 연결됨) 일반적으로 호출 AfxTermExtensionModule 이 필요하지 않습니다.

MFC 확장 DLL은 해당 DllMainDLL에서 호출 AfxInitExtensionModule 해야 합니다. DLL이 개체를 CRuntimeClass 내보내거나 자체 사용자 지정 리소스가 있는 경우 개체를 CDynLinkLibraryDllMain만들어야 합니다.

요구 사항

헤더:<afxdll_.h>

참고 항목

매크로 및 전역
AfxMessageBox
MFC 모듈의 상태 데이터 관리