我在回调函数中遇到程序崩溃(用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;
我的问题是......
我对程序出错的地方感到茫然。非常感谢任何帮助。
答案 0 :(得分:4)
你错过了调用约定。
RECEIVEINGFUNC
定义为CDR_EXPORT
,稍高一点我们看到:
#define CDR_EXPORT CALLBACK
并CALLBACK needs to be defined in Delphi imports as stdcall;
.所以修复你的功能,它应该有效:
function DoCdrRecord1(CallData: PChar; ApplicationData: Pointer): integer; stdcall;
答案 1 :(得分:4)
<强> 1。上面的Delphi声明看起来是否正确?
他们是正确的,但有一个例外。两个回调函数类型具有不正确的调用约定。在C代码中,回调函数类型用CDR_EXPORT声明,而CDR_EXPORT又定义为CALLBACK。反过来又在Windows头文件和__stdcall中定义。所以你的Delphi函数类型需要匹配。
RECEIVEINGFUNC = function(CallData: PChar;
ApplicationData: Pointer): integer; stdcall;
STOPFUNC = procedure(StopReason: integer;
ApplicationData: Pointer); stdcall;
这是翻译中唯一的错误。
<强> 2。我应该在编译时包含WIN32 程序吗
我猜你的意思是,定义而不是包括。这里没什么可做的。 WIN32条件由Delphi 6编译器定义。您无需定义它。
我希望IFDEF存在,因为Bob博士的转换器最初针对16位Delphi 1.而在16位Windows上,默认的Windows调用约定是长期被遗忘的pascal调用约定。 IFDEF现在是一个遗物,你可以删除它。但是,自然地保持stdcall。
我从未对自动标头翻译器感到非常满意。就个人而言,我认为你手工制作可能会更好。