0

我怎样才能用 Delphi 代码写这个?

[DllImport("FT_ND_API.dll")]
public static extern uint epas_CreateContext(out IntPtr hContextHandle, 
    uint ulFlags, uint ulApiVersion);

[DllImport("FT_ND_API.dll")]
public static extern uint epas_OpenDevice(IntPtr hContextHandle, 
    uint ulQueryType, IntPtr pQueryData);

[DllImport("FT_ND_API.dll")]
public static extern uint epas_GetProperty(IntPtr hContextHandle, uint ulFlags, 
    IntPtr pRefData, byte[] pPropData, uint ulPropSize);

[DllImport("FT_ND_API.dll")]
public static extern uint epas_CreateDir(IntPtr hContextHandle, uint ulFlags, 
    String pucName, String pucGuid, ref WDirInfo pDirInfo, uint ulSizeOfDirInfo);
4

1 回答 1

7

像这样:

function epas_CreateContext(
  out hContextHandle: NativeInt; 
  ulFlags: Cardinal; 
  ulApiVersion: Cardinal
): Cardinal; stdcall; external 'FT_ND_API.dll';

function epas_OpenDevice(
  hContextHandle: NativeInt; 
  ulQueryType: Cardinal; 
  pQueryData: IntPtr
): Cardinal; stdcall; external 'FT_ND_API.dll';

function epas_GetProperty(
  hContextHandle: NativeInt; 
  ulFlags: Cardinal; 
  pRefData: NativeInt; 
  pPropData: PByte; 
  ulPropSize: Cardinal
): Cardinal; stdcall; external 'FT_ND_API.dll';

function epas_CreateDir(
  hContextHandle: NativeInt; 
  ulFlags: Cardinal; 
  pucName: PAnsiChar; 
  pucGuid: PAnsiChar; 
  var pDirInfo: WDirInfo; 
  ulSizeOfDirInfo: Cardinal
): Cardinal; stdcall; external 'FT_ND_API.dll';

笔记:

  • IntPtr是一个指针大小的整数。在德尔福就是NativeInt.
  • uint是一个无符号的 32 位整数,Cardinal在 Delphi 中。
  • string编组为 C 字符串,指向以空字符结尾的字符串的指针。由于没有CharSet指定,所以使用默认的CharSet.Ansi。那是PAnsiChar在德尔福。
  • 指定否CallingConvention,因此CallingConvention.StdCall应用默认值。所以,那是stdcall在德尔福。
  • byte[]一个字节数组。这被编组为指向数组第一个字节的指针。所以,PByte在德尔福。
  • 您还需要翻译WDirInfo为 Delphi。看起来它可能是一个结构。

使用 C++ 头文件而不是 p/invoke 声明可能会更好。最好从接口定义的原始来源开始工作。

于 2013-01-28T10:04:39.853 回答