VB에서는 기본적으로 DLL에 있는 함수들을 호출할 수 있습니다.
물론, DLL에 있는 함수들은 VB에서 호출할 수 있도록 몇가지 규칙에 맞게 작성되어야 합니다.
VC++로 간단히 DLL함수를 만들어 VB에서 DLL 함수를 호출하는 법을 살펴보도록 하지요.
먼저, DLL로 간단한 함수를 만듭니다. 그냥 간단하게 덧셈 함수를 만들어 보지요.
함수 이름은 vb_add()로 합니다. 입력으로 두 값(int)을 받아서 더한 값을 리턴합니다.
int vb_add(int a, int b)
{
return (a+b);
}
vb_add() 함수를 구현하기 위하여 먼저, VC++에서 DLL 프로젝트를 만듭니다.
프로젝트 이름은 VB에서 사용하는 라이브러리니깐 Lib4VB로 하지요.
DLL 종류는 아래와 같이 Regular DLL을 선택합니다.
프로젝트가 생성되면 Lib4VB.cpp 파일에 아래와 같이 vb_add() 함수를 만듭니다.
이제 컴파일하면 DLL 파일이 만들어지지만 컴파일하기 전에 해야할 일이 한가지 더 있습니다.
Lib4VB 디렉토리를 보시면 Lib4VB.def이란 파일이 있을 것입니다.
이 파일에 우리가 만든 함수의 이름을 적어 주어야 합니다.
이부분을 적지 않으면 VB에서 DLL 안의 함수를 찾지 못합니다.
자, 이제 컴파일해 보지요. 별다른 잘못이 없으면 Lib4VB.dll이 만들어질 것입니다.
이렇게 하면 DLL 함수를 만드는 일은 모두 끝이 납니다.
이제 Lib4VB.dll을 사용할 VB 프로그램을 만들어 봅시다.
프로젝트의 이름은 TestDLL이라고 합시다.
프로젝트를 생성하였으면 폼에서 간단히 Add라는 버튼을 만듭니다.
DLL에 있는 vb_add() 함수를 사용하기 위해서는 VB에 vb_add() 함수에 대하여 알려 주어야 합니다.
아래와 같이 알려 주도록 합시다. 아래 문장을 보면 함수의 원형과 함수가 어떤 DLL에 들어있는지가 나와 있습니다.
Private Declare Function vb_add Lib "Lib4VB.dll" (ByVal a As Long, ByVal b As Long) As Long
자, 이제 기다리던 실행 버튼을 누를 시간이 왔습니다. 실행 버튼을 눌러 보지요....
앗, 그런데, 에러가 나오네요... 단순하게 Lib4VB.dll을 찾지 못한다는 에러입니다.
앞에서 만든 Lib4VB.dll을 VB 프로젝트 디렉토리로 복사해 줍니다.
다시 프로그램을 실행시켜 Add 버튼을 눌러 봅시다. 아래와 같이 정상적으로 결과가 나오네요
이것으로 간단히 DLL에서 만든 함수를 VB에서 호출하는 방법을 살펴 보았습니다.
이제 조금 더 자세하게 살펴 보도록 하지요.
기본적으로 VB에서는 __stdcall 형태의 함수 호출을 지원합니다.
함수 호출방식(calling convention - 인터넷 찾아보면 자세히 나옵니다. ^^;)은 사용 언어마다 조금씩 다른데
일반적으로 파스칼이나 윈도우 API 함수들은 __stdcall 방식을 사용하고
c에서는 기본적으로 __cdecl 방식을 사용합니다.
그래서 일반적으로 VC++로 그냥 DLL을 만들면 VB에서는 호출할 수가 없는 것이죠.
VC++에서 그냥 DLL을 만들고 VB에서 함수를 호출하면 아래와 같은 메시지가 나옵니다.
함수 호출 형식을 맞추기 위하여 사용하는 문장이 __stdcall이란 문장입니다.
DLL에 있는 vb_add() 함수를 보면 앞에 __stdcall이라고 적혀 있지요?
이렇게 적으면 vb_add() 함수가 __stdcall 형태로 함수 호출이 된다는 것을 의미합니다.
윈도우 API들도 __stdcall 형태의 함수 호출을 지원하기 때문에
헤더파일(windef.h, winuser.h)들을 찾아보면 아래와 같이 적혀 있습니다.
#define WINAPI __stdcall
BOOL WINAPI SetWindowTextA(...)
그래서 VB에서 윈도우의 API 함수들을 불러 쓸 수 있는 것입니다.
그런데, 재미있게도 VB에서 인터프리터 방식으로 동작시키지 않고 exe 형태의 실행 파일로 만들어
동작시키면 DLL 함수가 __stdcall 이건 __cdecl 건 모두 잘 동작합니다.
즉, Lib4VB.dll을 만들 때 함수 앞에 __stdcall을 적어 주지 않았더라도
TestDLL 프로젝트를 TestDLL.exe로 만들어 동작시키면 vb_add() 함수를 호출할 수 있다는 것이지요.
VB에서 VC++로 만든 DLL을 호출할 때 주의해야 할 또 다른 점 중 하나는 데이터 타입입니다.
VB에서는 int가 2바이트인데 반하여 VC에서는 int가 4바이트입니다.
따라서 VC++에서 int로 입출력 변수를 선언하였다면 VB에서는 Long 타입을 사용해야 합니다.
VC++ : int vb_add(int a, int b);
VB : vb_add (ByVal a As Long, ByVal b As Long) As Long
VC++에서 포인터를 사용하였다면 VB에서는 ByVal 대신 ByRef를 사용하면 됩니다.
ByVal를 값을 넘겨주고, ByRef는 주소를 넘겨주는 방식입니다.
VC++ : int vb_ptr(int *a);
VB : vb_ptr (ByRef a As Long) As Long
문자열을 전달할 경우에는 VC++에서는 char *를 사용하고 VB에서는 String을 사용하면 됩니다.
VC++에서 문자열이 포인터라고 해서 VB에서 ByRef를 사용하면 안됩니다. 그냥 String 타입의 ByVal를 사용하면
VB에서 알아서 변환하여 넘겨줍니다.
VC++ : void vb_string(char *text);
VB : vb_string (ByVal text As String)
VB에 있는 배열을 VC++로 전달하기 위해서는 ByRef를 사용해야 합니다.
단, 배열의 첫 인자를 입력 변수로 넣어 주어야 합니다.
ByRef이기 때문에 첫 인자의 주소가 vb_array() 함수로 넘어가게 됩니다.
VC++ : void vb_array(int *data);
VB : vb_array (ByRef data As Long)
Dim buffer(10) As Long
Call vb_array(buffer(0), ...)
자세한 구현 내용은 첨부 파일을 참조하시면 됩니다.
그럼, 좋은 결과가 있기를 바랍니다.~
소스코드