다음을 통해 공유


DEF 파일을 사용하여 가져오기

.def 파일과 함께 __declspec(dllimport)을 사용하도록 선택하는 경우 CONSTANT 대신 DATA를 사용하도록 .def 파일을 변경하여 잘못된 코딩으로 인해 문제가 발생할 가능성을 줄여야 합니다.

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   DATA

다음 표에서는 이유를 보여 줍니다.

키워드 가져오기 라이브러리에서 내보내기 내보내기
CONSTANT _imp_ulDataInDll, _ulDataInDll _ulDataInDll
DATA _imp_ulDataInDll _ulDataInDll

__declspec(dllimport) 및 CONSTANT를 사용하면 명시적 연결을 허용하도록 만들어진 .lib DLL 가져오기 라이브러리에서 imp 버전과 데코레이트되지 않은 이름이 모두 나열됩니다. __declspec(dllimport) 및 DATA를 사용하면 이름의 imp 버전만 나열됩니다.

CONSTANT를 사용하는 경우 다음 코드 구문 중 하나를 사용하여 ulDataInDll에 액세스할 수 있습니다.

__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L)   /*sample code fragment*/

또는

ULONG *ulDataInDll;      /*prototype*/
if (*ulDataInDll == 0L)  /*sample code fragment*/

그러나 .def 파일에서 DATA를 사용하는 경우에는 다음 정의로 컴파일된 코드만 ulDataInDll 변수에 액세스할 수 있습니다.

__declspec(dllimport) ULONG ulDataInDll;

if (ulDataInDll == 0L)   /*sample code fragment*/

CONSTANT를 사용하는 경우 추가 수준의 간접 참조를 사용하는 것을 잊으면 변수 자체가 아니라 변수를 가리키는 가져오기 주소 테이블의 포인터에 액세스할 수 있으므로 더 위험합니다. 가져오기 주소 테이블은 현재 컴파일러와 링커에서 읽기 전용으로 만들어지므로 이런 유형의 문제는 종종 액세스 위반으로 나타날 수 있습니다.

현재 MSVC 링커는 .def 파일에서 CONSTANT를 확인하면 이 경우를 설명하기 위해 경고를 실행합니다. 실제로 CONSTANT를 사용하는 이유는 헤더 파일의 프로토타입에 __declspec(dllimport)이 나열되어 있지 않은 일부 개체 파일을 다시 컴파일할 수 없는 경우뿐입니다.

참고 항목

애플리케이션으로 가져오기