Q&A

  • DLL의 함수 호출시 런타임 에러가... 도와주세요 ㅠ.ㅜ
아래 질문을 올렸었는데 답글을 올려주시는 분이 없어서 다시 올립니다.

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);   // <- 여기서 런타임 에러가 발생합니다.


맘은 급한데 머리는 안 따라주고...   흑...
2  COMMENTS
  • Profile
    최용일 2005.07.28 08:19
    안녕하세요. 최용일입니다.

    참조에의한 호출이 맞다면... var를 붙여야되지 않을런지...

    Function ReaderCommOpen (var lpRCB : RCB_TYPE; lpComPort : String; baud_rate : Longint): Integer;

    그리고 호출방식도 cdecl, stdcall, pascal 등.. 맞는지 확인하세요. 아무것도 안붙이면 기본적으로 register call입니다. DLL의 함수호출할때는 대부분 맞지 않을겁니다.

    ^^ 항상 즐코하세요...

  • Profile
    허저비 2005.07.28 10:38
    답변 감사합니다.
    최용일님께서 알려주신 방법도 이미 시도해보았다고 생각했는데...
    혹시 몰라 다시 해보니...    허걱...    됩니다...
    왜 코드를 이렇게 작성해야 되는지도 모른채 마구잡이로 짜집기하던 결과인것 같습니다.
    이번 작업만 끝나면 Delphi에서의 DLL 사용, 포인터 사용 등 그동안 곤란을 겪었던 부분들 만이라도
    기필코 정리해서 제것으로 만들어야 겠다고 다짐하는 중입니다.

    다시한번 깊이 감사드립니다.