2012-04-22 73 views
0

這是這個函數的C++頭文件。我已經輸入了所有東西,除了那個calllback,我不知道該怎麼做。將delphi的C++回調函數導入

struct abs_operation; 

typedef struct abs_operation ABS_OPERATION; /* forward declaration */ 

typedef void (BSAPI *ABS_CALLBACK) (const ABS_OPERATION*, ABS_DWORD, void*); 

struct abs_operation { 
     ABS_CALLBACK Callback; ///< Pointer to application-defined function, implementing operation callback. 
} ; 

回答

1

基於對以前的知識問題,是這樣的,我想:

type 
    PABSOperation = ^TABSOperation; 
    TABSCallback = procedure(const Operation: PABSOperation; 
    Flags: DWORD; Ptr: Pointer); stdcall; 
    TABSOperation = record 
    Callback: TABSCallback; 
    end; 
+0

這是不正確的德爾福聲明使用常量。在C++中const意味着不可修改;在delphi中表示通過ref傳遞並且不可修改:改爲使用(operation:PBASOperation,...)或(const操作:TABSOperaion ...) – 2012-04-23 08:51:01

+0

@Stefano實際上,'const'是由Remy編輯添加的。但在這裏沒問題,無論你是否包含'const',都沒有關係。你說在Delphi中'const'的意思是「通過ref傳遞」。該陳述是錯誤的。如果參數大於指針的大小,則使用'const'會引起ref傳遞。事實上,當移植到64位時,這是一些非常微妙的錯誤的來源。考慮一個8號的「記錄」,「TRecord」說。在32位傳遞'const R:TRecord',它通過ref傳遞。以64位傳遞,並按值傳遞。 – 2012-04-23 08:58:42

+0

謝謝,我不知道這種細微差別。我使用記錄大小<= 4個字節並使用大於8的記錄在我的D7中測試了您的案例(使用CPU視圖)。在第一種情況下,參數在AX中傳遞(al,ax或者eax,取決於輸入的大小)。在第二種情況下,輸入地址傳入EDX。但是我的看法是一樣的:在翻譯C函數聲明時不要使用const參數。你依賴於編譯器實現和CPU架構。如果「struct abs_operation」有另一個字段,那麼它將通過32位的值和64位的delphi中的ref傳遞! – 2012-04-23 12:41:57