如何将 C# 标头转换为德尔菲

本文关键字:转换 | 更新日期: 2023-09-27 17:56:13

我怎样才能用德尔福代码写这个?

[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);

如何将 C# 标头转换为德尔菲

像这样:

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

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