Q&A

  • [문의] Windows7 64비트 버전 App에서 32비트 DLL Call관련 문의
Windows7 64비트 운영체제에서
델파이 2010 버전으로 응용 프로그램을 만들었습니다.

호출할 DLL은 Windows XP 32비트 버전에서 C++ Builder 6 로 만들었구요


[문의사항]

<!--CodeS-->
//
// Call 하는 부분 Delphi 2010 Source
//
function TFormCreditMain.fRequest: integer;
type
  TFunc = function(Flag:integer; src:string; dest:pchar):smallint;stdcall;
var
  H : THandle;
  MyFunc : TFunc;
  sFileName : string;
  sSendBuf  : string;
  sRecvBuf  : array [0..1024] of char;
  nFlag : integer;
  nRet : integer;
begin

  sFileName := ExtractFilePath(Application.ExeName) + 'test.dll';

  nFlag := 0;
  sSendBuf  := '1111111111111111111111111111111111111111111111111111111111';

  FillChar(sRecvBuf,sizeof(sRecvBuf),#0);

  try
    H := LoadLibrary(PChar(sFileName));
    if H<32 then begin
        MessageDlg('test.dll파일이 없습니다',mtWarning,[mbOK],0);
        result := 0;
        exit;
    end;

    @MyFunc := GetProcAddress(H, 'request');
    if not (@MyFunc = nil) then begin
       nRet := MyFunc(nFlag,sSendBuf, sRecvBuf);
       ShowMessage(sRecvBuf);  // <--- 이부분 출력시 버퍼 내용이 깨져서 보입니다
    end;
    FreeLibrary(H);
  except
    MessageDlg(format('DLL load error.(%s)',[sFileName]),mtWarning,[mbOK],0);
    result := -1;
    exit;
  end;

  result := 1;
end;


//
// C++ Builder6로 만든  DLL Source
//
extern "C" __export int __stdcall request(int Flag, char *src, char *dest)
{
  sprintf(dest,"%s","1111");
  return 1;
}

<!--CodeE-->

Delphi 7 버전에서는 잘 사용했던 코드 인데
Delphi 2010으로 작성해서 Call 하니 수신받은 sRecvBuf의 내용이 깨져서 보이네요

DLL에서 숫자로 넘겨도, 영문자로 넘겨도 다 깨져서 보이네요


개발환경적 문제인지 어떤 문제 인지 알 수 가 없네요
도움을 주실 수 있는 분이 계시면 답변좀 부탁 드리겠습니다 (_ _);;





3  COMMENTS
  • Profile
    최용일 2010.05.19 23:15
    빌더에서 만든 DLL은 char * 인데요...
    2010에서 호출할때는 string이네요... 2010은의 string은 UnicodeString입니다.
    string대신에 AnsiString형을 사용하거나 유니코드로 변경해서 쓰세요.
    참고로 델파이 7의 string은 AnsiString입니다.
  • Profile
    로미 2010.05.19 23:33
    아~ 그렇군요
    수정해 봐야겠네요
    감사합니다 ^^
  • Profile
    로미 2010.05.20 00:39
    [자답]

    최용일님의 답변에 힌트를 얻어 해결했습니다.

    선언부변경


    sSendBuf :AnsiString; // <-- String에서 변경
    sRecvBuf : array [0..1024] of AnsiChar; // <-- 기존에 Char에서 변경


    위와 같이 변경 후
    C++ Builder 내부 함수 호출부 변경
    MyFunc(nSignFlag,PAnsiChar(sSendBuf), sRecvBuf);


    정상적으로 처리가 되네요~
    다른 분들도 혹시 저와 같은 경우가 있다면 참조하세요~ ^^*