안녕하세요... 답변좀 부탁드릴께요... ^^
- 아래코드는 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';
끝까지 읽어주셔서 감사합니다. 즐거운 하루 되세요...
stdcall 대신 cdecl를 선언해보세요.