如何在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);
但我没有得到真正的答案......
请帮助我? :)答案 0 :(得分:1)
这里有很多问题。这就是我所看到的:
register
调用约定。这只能从Delphi代码访问,不能通过p / invoke方法调用。但是,您可能已从代码中省略了调用约定,实际上它是stdcall
。CallingConvention.ThisCall
肯定与任何Delphi函数都不匹配。 Delphi不支持该调用约定。PChar
,一个指向空终止字符数组的指针char
,一个UTF-16字符。PChar
。那么,谁负责释放返回的字符串。如果Delphi代码返回指向函数返回时被销毁的字符串变量的指针,我不会感到惊讶,这是一个非常常见的错误。可能有效的变体可能如下所示:
<强>的Delphi 强>
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);
这样就无法解析如何释放返回的指针。您必须查阅您的文档以了解该功能。该问题包含的信息不足。