Dll을 관리 하기 위한 매크로 및 함수Macros and Functions for Managing DLLs

NameName 설명Description
AFX_EXT_CLASS]AFX_EXT_CLASS] 클래스를 내보냅니다.Exports classes.
AFX_MANAGE_STATEAFX_MANAGE_STATE DLL에서 내보낸 함수를 보호 합니다.Protect an exported function in a DLL.
AfxOleInitModuleAfxOleInitModule MFC에 동적으로 연결 되는 일반 MFC DLL에서 OLE를 지원 합니다.Provides OLE support from a regular MFC DLL that is dynamically linked to MFC.
AfxNetInitModuleAfxNetInitModule MFC에 동적으로 연결 되는 일반 MFC DLL의 MFC 소켓 지원을 제공 합니다.Provides MFC Sockets support from a regular MFC DLL that is dynamically linked to MFC.
AfxGetAmbientActCtxAfxGetAmbientActCtx 모듈별 상태 플래그의 현재 상태를 가져옵니다.Gets the current state of the per-module state flag.
AfxGetStaticModuleStateAfxGetStaticModuleState 초기화 하기 전에 모듈 상태를 설정 하 고 정리 후에 이전 모듈 상태를 복원 합니다.Sets the module state before initialization and/or to restore the previous module state after clean up.
AfxInitExtensionModuleAfxInitExtensionModule DLL을 초기화 합니다.Initializes the DLL.
AfxSetAmbientActCtxAfxSetAmbientActCtx MFC의 WinSxS 동작에 영향을 주는 모듈별 상태 플래그를 설정 합니다.set the per-module state flag, which affects the WinSxS behavior of MFC.
AfxTermExtensionModuleAfxTermExtensionModule 각 프로세스가 DLL에서 분리 될 때 MFC가 mfc 확장명 DLL을 정리할 수 있도록 합니다.Allows MFC to clean up the MFC extension DLL when each process detaches from the DLL.

AFX_EXT_CLASSAFX_EXT_CLASS

MFC 확장 DLL은 AFX_EXT_CLASS 매크로를 사용하여 클래스를 내보냅니다. MFC 확장 DLL에 연결되는 실행 파일은 이 매크로를 사용하여 클래스를 가져옵니다.MFC extension DLLs use the macro AFX_EXT_CLASS to export classes; the executables that link to the MFC extension DLL use the macro to import classes.

설명Remarks

AFX_EXT_CLASS 매크로를 사용 하 여 MFC 확장명 DLL을 빌드하는 데 사용 되는 것과 동일한 헤더 파일을 DLL로 연결 되는 실행 파일과 함께 사용할 수 있습니다.With the AFX_EXT_CLASS macro, the same header file(s) used to build the MFC extension DLL can be used with the executables that link to the DLL.

DLL에 대한 헤더 파일에서 다음과 같이 AFX_EXT_CLASS 키워드를 클래스 선언에 추가합니다.In the header file for your DLL, add the AFX_EXT_CLASS keyword to the declaration of your class as follows:

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

자세한 내용은 AFX_EXT_CLASS를 사용 하 여 내보내기 및 가져오기를 참조 하세요.For more information, see Export and Import Using AFX_EXT_CLASS.

요구 사항Requirements

헤더: afxv_dll. hHeader: afxv_dll.h

AFX_MANAGE_STATEAFX_MANAGE_STATE

DLL에서 내보낸 함수를 보호 하려면이 매크로를 호출 합니다.Call this macro to protect an exported function in a DLL.

구문Syntax

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

매개 변수Parameters

pModuleStatepModuleState
구조체에 대 한 포인터 AFX_MODULE_STATE 입니다.A pointer to an AFX_MODULE_STATE structure.

설명Remarks

이 매크로가 호출 되 면 즉시 포함 하는 범위의 나머지 부분에 대 한 유효한 모듈 상태가 됩니다.When this macro is invoked, pModuleState is the effective module state for the remainder of the immediate containing scope. 범위를 벗어나면 이전 유효 모듈 상태가 자동으로 복원 됩니다.Upon leaving the scope, the previous effective module state will be automatically restored. 구조체에는 모듈 AFX_MODULE_STATE 에 대 한 전역 데이터 즉, 푸시되 나 팝 된 모듈 상태의 일부가 포함 되어 있습니다.The AFX_MODULE_STATE structure contains global data for the module, that is, the portion of the module state that is pushed or popped.

