コールバック関数で (Delphi 6 で作成された) プログラムがクラッシュするという問題があります。その関数は他の場所で使用されているため、その関数には何も問題はありません。出力を取得する関数の最後の行として trace ステートメントがあります。私が持っているインターフェースに何か問題があるのではないかと思っています。Cヘッダーファイルからの抜粋は...
/*
#ifdef SSLCLIENT_EXPORTS
#define SSLCLIENT_API __declspec(dllexport)
#else
#define SSLCLIENT_API __declspec(dllimport)
#endif
*/
#define SSLCLIENT_API
#define CDR_EXPORT CALLBACK
typedef int CDRHANDLE;
// The definition of preceding call back functions is as follows:
#define CDR_PRORESS_CONTINUE 0
#define CDR_CANCEL_CONNECTION -1
#define CONNECTION_TERMINATED 1
#define CONNECTION_CLOSED 2
#ifdef __cplusplus
//extern "C" {
#endif
typedef int (CDR_EXPORT *RECEIVEINGFUNC )
(
char *callData,
void *applicationData
);
SSLCLIENT_API CDRHANDLE CDR_EXPORT CdrOpenConnection
(
char *IPAddressOrMachineName,
char *usernameOfCDRUserGroup,
char *password,
RECEIVEINGFUNC CDRRecord,
STOPFUNC CDRStop,
void *applicationData
);
#ifdef __cplusplus
//} // extern "C"
#endif
#endif
そして、Drbobs プログラムを使用して Delphi ソースを生成しました...
type
RECEIVEINGFUNC = function(CallData: PChar; ApplicationData: Pointer): integer;
STOPFUNC = procedure(StopReason: integer; ApplicationData: Pointer);
(* = INT (CDR_EXPORT*RECEIVEINGFUNC ) ( CHAR*CALLDATA, VOID*APPLICATIONDATA );
type
= VOID (CDR_EXPORT*STOPFUNC ) ( INT STOPREASON, VOID*APPLICATIONDATA );
*)
var
CdrOpenConnection: function(IPAddressOrMachineName: PChar;
usernameOfCDRUserGroup: PChar;
password: PChar;
CDRRecord: RECEIVEINGFUNC;
CDRStop: STOPFUNC;
applicationData: Pointer): CDRHANDLE cdecl {$IFDEF WIN32} stdcall {$ENDIF};
そして私には機能があります
function DoCdrRecord1(CallData: PChar; ApplicationData: Pointer): integer;
begin
try
// do stuff...
trace('DoCdrRecord1::back from _HndlCdrRec');
except
on e: exception do
begin
trace('DoCdrRecord1::exception -> ' + e.message);
end;
end
end;
私の質問は...
- 上記の Delphi 宣言は正しいですか?
- プログラムをコンパイルするときに WIN32 を含める必要がありますか?
プログラムのどこが間違っているのか途方に暮れています。どんな助けでも大歓迎です。