gpt4 book ai didi

delphi - 如何使用Pchar函数来使用c#

转载 作者:行者123 更新时间:2023-12-03 15:57:58 27 4
gpt4 key购买 nike

如何在 C# 中使用此函数?

function CheckCard (pPortID:LongInt;pReaderID:LongInt;pTimeout:LongInt): PChar;

该函数包含 dll。

我可以尝试这样:

[DllImport("..\\RFID_107_485.dll", CharSet = CharSet.Auto, 
CallingConvention = CallingConvention.ThisCall)]
public static extern char CheckCard(int pccPortID, int pccdReaderID, int pccTimeout);
char pccCheckCard = CheckCard(3, 129, 1000);
Console.WriteLine(pccCheckCard);

但我没有得到真正的答案......

请帮帮我? :)

最佳答案

这里有很多问题。这是我所看到的:

  1. 编写的 Delphi 代码使用 Delphi register 调用约定。它只能从 Delphi 代码访问,不能通过 p/invoke 方法调用。但是,您可能在代码中省略了调用约定,而它实际上是 stdcall
  2. 您的 p/invoke 使用 CallingConvention.ThisCall 它肯定与任何 Delphi 函数不匹配。 Delphi 不支持该调用约定。
  3. 您将指向空终止字符数组的指针 PChar 错误翻译为 char(单个 UTF-16 字符)。
  4. Delphi 代码看起来很可疑。该函数返回PChar。那么,谁负责释放返回的字符串。如果 Delphi 代码返回一个指向字符串变量的指针,而该变量在函数返回时被销毁,我不会感到惊讶,这是一个非常常见的错误。
  5. 您使用相对路径引用 DLL。这是非常危险的,因为你无法轻易控制 DLL 是否会被找到。将 DLL 放在与可执行文件相同的目录中,并仅指定 DLL 的文件名。
  6. 没有看到任何错误检查。

可能有效的变体可能如下所示:

德尔福

function CheckCard(pPortID: LongInt; pReaderID: LongInt; pTimeout: LongInt): PChar; 
stdcall;

C#

[DllImport("RFID_107_485.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CheckCard(int pccPortID, int pccdReaderID, int pccTimeout);
....
IntPtr pccCheckCard = CheckCard(3, 129, 1000);
// check pccCheckCard for errors, presumably IntPtr.Zero indicates an error

// assuming ANSI text
string strCheckCard = Marshal.PtrToStringAnsi(pccCheckCard);
// or if the Delphi code returns UTF-16 text
string strCheckCard = Marshal.PtrToStringUni(pccCheckCard);

这使得如何释放返回的指针没有解决。您必须查阅该函数的文档才能找到答案。该问题包含的信息不足。

关于delphi - 如何使用Pchar函数来使用c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31155606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com