기본적으로 MFC는 주 응용 프로그램의 리소스 핸들을 사용 하 여 리소스 템플릿을 로드 합니다.By default, MFC uses the resource handle of the main application to load the resource template. Dll에서 dll의 대화 상자를 시작 하는 함수와 같은 내보낸 함수가 있는 경우이 템플릿은 실제로 DLL 모듈에 저장 됩니다.If you have an exported function in a DLL, such as one that launches a dialog box in the DLL, this template is actually stored in the DLL module. 사용할 올바른 핸들의 모듈 상태를 전환 해야 합니다.You need to switch the module state for the correct handle to be used. 함수의 시작 부분에 다음 코드를 추가 하 여이 작업을 수행할 수 있습니다.You can do this by adding the following code to the beginning of the function:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

현재 범위 끝까지 AfxGetStaticModuleState 에서 반환 된 상태로 현재 모듈 상태를 바꿉니다.This swaps the current module state with the state returned from AfxGetStaticModuleState until the end of the current scope.

모듈 상태 및 MFC에 대 한 자세한 내용은 새 문서, 창 및 뷰 만들기 의 "MFC 모듈의 상태 데이터 관리" 및 Technical Note 58을 참조 하세요.For more information on module states and MFC, see "Managing the State Data of MFC Modules" in Creating New Documents, Windows, and Views and Technical Note 58.

참고

MFC는 어셈블리에 대 한 활성화 컨텍스트를 만들 때 AfxWinInit 를 사용 하 여 컨텍스트를 만들고 AFX_MANAGE_STATE 활성화 하 고 비활성화 합니다.When MFC creates an activation context for an assembly, it uses AfxWinInit to create the context and AFX_MANAGE_STATE to activate and deactivate it. 또한 mfc AFX_MANAGE_STATE 코드를 사용자 DLL에서 선택한 적절 한 활성화 컨텍스트에서 실행할 수 있도록 Mfc dll 뿐만 아니라 정적 mfc 라이브러리에도이 기능을 사용할 수 있습니다.Note also that AFX_MANAGE_STATE is enabled for static MFC libraries, as well as MFC DLLs, in order to allow MFC code to execute in the proper activation context selected by the User DLL. 자세한 내용은 MFC 모듈 상태의 활성화 컨텍스트 지원을 참조 하세요.For more information, see Support for Activation Contexts in the MFC Module State.

요구 사항Requirements

헤더: afxstat_. hHeader: afxstat_.h

AfxOleInitModule AfxOleInitModule

동적으로 MFC에 링크 된 일반 MFC DLL에서 OLE를 지원 하려면 일반 MFC DLL의 함수에서이 함수를 호출 CWinApp::InitInstance 하 여 MFC OLE dll을 초기화 합니다.For OLE support from a regular MFC DLL that is dynamically linked to MFC, call this function in your regular MFC DLL's CWinApp::InitInstance function to initialize the MFC OLE DLL.

구문Syntax

void AFXAPI AfxOleInitModule( );

설명Remarks

MFC OLE DLL은 MFC 확장명 DLL입니다. MFC 확장 DLL이 체인에 유선으로 연결 되도록 하려면 해당 DLL을 사용 하는 CDynLinkLibrary CDynLinkLibrary 모든 모듈의 컨텍스트에서 개체를 만들어야 합니다.The MFC OLE DLL is an MFC extension DLL; in order for an MFC extension DLL to get wired into a CDynLinkLibrary chain, it must create a CDynLinkLibrary object in the context of every module that will be using it. AfxOleInitModule 일반 mfc dll CDynLinkLibrary CDynLinkLibrary 의 개체 체인에 유선으로 연결 되도록 일반 mfc dll의 컨텍스트에서 개체를 만듭니다.AfxOleInitModule creates the CDynLinkLibrary object in your regular MFC DLL's context so that it gets wired into the CDynLinkLibrary object chain of the regular MFC DLL.

