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

时间:2015-07-01 07:54:42

标签: delphi pinvoke dllimport

如何在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 个答案:

答案 0 :(得分:1)

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

  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. 没有错误检查可见。
  7. 可能有效的变体可能如下所示:

    <强>的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);
    

    这样就无法解析如何释放返回的指针。您必须查阅您的文档以了解该功能。该问题包含的信息不足。