Visual Basic 응용 프로그램에서 DLL 함수 호출
Visual Basic 응용 프로그램 또는 파스칼이나 포트란 등의 다른 언어로 된 응용 프로그램에서 C/C++ DLL에 있는 함수를 호출하려면 컴파일러에 의한 이름 데코레이션 없이 올바른 호출 규칙을 사용하여 해당 함수를 내보내야 합니다.
__stdcall은 함수에 대해 올바른 호출 규칙(호출되는 함수는 스택을 정리하고 매개 변수는 오른쪽에서 왼쪽으로 전달됨)을 만들지만 함수 이름을 다르게 데코레이팅합니다. 따라서 DLL의 내보내기 함수에 대해 **__declspec(dllexport)**을 사용하면 데코레이팅된 이름이 내보내집니다.
__stdcall 이름 데코레이션은 기호 이름에 밑줄(_)을 접두사로 붙인 다음, 이 기호에 @ 문자와 인수 목록의 바이트 수(필요한 스택 공간)를 차례로 추가합니다. 예를 들어, 다음과 같이 선언된 함수가 있습니다.
int __stdcall func (int a, double b)
이 함수는 다음과 같이 데코레이팅됩니다.
_func@12
C 호출 규칙(__cdecl)은 함수 이름을 _func로 데코레이팅합니다.
데코레이팅된 이름을 가져오려면 /MAP을 사용합니다. **__declspec(dllexport)**의 사용 방법은 다음과 같습니다.
C 호출 규칙(_cdecl)을 사용하여 함수를 내보내는 경우 함수 이름을 내보낼 때 앞에 있는 밑줄(_)을 제거합니다.
내보내기 함수가 C 호출 규칙이 아닌 다른 규칙(예: __stdcall)을 사용하는 경우 데코레이팅된 이름을 내보냅니다.
스택 정리가 발생하는 위치는 재정의할 수 없으므로 __stdcall을 사용해야 합니다. __stdcall을 사용하여 데코레이팅된 이름을 해제하려면 .def 파일의 EXPORTS 섹션에 있는 별칭을 사용하여 이름을 지정해야 합니다. 다음 함수 선언에 대한 이름 지정 방법은 아래에 설명되어 있습니다.
int __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);
.DEF 파일의 내용은 다음과 같습니다.
EXPORTS
MYFUNC=_MyFunc@12
INITCODE=_InitCode@0
Visual Basic으로 만든 프로그램에서 DLL을 호출하려면 .def 파일에서 이 항목에 설명된 별칭 방법을 사용해야 합니다. 해당 별칭이 Visual Basic 프로그램에서 만들어진 것이면 .def 파일에서 별칭을 사용할 필요가 없습니다. Declare 문에 alias 절을 추가하면 Visual Basic 프로그램에서 이 작업을 자동으로 수행할 수 있습니다.