OLE 컨트롤을 빌드하고를 사용 하는 경우 COleControlModule AfxOleInitModule InitInstance 에 대 한 멤버 함수는를 호출 하면 안 됩니다 COleControlModule AfxOleInitModule .If you are building an OLE control and are using COleControlModule, you should not call AfxOleInitModule because the InitInstance member function for COleControlModule calls AfxOleInitModule.

요구 사항Requirements

헤더: <afxdll_.h>Header: <afxdll_.h>

AfxNetInitModuleAfxNetInitModule

Mfc에 동적으로 연결 되는 일반 MFC DLL의 MFC 소켓과 지원에 대 한 일반적인 mfc DLL의 함수에이 함수에 대 한 호출을 추가 CWinApp::InitInstance 하 여 Mfc 소켓 dll을 초기화 합니다.For MFC Sockets support from a regular MFC DLL that is dynamically linked to MFC, add a call to this function in your regular MFC DLL's CWinApp::InitInstance function to initialize the MFC Sockets DLL.

구문Syntax

void AFXAPI AfxNetInitModule( );

설명Remarks

MFC 소켓 DLL은 MFC 확장명 DLL입니다. MFC 확장 DLL이 체인에 유선으로 연결 되도록 하려면 해당 DLL을 사용 하는 CDynLinkLibrary CDynLinkLibrary 모든 모듈의 컨텍스트에서 개체를 만들어야 합니다.The MFC Sockets DLL is an MFC extension DLL; in order for an MFC extension DLL to get wired into a CDynLinkLibrary chain, it must create a CDynLinkLibrary object in the context of every module that will be using it. AfxNetInitModule 일반 mfc dll CDynLinkLibrary CDynLinkLibrary 의 개체 체인에 유선으로 연결 되도록 일반 mfc dll의 컨텍스트에서 개체를 만듭니다.AfxNetInitModule creates the CDynLinkLibrary object in your regular MFC DLL's context so that it gets wired into the CDynLinkLibrary object chain of the regular MFC DLL.

요구 사항Requirements

헤더:<afxdll_.h>Header: <afxdll_.h>

AfxGetAmbientActCtxAfxGetAmbientActCtx

이 함수를 사용 하 여 MFC의 WinSxS 동작에 영향을 주는 모듈별 상태 플래그의 현재 상태를 가져옵니다.Use this function to get the current state of the per-module state flag, which affects the WinSxS behavior of MFC.

구문Syntax

BOOL AFXAPI AfxGetAmbientActCtx();

Return ValueReturn Value

모듈 상태 플래그 현재 값입니다.Module state flag current value.

설명Remarks

플래그가 설정 되 고 (기본값) 스레드가 MFC 모듈로 들어가면 ( AFX_MANAGE_STATE참조) 모듈의 컨텍스트가 활성화 됩니다.When the flag is set (which is the default) and a thread enters an MFC module (see AFX_MANAGE_STATE), the context of the module is activated.

플래그를 설정 하지 않으면 모듈의 컨텍스트가 항목에서 활성화 되지 않습니다.If the flag is not set, the context of the module is not activated on entry.

모듈의 컨텍스트는 일반적으로 모듈 리소스에 포함 된 매니페스트에서 결정 됩니다.The context of a module is determined from its manifest, usually embedded in module resources.

요구 사항Requirements

헤더: afxcomctl32.hHeader: afxcomctl32.h

AfxGetStaticModuleStateAfxGetStaticModuleState

초기화 전에 모듈 상태를 설정 하거나 정리 후 이전 모듈 상태를 복원 하려면이 함수를 호출 합니다.Call this function to set the module state before initialization and/or to restore the previous module state after clean up.

구문Syntax

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

Return ValueReturn Value

구조체에 대 한 포인터 AFX_MODULE_STATE 입니다.A pointer to an AFX_MODULE_STATE structure.

설명Remarks

구조체에는 모듈 AFX_MODULE_STATE 에 대 한 전역 데이터 즉, 푸시되 나 팝 된 모듈 상태의 일부가 포함 되어 있습니다.The AFX_MODULE_STATE structure contains global data for the module, that is, the portion of the module state that is pushed or popped.

