C sharp的等价物“;public IntPtr pHandle=IntPtr.Zero";到Delphi”

本文关键字:IntPtr Zero quot Delphi pHandle 等价物 sharp public | 更新日期: 2023-09-27 18:30:14

经过一些研究,我翻译了

pHandle = IntPtr.Zero;

至Delphi

var
  pHandle: Pointer; 

当我在Delphi中中断调试时,我得到$314328,当我在C sharp上中断调试时我得到一个整数值134180640。有人能告诉我如何正确翻译德尔福吗?

我在Delphi中调用的Dll函数是:

function SAAT_Open(pHandle: Pointer): Boolean; stdcall;

C sharp函数是:

[DllImport("RFIDAPI.dll", EntryPoint = "SAAT_Open")]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool SAAT_Open(IntPtr pHandle);

C sharp的等价物“;public IntPtr pHandle=IntPtr.Zero";到Delphi”

在.NET中,IntPtr是一个指针类型的表示,该指针类型由整数在后台实现,因为它不能是实际的.NET指针(引用),因为必须管理"真实"引用。但它也不可能是一个真正的整数,或者你可以对它进行数学运算,这是一个很好的方法来获得内存损坏。(注意:此限制可能存在,也可能不存在,具体取决于您使用的C#和/或CLR的版本。)

但是,由于不能将IntPtr视为整数,因此使用IntPtr唯一有用的方法是为其赋值,或者将其传递给需要IntPtr的代码。IntPtr.Zero的存在是为了解决一个缺失但至关重要的场景:null值。您不能将0分配给它,也不能根据0测试它,而且由于它不是引用,所以您不能根据null进行分配或测试。因此,他们将其创建为一个特殊的常量来表示"值为null的IntPtr"

如果您想在Delphi中执行等效操作,请声明指针,然后将其初始化为nil

经过一些研究,我翻译了

pHandle = IntPtr.Zero;

至Delphi

var
  pHandle: Pointer; 

有人能告诉我如何正确翻译德尔福吗?

C#语法允许您在声明变量的同一语句中初始化变量:

IntPtr Handle = IntPtr.Zero;

在Delphi中,你不能在声明局部变量时初始化它。所以你需要声明它,然后初始化它:

var
  Handle: Pointer;
....
Handle := nil;

在为非托管类型的局部变量赋值之前,其值是未定义的。


但是,如果将nil传递给SAAT_Open,则它将失败。函数需要一个非null句柄。因此,初始化为nil对您没有帮助。你需要做得更多。您需要调用产生新句柄的函数。这就是SAAT_TCPInit。您显示的C#代码将句柄初始化为null值,这是不必要的。这样做可能是因为SAAT_TCPInit被错误地转换为使用ref参数作为句柄,而不是正确的转换(即out参数)。

虽然以上内容回答了您提出的问题,但对解决您的问题没有帮助。你不需要一个null句柄,你需要一个实际的句柄。


当我在Delphi中中断调试时,我得到314328美元,当我在C sharp上中断调试时我得到134180640的整数值。

好吧,在pHandle = IntPtr.Zero之后,你绝对不会在C#中看到值134180640。您将看到值0。必须有一些其他代码来初始化句柄。可能是对SAAT_TCPInit的调用。你确实需要打那个电话。我相信你会这么做。

在程序的后续执行中,句柄不一定具有相同的值。并且不需要在每个不同的程序中具有相同的值。句柄实际上是一个动态分配的指针,其地址在每次运行中都是可变的。因此,如果它像你所观察到的那样变化,那就没什么好担心的了。如果SAAT_TCPInit返回True表示成功,则句柄值将有效。