Q&A

  • c++로 작성된 dll을 호출시 문제점 입니다.
안녕하세요... 답변좀 부탁드릴께요... ^^


- 아래코드는 c++로 작성된 dll의 헤더화일의 선언내용입니다.
  현재 powerbuilder로 호출하여 정상적으로 사용하고 있습니다.

// PB_DLL -----------------------------------------------
#define PBDLL_API __declspec(dllexport)
extern "C" {
  PBDLL_API int WINAPI getII (LPTSTR in_bj1, LPTSTR in_bj2, int s, int x, int n, int sy, int y, double t, int m, int mm,   double i, LPTSTR in_sum, int f, char ret_sum[50]);
};

- 위 함수를 Delphi에서 호출해서 사용시  문제점이 발생하여 질문을 드립니다.아래코드는 Delphi에서 선언한 함수코드내용입니다.

function getII (in_bj1, in_bj2:PChar; s, x, n, sy, y:integer; t:double; m, mm:integer; i:double; in_sum:Pchar; f:integer; ret_sum:PChar):integer; stdcall; external 'kkk.dll';


(문제점)
1. 위와 같이 호출하여 사용할경우 호출후 값은 정확히 받아오나, 호출후 델파이 함수내 변수나 배열의 값등을 이상한값들로 채우는등 메모리 내용을 변화시키는것 같습니다. 그리고 프로그램 종료시 Access Violation 메세지 및 Runtime error 216 at 00003108 이란에러메세지가 뜨며 정상종료가 되지 않습니다.

2. 값을 정확히 받아온다고는 하나 특정코드조건에서만 값을 정확히 받아오고, dll호출에 관계없는 소스코드 변경에도 Access Violation 메세지가 뜨며 dll호출이 비정상적 입니다.



[질문1] #define PBDLL_API __declspec(dllexport)로 선언된걸로 보아 powerbuilder에서만 정상적으로 작동이 되는것인지 delphi에서는 다른 선언방법이 있어 다르게 선언되어야 하는지, 그리고 c++선언 및 delphi선언이 맞게 되어있는지 궁금합니다.

[질문2] c++에서 선언된 내용중 마지막 인수의 매칭이 제대로 되어있는지도 의심스럽습니다. c++에서 size 50인 char배열로 되어있고 Delphi에서는 PChar형으로 값을 받습니다.

// c++
PBDLL_API int WINAPI getII (LPTSTR in_bj1, LPTSTR in_bj2, int s, int x, int n, int sy, int y, double t, int m, int mm,    
double i, LPTSTR in_sum, int f, char ret_sum[50]);

// delphi
function getII (in_bj1, in_bj2:PChar; s, x, n, sy, y:integer; t:double; m, mm:integer; i:double; in_sum:Pchar; f:integer; ret_sum:PChar):integer; stdcall; external 'kkk.dll';


끝까지 읽어주셔서 감사합니다. 즐거운 하루 되세요...
3  COMMENTS
  • Profile
    마르 2003.08.01 00:11
    정확한 원인은 잘모르겠지만,
    stdcall 대신 cdecl를 선언해보세요.


  • Profile
    조지연 2003.08.01 00:37
    cdecl로 바꾸어서 하면 그나마 가져오던 값도 가져오지 못하네요...
    도데체 원인이 무엇인지... --

    답변주셔서 감사합니다.


  • Profile
    정명호 2003.08.11 22:47
    PCHAR형으로 선언된 변수의 메모리를 할당해 주고 해보세요!!!