기본적으로 MFC는 주 응용 프로그램의 리소스 핸들을 사용 하 여 리소스 템플릿을 로드 합니다.By default, MFC uses the resource handle of the main application to load the resource template. Dll에서 dll의 대화 상자를 시작 하는 함수와 같은 내보낸 함수가 있는 경우이 템플릿은 실제로 DLL 모듈에 저장 됩니다.If you have an exported function in a DLL, such as one that launches a dialog box in the DLL, this template is actually stored in the DLL module. 사용할 올바른 핸들의 모듈 상태를 전환 해야 합니다.You need to switch the module state for the correct handle to be used. 함수의 시작 부분에 다음 코드를 추가 하 여이 작업을 수행할 수 있습니다.You can do this by adding the following code to the beginning of the function:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

현재 범위의 끝까지 현재 모듈 상태를에서 반환 된 상태로 바꿉니다 AfxGetStaticModuleState .This swaps the current module state with the state returned from AfxGetStaticModuleState until the end of the current scope.

모듈 상태 및 MFC에 대 한 자세한 내용은 새 문서, 창 및 뷰 만들기 의 "MFC 모듈의 상태 데이터 관리" 및 Technical Note 58을 참조 하세요.For more information on module states and MFC, see "Managing the State Data of MFC Modules" in Creating New Documents, Windows, and Views and Technical Note 58.

요구 사항Requirements

헤더: afxstat_. hHeader: afxstat_.h

AfxInitExtensionModuleAfxInitExtensionModule

MFC 확장 DLL에서이 함수 DllMain 를 호출 하 여 dll을 초기화 합니다.Call this function in an MFC extension DLL's DllMain to initialize the DLL.

구문Syntax

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

매개 변수Parameters

상태state
초기화 후 MFC 확장 DLL 모듈의 상태를 포함 하는 AFX_EXTENSION_MODULE structure 구조체에 대 한 참조입니다.A reference to the AFX_EXTENSION_MODULE Structure structure that will contain the state of the MFC extension DLL module after the initialization. 상태에는를 입력 하기 전에 실행 되는 일반 정적 개체 생성의 일부로 MFC 확장 DLL에 의해 초기화 된 런타임 클래스 개체의 복사본이 포함 됩니다 DllMain .The state includes a copy of the runtime class objects that have been initialized by the MFC extension DLL as part of normal static object construction executed before DllMain is entered.

hModulehModule
MFC 확장 DLL 모듈의 핸들입니다.A handle of the MFC extension DLL module.

반환 값Return Value

MFC 확장 DLL이 성공적으로 초기화 되었으면 TRUE이 고, 그렇지 않으면 FALSE입니다.TRUE if the MFC extension DLL is successfully initialized; otherwise, FALSE.

설명Remarks

예를 들어:For example:

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL = { NULL, NULL };
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 복사본을 만들고 DLL의 런타임 클래스 (구조체) 뿐만 아니라 개체를 CRuntimeClass COleObjectFactory 만들 때 나중에 사용할 수 있도록 해당 개체 팩터리 (개체)를 캡처합니다 CDynLinkLibrary .AfxInitExtensionModule makes a copy of the DLL's HMODULE and captures the DLL's runtime-classes (CRuntimeClass structures) as well as its object factories (COleObjectFactory objects) for use later when the CDynLinkLibrary object is created. MFC 확장 Dll은 함수에서 다음 두 가지 작업을 수행 해야 합니다 DllMain .MFC extension DLLs need to do two things in their DllMain function:

AfxTermExtensionModule를 호출 하 여 각 프로세스가 mfc 확장명 dll에서 분리 될 때 (프로세스가 종료 될 때 또는 호출의 결과로 DLL이 언로드될 때 발생) mfc 확장명 dll을 정리할 수 있습니다 AfxFreeLibrary .You can call AfxTermExtensionModule to clean up the MFC extension DLL when each process detaches from the MFC extension DLL (which happens when the process exits, or when the DLL is unloaded as a result of an AfxFreeLibrary call).

