我怎样才能将C#header转换为delphi

时间:2013-01-28 09:59:18

标签: c# delphi pinvoke

如何用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);

1 个答案:

答案 0 :(得分:5)

像这样:

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是指针大小的整数。在Delphi中NativeInt
  • uint是一个无符号的32位整数,在Delphi中是Cardinal
  • string被编组为C字符串,指向以null结尾的字符串的指针。由于未指定CharSet,因此使用默认值CharSet.Ansi。这是Delphi中的PAnsiChar
  • 未指定CallingConvention,因此默认值CallingConvention.StdCall适用。所以,这是Delphi中的stdcall
  • byte[]是一个字节数组。那被编组为指向数组第一个字节的指针。所以,在Delphi中PByte
  • 您还需要将WDirInfo翻译成Delphi。看起来它可能是一个结构。

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