Visual Basic 애플리케이션에서 DLL 함수 호출

Visual Basic 애플리케이션(또는 Pascal, Fortran 등 다른 언어의 애플리케이션)이 C/C++ DLL에서 함수를 호출하려면 컴파일러에서 수행하는 이름 장식 없이 올바른 호출 규칙을 사용하여 함수를 내보내야 합니다.

__stdcall은 함수의 올바른 호출 규칙(호출된 함수가 스택을 정리하고 매개 변수가 오른쪽에서 왼쪽으로 전달됨)을 만들지만 함수 이름을 다르게 데코레이트합니다. 따라서 DLL에서 내보낸 함수에 __declspec(dllexport)를 사용하는 경우 데코레이트된 이름을 내보냅니다.

이름 장식은 __stdcall 기호 이름 앞에 밑줄( _ )을 접두사로 지정하고 기호에 at 기호(@) 문자와 인수 목록의 바이트 수(필요한 스택 공간)를 추가합니다. 따라서 다음과 같이 선언된 함수는

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 파일에 별칭을 사용하지 않아도 됩니다. Visual Basic 프로그램에서 Declare 문에 별칭 절을 추가하여 이 작업을 수행할 수 있습니다.

추가 정보

참고 항목

Visual Studio에서 C/C++ DLL 만들기