Q&A

  • VC에서 작성된 DLL 호출시 문제입니다. 도와주세요..
안녕하세요.
VC로 작성된 DLL파일을 델파이에서 호출하려고 하는데 아래 부분을 어떻게 받아야 할지..

CHAR A; /* 가맹점코드       */
CHAR B; /* 카드번호         */
CHAR C; /* 거래일자         */
CHAR*U; /* 구조체항목(가변) */

struct U {
    CHAR Q; /* 상품코드   */
    CHAR W; /* 상품수량   */
    CHAR E; /* 제조사코드 */
};

으로 되어 있습니다.

이것을 델파이에서 호출하는데 아래와 같이 사용했는데 Missing parameter types 이라는 에러를
내는군요.

    function Save_Point(A, B, C, U: PChar): Integer; cdecl; external 'POS_OCBI.DLL';

VC에서는 아래와 같이 내보내고 있습니다.

    int Save_Point(LPCTSTR A, LPCTSTR B, LPCTSTR C, CHAR* U)

VC로 작성된것으로는 U 파라미터가 구조체 형식이라서 그런거 같은데요.
이 구조체 형식으로 된 것을 델파이에서 어떻게 받아들여야 하는지 궁금합니다.
고수님들의 도움이 필요합니다.
3  COMMENTS
  • Profile
    이중철 2005.10.05 19:31
    좀더 많은 자료가 필요하네요
    단순히 아래 자료로는 판단하기 어렵습니다.
    VC로 작성된것의 예제문이 있으면 한결 분석 하기 편하겠네요

  • Profile
    방기남 2005.10.05 20:20
    답글 감사드립니다.
    저도 받은자료가 아래에 적은것이 전부입니다.
    여기에 글을 올리기엔 파라미터가 좀 많아서 줄여서 올린것 외에는.. ^^

    POS_OCBI.DLL 파일에 int Save_Point 라는 함수가 있고..
    LPCTSTR A, LPCTSTR B, LPCTSTR C, CHAR* U 와 같이 파라미터가 있고 커멘트와 같은 값이
    들어간다는것만 알고 있습니다.

    POS_OCBI.DLL 파일을 델파이에서 읽어야 하는데..
    파라미터 U를 보시면 구조체형식으로 되어 있습니다..
    /* 인자를 넘길때 (CHAR*)으로 타입캐스팅해서 넘긴다(가변) */ 라는 말이 들어있구요..

    궁극적으로 제가 구하고자 하는 답은 구조체형식으로 되어있는 인자값을 델파이에서
    어떤식으로 값을 가져와야 하는지가 궁금한것이죠.

    보내는 쪽에서 구조체를 썼으니 저 역시 record 형으로 타입을 하나 만들고 그것을
    인자값을 받는것으로 써야하는지..(잘 모르겠습니다)

    보내온 자료에서는 예제가 포함되어 있지 않아서 저도 참 난감하네요..
    회사에서는 10일까지 하라고 하는데..
    사내 유일한 개발자이다보니.. 달리 도움을 청할곳이 없습니다.




  • Profile
    이중철 2005.10.05 20:51
    결국 추측성 답변이라도 하겠습니다.
    여기서 A, B, C 는 입력 파라메터 이고
    U는 Return 받는 값이라고 가정하겠습니다.

    그런데 U는 DLL에서 인스턴스 생성해서 가져올 수 없습니다.(Standard DLL에선 거의 불가)

    결국 U 는 Call하는 프로세스에서 생성하고 Call 해야 합니다.

    그런데 문제는 U 내부에 PChar 입니다.

    record U
      Q, W, E : pchar;
    end;

    Q, W, E에 할당하여야 하는 사이즈가 문제가 됩니다.

    정상적이라면 Q에는 10바이트, W에는 15바이트, E에는 10바이트 이런식으로 정의된것이

    있어야 하는데 없더군요

    그렇다면 이런식으로 추측이 가능합니다.

    정말로 Q, W, E의 사이즈는 가변이다.

    이경우 일반적으로 쓰이는 방식을 말씀드릴께요

    char** U  형식으로 스트링 Array로 보내는 것이 일반적인데 이 방법이 아니더군요

    그냥 char* U 이런식이라면 상기 레코드 형식은 절대 아닐거에요

    바로 다음과 같죠

    ADFASDFADFAD GHFGHDGHDH GSGFSDFGSF

    이런형식으로 3개의 스트링을 말단에 NULL을 포함해서 보내는 형식일 가능성이 농후합니다.

    이런면 레코드(DELPHI로 표현이 안됨 그러나 의미적으로)가 이런식이죠

    record U
      Q : array[0..가변] of char;
      P : array[0..가변] of char;
      E : array[0..가변] of char;
    end;
    (참고로 array of char 와 전혀 틀립니다. 이것은 포인터 가 되므로)

    그러면 위 분석결과를 토대로 만든다면

    var
      pA, pB, pC : pchar;
      pU : pchar;
    begin
      pA := '0A00DST';
      pB := 'AACD';
      pC := 'AADDSS';
      GetMem(pU, 1000); // 여유있게 1000 ^^
      Save_Point(pA, pB, pC, pU);

      pU에 대한 Parser가 필요하겠죠


    하면 될꺼 같아요 그러나 예제가 없는 상황에서는 장담을 못합니다.