요구 사항Requirements

헤더: afxdll_. hHeader: afxdll_.h

AfxSetAmbientActCtxAfxSetAmbientActCtx

이 함수를 사용 하 여 MFC의 WinSxS 동작에 영향을 주는 모듈별 상태 플래그를 설정 합니다.Use this function to set the per-module state flag, which affects the WinSxS behavior of MFC.

구문Syntax

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

매개 변수Parameters

bSetbSet
모듈 상태 플래그의 새 값입니다.New value of the module state flag.

설명Remarks

플래그가 설정 되 고 (기본값) 스레드가 MFC 모듈로 들어가면 ( AFX_MANAGE_STATE참조) 모듈의 컨텍스트가 활성화 됩니다.When the flag is set (which is the default) and a thread enters an MFC module (see AFX_MANAGE_STATE), the context of the module is activated. 플래그를 설정 하지 않으면 모듈의 컨텍스트가 항목에서 활성화 되지 않습니다.If the flag is not set, the context of the module is not activated on entry. 모듈의 컨텍스트는 일반적으로 모듈 리소스에 포함 된 매니페스트에서 결정 됩니다.The context of a module is determined from its manifest, usually embedded in module resources.

예제Example

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

요구 사항Requirements

헤더: afxcomctl32.hHeader: afxcomctl32.h

AfxTermExtensionModuleAfxTermExtensionModule

각 프로세스가 DLL에서 분리 될 때 (프로세스가 종료 될 때, 또는 호출 결과로 DLL이 언로드될 때) MFC가 MFC 확장명 DLL을 정리할 수 있도록 하려면이 함수를 호출 AfxFreeLibrary 합니다.Call this function to allow MFC to clean up the MFC extension DLL when each process detaches from the DLL (which happens when the process exits, or when the DLL is unloaded as a result of a AfxFreeLibrary call).

구문Syntax

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

매개 변수Parameters

상태state
MFC 확장 DLL 모듈의 상태를 포함 하는 AFX_EXTENSION_MODULE 구조체에 대 한 참조입니다.A reference to the AFX_EXTENSION_MODULE structure that contains the state of MFC extension DLL module.

공을bAll
TRUE 이면 모든 MFC 확장 DLL 모듈을 정리 합니다.If TRUE, clean up all MFC extension DLL modules. 그렇지 않으면 현재 DLL 모듈만 정리 합니다.Otherwise, clean up only the current DLL module.

설명Remarks

AfxTermExtensionModule 는 모듈에 연결 된 모든 로컬 저장소를 삭제 하 고 메시지 맵 캐시에서 모든 항목을 제거 합니다.AfxTermExtensionModule will delete any local storage attached to the module and remove any entries from the message map cache. 예를 들어:For example:

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL = { NULL, NULL };
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 합니다.If your application loads and frees MFC extension DLLs dynamically, be sure to call AfxTermExtensionModule. 대부분의 MFC 확장명 Dll은 동적으로 로드 되지 않으므로 (일반적으로 해당 가져오기 라이브러리를 통해 연결 됨)에 대 한 호출은 AfxTermExtensionModule 일반적으로 필요 하지 않습니다.Since most MFC extension DLLs are not dynamically loaded (usually, they are linked via their import libraries), the call to AfxTermExtensionModule is usually not necessary.

MFC 확장 Dll은에서 AfxInitExtensionModule 를 호출 해야 DllMain 합니다.MFC extension DLLs need to call AfxInitExtensionModule in their DllMain. DLL이 CRuntimeClass 개체를 내보내거나 자체 사용자 지정 리소스가 있는 경우 CDynLinkLibrary 에도에서 개체를 만들어야 DllMain 합니다.If the DLL will be exporting CRuntimeClass objects or has its own custom resources, you also need to create a CDynLinkLibrary object in DllMain.

요구 사항Requirements

헤더: afxdll_. hHeader: afxdll_.h

참고 항목See also

매크로 및 전역Macros and Globals
AfxMessageBoxAfxMessageBox
MFC 모듈의 상태 데이터 관리Managing the State Data of MFC Modules