2012-04-22 75 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