아래 질문을 올렸었는데 답글을 올려주시는 분이 없어서 다시 올립니다.
DLL은 C로 작성되었고 DLL을 사용하는 옛날 프로그램은 VB로 작성되었습니다.
[ 질문 ]
함수의 첫번째 파라미터로 포인터가 들어가야 될 것 같은데 어떻게 사용해야 될지를 모르겠습니다.
또한 RCB_TYPE의 선언도 맞는지 틀린지를 모르겠습니다.
컴파일은 되는데 함수 호출부분에서 런타임에러가 발생합니다.
DLL에 들어있는 다른 함수들은 제대로 호출되는 걸로 봐선 DLL Export 따위는 제대로 된것 같습니다.
보시고 어떻게 바꾸어야 되는지 좀 알려주세요.
[ VB 소스 ]
VB에서는 DLL의 함수를 Export할 때..
Declare Function ReaderCommOpen Lib "ReaderComm5DLL.dll" (lpRCB As RCB_TYPE, ByVal lpComPort As String, ...)
이런 식으로 정의하였습니다. (매개변수에 ByVal이 붙지 않으면 주소 참조 방식인걸로 기억)
매개변수인 RCB_TYPE의 정의는...
Public Type RCB_TYPE
MagicNumber As Long
hComm As Long
End Type
Public Global_RCB As RCB_TYPE
이 함수를 호출하는 부분은..
Global_RCB.hComm = 12345657
ReaderCommOpen(Global_RCB, "TCP/IP", 0)
[ Delphi 소스 - 에러(!)버전 ]
interface
type
RCB_TYPE = record
MagicNumber, hComm : Longint;
End;
Function ReaderCommOpen (lpRCB : RCB_TYPE; lpComPort : String; baud_rate : Longint): Integer;
implementation
Function ReaderCommOpen; external 'ReaderComm5DLL.dll';
- 함수 호출
Global_RCB.hComm := 12345657;
ReaderCommOpen(Global_RCB, 'TCP/IP', 0); // <- 여기서 런타임 에러가 발생합니다.
맘은 급한데 머리는 안 따라주고... 흑...
참조에의한 호출이 맞다면... var를 붙여야되지 않을런지...
Function ReaderCommOpen (var lpRCB : RCB_TYPE; lpComPort : String; baud_rate : Longint): Integer;
그리고 호출방식도 cdecl, stdcall, pascal 등.. 맞는지 확인하세요. 아무것도 안붙이면 기본적으로 register call입니다. DLL의 함수호출할때는 대부분 맞지 않을겁니다.
^^ 항상 즐코하세요...