정보: _declspec(dllimport) 및 _declspec(dllexport) 코드 사용

기술 자료 번역 기술 자료 번역
기술 자료: 132044 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Microsoft 기술 자료의 다음 문서에서 다룰 내용은 보완합니다.
107501Visual C++ 32 비트 __declspec 기준 대체된 정보: __export
이 문서에서는 장점 및 _declspec(dllimport) 및 _declspec(dllexport) 응용 프로그램에서 사용하는 메커니즘에 대해 설명합니다.

추가 정보

Visual C++ 32 비트 버전의 _declspec(dllimport) 및 _declspec(dllexport) 16비트 버전의 Visual C++에서 이전에 사용한 __export 키워드를 바꾸는 예제입니다.

코드가 _declspec(dllimport) 사용하여 올바르게 컴파일되도록 할 필요는 없지만 이렇게 하면 컴파일러가 보다 나은 코드를 생성할 수 있게. 컴파일러는 컴파일러가 정상적인 간접 참조 수준을 건너뛸 코드를 생성할 수 있도록 DLL 경계를 십자 함수 호출에서 존재할 수, 함수 또는 않은 DLL에 있는지에 대해 확실히 알고 있기 때문에 보다 나은 코드를 생성할 수 있습니다.

적절한 .DEF 파일을 EXPORTS 섹션으로 _declspec(dllexport) 필요하지 않습니다. _declspec(dllexport) 쉽게 .DEF 파일을 사용하지 않고 .EXE 또는 .DLL 함수를 내보낼 수 있는 방법을 제공하기 위해 추가되었습니다.

이 기사의 나머지 부분에서는 이러한 문제를 매우 낮은 수준의 철저한 토론을 제공합니다.

