Q&A

  • VC++ Dll을 델파이로 포팅시 에러발행합니다
안녕하세요~~

- VC++ 원형 :
    int Inquiry_Point(LPCTSTR A, LPCTSTR B, LPCTSTR C, LPCTSTR D, LPCTSTR E, CHAR* F)
-  델파이 : 아래와 같이 선언하고
    TInquiry_Point= function(A,B,C,D,E,F:pchar):integer ; stdcall;
     ===============================================
     var
        Inquiry_Point := TInquiry_Point;
        rData : pchar;
        n : integer;
        A,B,C,D,E ,rBuff : string;
     begin
       z              := LoadLibrary('POS_OCBI.dll_TEST');
       @Inquiry_Point   := GetProcAddress(z,'Inquiry_Point');
       try

          Getmem(rData);

           A := 'ddd'; B :='dddd'; C := 'ddd'; D := 'ddd'; E := 'ddd';
           // *****아래 함수를 호출하면 메로리 엑세스 Violation이 발생됩니다

           n := Inquiry_Point(pchar(A), pchar(B), pchar(C),pchar(D),Pchar(E),rData);
                    
       finally  

          Freemem(rData)

       end;
     end;
   =================================================
   =================================================

  ** 그런데 이상한건 Inquiry_Point  Dll함수와 파라메터 수만 틀리고 동일한 data type의
       함수호출에서는 메모리 에러가 발생되지 않습니다.

  ** Inquiry_Point 에러가 계속나서 혹 DLL이 문제가 있는가 싶어서
      VB에서 구현을 해보았는데 VB에서는 메모리 없이 구현이 아주 잘 되네요..
      난 당연히 델파이에서 안되는 것이라 VB에서도 안될거라 생각했는데..
      
      그렇다면 델파이에서 함수 선언이나 , 함수 호출에 문제가 있는것 같습니다.
      도움글 부탁 드릴께요..^^;

** 참고1 ***********************
    TInquiry_Point= function(A,B,C,D,E:pchar; var F : byte ):integer ; stdcall;  로 선언하고

    var
      bRecive : array [0..1024] of byte;
   ----------------
     n :=  Inquiry_Point(pchar(A), pchar(B), pchar(C),pchar(D),Pchar(E),bRecive[0]);
   ----------------
    
     위와 같은 방법으로 시도 해보았는데 역시 메모리 에러가 발생되네요....

** 참고2 VB구현********************************
(BV에서 구현한 부분(메로리 에러 발생되지 않음)
- 비주얼베이직선언
  Private Declare Function Inquiry_Point Lib "POS_OCBI.dll_REAL" (ByRef A As Byte, ByRef B As  Byte, ByRef C As Byte, ByRef D As Byte, ByRef E As Byte, ByRef F As Byte) As Long

- 함수에서 사용할 변수 선언
Dim Ax() As Byte
  Dim Bx() As Byte
  Dim Cx() As Byte
  Dim Dx() As Byte
  Dim Ex() As Byte

  Dim Fx(1024) As Byte
  Dim str As String
- 함수 호출부
retVal = Inquiry_Point(Ax(0), Bx(0), Cx(0), Dx(0), Ex(0), Fx(0))

    
1  COMMENTS