我有在回調功能的程序崩潰(Delphi編寫的6)的問題。該函數中的函數沒有任何錯誤,因爲它在其他地方使用,並且我有一條跟蹤語句作爲該函數的最後一行獲取輸出。我想知道在我的界面中是否有錯誤。從C頭文件的提取物是...C至Delphi的翻譯
/*
#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 declar ation看起來正確嗎?
- 編譯程序時應該包括WIN32嗎?
我不知所措的程序是怎麼回事錯在何處。任何幫助不勝感激。
FreePascal也有一個h2pas轉換器。我懷疑它會更現代一些。我想你也會用這個工具轉換你的頭文件並比較結果。這可能會突出陰暗的角落。 –
C頭到Pascal文件轉換器都不會完美工作,因爲它們不是C編譯器。他們做大部分解析,但總是需要手動干預(尤其是因爲大多數C代碼嚴重依賴宏擴展)。 –