C到德尔福翻译

时间:2012-08-27 03:38:10

标签: c delphi header

我在回调函数中遇到程序崩溃(用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;

我的问题是......

  1. 上述Delphi声明看起来是否正确?
  2. 编译程序时我应该包含WIN32吗?
  3. 我对程序出错的地方感到茫然。非常感谢任何帮助。

2 个答案:

答案 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。

我从未对自动标头翻译器感到非常满意。就个人而言,我认为你手工制作可能会更好。