다음을 통해 공유


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 프로그램에서 이 작업을 자동으로 수행할 수 있습니다.

추가 정보

참고 항목

개념

DLL