EXPORTS
함수 또는 데이터의 내보낸 이름이나 서수를 지정하는 하나 이상의 내보내기 정의 섹션에 대해 소개합니다. 각 정의는 별도의 줄에 있어야 합니다.
EXPORTS
definition
설명
첫 번째 정의 는 키워드와 동일한 줄 또는 후속 줄 EXPORTS
에 있을 수 있습니다. .DEF 파일에는 EXPORTS
문이 한 개 이상 있을 수 있습니다.
내보내 기 정의 의 구문은 다음과 같습니다.
entryname[=internal_name|other_module.exported_name] [@ordinal [NONAME] ] [ [PRIVATE] | [데이터] ]
entryname 은 내보낼 함수 또는 변수 이름입니다. 필수 항목입니다. 내보내는 이름이 DLL의 이름과 다른 경우 internal_name 사용하여 DLL에서 내보내기 이름을 지정합니다. 예를 들어 DLL이 함수 func1
을 내보내고 호출자가 이 함수를 func2
로 사용하도록 하려는 경우 다음과 같이 지정할 수 있습니다.
EXPORTS
func2=func1
내보내는 이름이 다른 모듈에서 온 경우 other_module.exported_name을 사용하여 DLL에서 내보내기 이름을 지정합니다. 예를 들어 DLL이 함수 other_module.func1
을 내보내고 호출자가 이 함수를 func2
로 사용하도록 하려는 경우 다음과 같이 지정할 수 있습니다.
EXPORTS
func2=other_module.func1
내보낸 이름이 서수로 내보내는 다른 모듈에서 온 경우 other_module 사용하여 DLL에서 내보내기 서수를 지정합니다.#서수입니다. 예를 들어 DLL이 서수 42인 다른 모듈에서 함수를 내보내고 호출자가 함수를 사용하도록 func2
하려면 다음을 지정합니다.
EXPORTS
func2=other_module.#42
MSVC 컴파일러는 C++ 함수에 이름 장식을 사용하므로 데코레이팅된 이름 internal_name 사용하거나 소스 코드에서 사용하여 extern "C"
내보낸 함수를 정의해야 합니다. 또한 컴파일러는 밑줄(_) 접두사와 at 기호(@)로 구성된 접미사와 인수 목록의 바이트 수(10진수)를 사용하여 __stdcall 호출 규칙을 사용하는 C 함수를 데코레이트합니다.
컴파일러에서 생성된 데코레이팅된 이름을 찾으려면 DUMPBIN 도구 또는 링커 /MAP 옵션을 사용합니다. 데코레이팅된 이름은 컴파일러별로 다릅니다. .DEF 파일의 데코레이팅된 이름을 내보내는 경우 DLL에 연결된 실행 파일도 동일한 버전의 컴파일러를 사용하여 빌드해야 합니다. 그래야 호출자의 데코레이팅된 이름이 .DEF 파일의 내보낸 이름과 일치하게 됩니다.
@ordinal 을 사용하여 함수 이름이 아닌 숫자가 DLL의 내보내기 테이블에 들어가도록 지정할 수 있습니다. 많은 Windows DLL은 서수를 내보내 레거시 코드를 지원합니다. Windows DLL의 크기를 최소화할 수 있기 때문에 16비트 Windows 코드에서는 서수를 사용하는 것이 일반적입니다. DLL의 클라이언트가 레거시 지원을 위해 함수를 필요로 하지 않는 한 서수로 함수를 내보내는 것은 권장되지 않습니다. .LIB 파일에는 서수와 함수 간의 매핑이 포함되므로 DLL을 사용하는 프로젝트에서 일반적으로 하는 것처럼 함수 이름을 사용할 수 있습니다.
선택적 NONAME 키워드를 사용하여 서수로만 내보내고 결과 DLL에서 내보내기 테이블의 크기를 줄일 수 있습니다. 그러나 DLL에서 GetProcAddress를 사용하려는 경우 이름이 유효하지 않으므로 서수를 알아야 합니다.
선택적 키워드 PRIVATE 은 LINK에서 생성된 가져오기 라이브러리에 항목 이름이 포함되지 않도록 합니다. 이는 LINK에서도 생성한 이미지에서 내보내기에 영향을 미치지 않습니다.
선택적 키워드 DATA 는 내보내기가 코드가 아닌 데이터임을 지정합니다. 아래 예제는 exported_global
데이터 변수를 내보낼 수 있는 방법을 보여줍니다.
EXPORTS
exported_global DATA
다음은 정의를 내보내는 4가지 방법으로 권장 순서대로 나열되었습니다.
소스 코드의 __declspec(dllexport) 키워드
.DEF 파일의
EXPORTS
문LINK 명령의 /EXPORT 사양
소스 코드의 주석 지시문입니다.
#pragma comment(linker, "/export: definition ")
다음 예제에서는 함수 선언 앞에 있는 #pragma 주석 지시문을 보여 하며, 여기서PlainFuncName
는 장식되지 않은 이름이며_PlainFuncName@4
함수의 데코레이팅된 이름입니다.#pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4") BOOL CALLBACK PlainFuncName( Things * lpParams)
#pragma 지시문은 디코딩되지 않은 함수 이름을 내보내고 빌드 구성(예: 32비트 또는 64비트 빌드)에 따라 내보내기가 다른 경우에 유용합니다.
4가지 메서드 모두 동일한 프로그램에서 사용할 수 있습니다. LINK가 내보내기를 포함하는 프로그램을 빌드하는 경우 빌드에서 .EXP 파일을 사용하지 않는다면 가져오기 라이브러리도 만들게 됩니다.
다음은 EXPORTS 섹션의 예입니다.
EXPORTS
DllCanUnloadNow @1 PRIVATE
DllWindowName = WindowName DATA
DllGetClassObject @4 NONAME PRIVATE
DllRegisterServer @7
DllUnregisterServer
.DEF 파일을 사용하여 DLL에서 변수를 내보낸 경우 변수에 대해 __declspec(dllexport)
을 지정할 필요가 없습니다. 그러나 DLL을 사용하는 모든 파일에서는 데이터 선언 시 __declspec(dllimport)
을 계속해서 사용해야 합니다.