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

XBa*_*000 -1 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);
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

像这样:

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';
Run Code Online (Sandbox Code Playgroud)

笔记:

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

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