我有一个用C语言写的dll。 我的delphi包装器调用c ++ dll中的函数。
这是C ++代码:
typedef enum EFTDeviceControlAction
{
EFT_DCA_CR_CARD_RETRACT = 0x01,
EFT_DCA_CR_CARD_REPOSITION = 0x02,
EFT_DCA_CR_SHUTTER_OPEN = 0x03,
EFT_DCA_CR_SHUTTER_CLOSE = 0x04,
EFT_DCA_CR_CARD_EJECT = 0x05,
}
typedef enum EFT_PrintOptions {
poPrintState = 0,
poPrintFirst = 1,
poPrintSubsequent = 2,
poPrintFinal = 3,
poPrintAbort = 9
} EFT_PrintOptions;
typedef void * EFT_HANDLE;
int EFT_CreateSession(EFT_HANDLE * h);
int EFT_DestroySession(EFT_HANDLE h);
int EFT_ReadProperty(EFT_HANDLE h, int table, int index, char * pValue, unsigned int maxLength);
int EFT_WriteProperty(EFT_HANDLE h, int table, int index, char * pValue);
...
这是delphi代码:
EFTDeviceControlAction = (
EFT_DCA_CR_CARD_RETRACT = $01,
EFT_DCA_CR_CARD_REPOSITION = $02,
EFT_DCA_CR_SHUTTER_OPEN = $03,
EFT_DCA_CR_SHUTTER_CLOSE = $04,
EFT_DCA_CR_CARD_EJECT = $05,
);
EFT_PrintOptions = (
poPrintState = 0,
poPrintFirst = 1,
poPrintSubsequent = 2,
poPrintFinal = 3,
poPrintAbort = 9
);
EFT_HANDLE = pointer;
function EFT_CreateSession(var h: EFT_HANDLE): Integer; stdcall; external 'api.dll';
function EFT_DestroySession(h: EFT_HANDLE): Integer; stdcall; external 'api.dll';
function EFT_ReadProperty(h: EFT_HANDLE; table: Integer; index: Integer; pValue: PChar; maxLength: Cardinal): Integer; stdcall; external 'api.dll';
function EFT_WriteProperty(h: EFT_HANDLE; table: Integer; index: Integer; pValue: PChar): Integer; stdcall; external 'api.dll';
我遇到的问题是行(C ++)
typedef void * EFT_HANDLE
这条线如何在Delphi中定义? 这是一个指针,程序???当我调用函数时,我对参数使用什么值?
对于每次通话,我都会在模块
中的地址0040537B
处获得访问冲突
答案 0 :(得分:3)
typedef void * EFT_HANDLE;
声明类型的名称为EFT_HANDLE
,它是void*
的别名。 void*
只是一个无类型的指针。
因此,在Delphi中,您可以这样定义:
type
EFT_HANDLE = Pointer;
这正是你已经做过的。
其他翻译看起来基本上非常合理。我有这些评论:
stdcall
吗?您显示的C ++代码未指定调用约定,这总是意味着cdecl
。PAnsiChar
而非PChar
,以便您的代码在Unicode Delphi以及旧的非Unicode Delphi上正确无误。访问冲突的明显位置是以null结尾的字符串。查看调用EFT_ReadProperty
的代码会很有帮助。它需要看起来像这样:
var
prop: AnsiString;
....
SetLength(prop, 128); // for example, not sure what value is needed here
retval := EFT_ReadProperty(handle, index, PAnsiChar(prop), Length(prop)+1);
// the +1 is for the null-terminator, but the library will specify exactly
// how that is handled and it could equally be that the +1 is omitted