Win32 실행 파일 (이식 가능 형식 가져오기를 수정하려면 다루었습니다 페이지 수를 최소화하기 위해 설계되었습니다. 이렇게 하려면 가져오기 주소 테이블이라는 하나의 장소에 있는 모든 프로그램에 대한 모든 가져오기 주소를 다시 배치합니다. 로더를 이러한 가져오기에 액세스할 때 하나 또는 두 페이지를 수정할 수 있습니다.

_declspec(dllimport)에 대한 함수 호출 사용

다음 코드 예제에서는 func1 main() 함수가 포함된 .EXE 파일을 별도의 DLL에 있는 함수를 가정하십시오.

이 코드는 _declspec(dllimport) 않고 주어진:
void main(void) {
    func1();
}
				
컴파일러에서 다음과 같은 코드를 생성합니다.
call func1
				
및 링커에서 다음과 같은 호출로 변환합니다:
call 0x4000000         ; The address of 'func1'.
				
'func1' 다른 DLL의 경우 'func1' 주소를 무엇인지 알 수 있는 방법이 없으므로 링커가 이 직접 확인할 수 없습니다. 16 비트 환경에서 링커는 로더가 런타임에 올바른 주소 사용하여 패치하게 .EXE의 목록에 이 코드 주소를 추가합니다. 32 비트 환경에서 링커는 대한 주소를 알고 있지 썽크를 생성합니다. 썽크를 다음과 같습니다:
   0x40000000:    jmp DWORD PTR __imp_func1
				
여기에 __imp_func1 .EXE 파일 가져오기 주소 테이블 func1의 슬롯에 대한 주소입니다. 링커에 따라서 모든 주소는 알 수 있습니다. 로더는 경우에만 제대로 작동하려면 모든 로드 시 .EXE 파일 가져오기 주소 테이블을 업데이트해야 합니다.

따라서 위해 권한이 없는 경우 링커가 썽크를 생성하는 경우 더 나은 있기 때문에 _declspec(dllimport) 사용하여 더 좋습니다. 썽크 코드는 크게 (RISC 시스템에서는 여러 지침을 수도 있음) 및 캐시 성능을 저하시킬 수 있습니다. DLL에 함수입니다 컴파일러에 지시하는 경우 이를 간접 호출을 생성할 수 있습니다.

이 코드는 이제:
__declspec(dllimport) void func1(void);

void main(void) {
    func1();
}
				
이 명령을 생성하는:
call DWORD PTR __imp_func1
				
코드를 작은 줄어들고 속도도 jmp 명령이 없습니다.

반면, DLL 내부에 있는 함수 호출의 경우 간접 호출을 사용하지 않을. 함수의 주소를 이미 알으십시오. 시간 및 공간 로드하고 직접 호출을 빠르고 작은 항상 되도록 간접 호출 전에 함수의 주소를 저장할 필요합니다. 하기 __declspec(dllimport) 외부에서 DLL 함수를 호출할 때 사용할 할 DLL 자체를. 하기 __declspec(dllimport) 해당 DLL을 빌드할 때 DLL 내부에 함수에 사용하지 마십시오.

_declspec(dllexport) 사용하여

Microsoft은 컴파일러 내보내기 이름을 자동으로 생성하는 .LIB 파일에 배치할 수 있도록 16비트 컴파일러 버전에 __export가 도입되었습니다. 이 .LIB 파일은 DLL에 링크할 정적 .LIB와 같은 바로 사용할 수 있습니다.

Microsoft는 이 편의를 계속하려면 __declspec(dllexport)를 추가했습니다. 그 목적은 .DEF 파일에 필요가 없습니다 개체 파일을 내보내기 지시문을 추가하는 것입니다.

C++ 함수 이름의 데코레이팅된 할 때 가장 명백한 편리합니다. 이름 데코레이션에 대한 없는 표준 사양이 없으므로 내보내기 함수의 이름은 컴파일러 버전 간에 변경될 수 있습니다. _declspec(dllexport) 사용하는 경우 DLL 및 종속 .EXE 파일을 다시 컴파일하지 경우에만 계정에 대한 명명 규칙 변경 내용이 필요합니다.

많은 지시문을 내보낼 같은 서수, NONAME, 또는 PRIVATE, .DEF 파일에 대해서만 만들 수 있으며 .DEF 파일 없이 이러한 특성을 지정할 수 있는 방법은 없습니다. 그러나 .DEF 파일을 사용하여 외에도 _declspec(dllexport) 사용하여 빌드 오류가 발생하지 않습니다.

참고 자료로 통해 Win32 WINBASE.H 헤더 파일을 검색하십시오. 기본 설정된 __declspec(dllexport) 및 하기 __declspec(dllimport) 사용 예제를 포함합니다.

_declspec(dllexport) 및 _declspec(dllimport) 있는 데이터 사용

경우 _declspec(dllimport) 사용하여 간접 참조의 계층을 제거합니다 편의를 항목을 데이터입니다. DLL에서 데이터를 가져올 때 여전히 가져오기 주소 테이블을 통해 이동 합니다. 이 추가 수준의 간접 참조 DLL에서 내보낸 데이터를 액세스할 때 수행할 작업을 기억해야 했습니다 _declspec(dllimport) 전에 Win32 일 의미하는:
// project.h
#ifdef _DLL     // If accessing the data from inside the DLL
   ULONG ulDataInDll;

else            // If accessing the data from outside the DLL
   ULONG *ulDataInDll;
#endif
				
사용하면 .DEF 파일에서 다음 데이터를 내보내는 것입니다:
// project.def
LIBRARY project
EXPORTS
    ulDataInDll   CONSTANT
				
및 DLL 외부에서 액세스할:
if (*ulDataInDll == 0L) {
   // Do stuff here
}
				
하기 __declspec(dllimport) 데이터를 표시할 때 컴파일러에서 자동으로 간접 코드를 생성하는. 위의 단계에 대한 걱정할 필요가 더 이상. 앞에서 언급했듯이 _declspec(dllimport) 선언 데이터에서 해당 DLL을 빌드할 때 사용하지 마십시오. DLL 내의 함수는 가져오기 주소 테이블 데이터 개체에 액세스하는 데 사용하지 않습니다. 따라서 사용자가 추가 수준의 간접 없을 것입니다.

DLL에서 데이터를 자동으로 내보내려면 이 선언을 사용합니다:
__declspec(dllexport) ULONG ulDataInDLL;
				

.DEF 파일 사용

하기 __declspec(dllimport) .DEF 파일을 함께 사용하도록 선택하면 잘못된 코딩 문제가 발생할 가능성을 줄이려면 DATA CONSTANT 대신 사용할 .DEF 파일을 변경해야 합니다:
// project.def
LIBRARY project
EXPORTS
    ulDataInDll   DATA
				
있는 다음 차트 이유를 보여줍니다:
Keyword     Emits in the import lib     Exports
CONSTANT    __imp_ulDataInDll           ulDataInDll
            __ulDataInDll

DATA        __imp_ulDataInDll           ulDataInDll
				
_declspec (dllimport) 및 CONSTANT 사용하여 __imp_ 버전 및 명시적 링크를 허용하도록 만든 .LIB DLL 가져오기 라이브러리 데코레이팅되지 않은 이름 목록을 표시합니다. _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*/ 
				
추가 수준의 간접 참조 사용할 것을 잊은 경우 잠재적으로 가져오기 주소 테이블 포인터를 변수에--변수 자체에는 액세스할 수 없기 때문에 사용 상수 더 위험합니다. 가져오기 주소 테이블의 현재 Microsoft 컴파일러 및 링커 읽기 때문에 이러한 유형의 문제가 액세스 위반과 같이 자주 나타날 수 있습니다.

이 경우 계정 CONSTANT .DEF 파일에 있는 볼 경우 현재 Visual C++ 링커 경고가 발생합니다. CONSTANT 사용할 경우에만 실제 헤더 파일을 dllimport 프로토타입에 대한 목록 않은 일부 개체 파일을 다시 컴파일해야 수 없는 경우 때문입니다.

참조

다음 Visual C++ 온라인 설명서 상당한 양의 dllexport, dllimport 저장소 클래스 특성을 제공합니다. 프로그래밍 기술 참조 "만들기 DLL에 대한 Win32" 장에서 "The dllexport, dllimport 특성" 및 C++ 언어 참조 "Microsoft 관련 한정자" 장의 사용 dllimport 및 C++ dllexport"항목 및 기호 내보내기 항목이 포함되어 있습니다. 철저한 목록은 관련된 항목을 온라인 설명서의 "dllimport" 또는 "dllexport" 검색합니다.

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
90530DLL 또는 응용 프로그램 데이터 내보내기 방법
107501Visual C++ 32 비트 __declspec 기준 대체된 정보: __export

속성

기술 자료: 132044 - 마지막 검토: 2003년 12월 2일 화요일 - 수정: 2.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
키워드:?
kbmt kbcode kbcompiler kbinfo KB132044 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항
이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com