2015-07-01 2 views
3

Как использовать эту функцию в C#?Как использовать функцию Pchar для использования 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

Здесь много проблем. Это то, что я могу видеть:

  1. В коде Delphi, как написано, используется соглашение о вызове Delphi register. Это доступно только из кода Delphi и не может быть вызвано методом p/invoke. Тем не менее, возможно, что вы опустили соглашение о вызове из кода, и это действительно stdcall.
  2. Ваш p/invoke использует CallingConvention.ThisCall, который определенно не соответствует функции Delphi. Это соглашение о вызове не поддерживается Delphi.
  3. Вы mistranslate PChar, указатель на массив символов с нулевым символом, как char, один символ UTF-16.
  4. Код Delphi выглядит подозрительно. Функция возвращает PChar. Ну, кто несет ответственность за освобождение возвращаемой строки. Я бы не удивился, если бы код Delphi возвращал указатель на строковую переменную, которая уничтожается при возврате функции, очень распространенная ошибка.
  5. Вы ссылаетесь на DLL, используя относительный путь. Это очень рискованно, потому что вы не можете легко контролировать, будет ли найдена DLL. Поместите DLL в тот же каталог, что и исполняемый, и укажите только имя файла DLL.
  6. Ошибка проверки будет виден.

вариант, который мог бы работать может выглядеть следующим образом:

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

Это оставляет нерешенным, как освободить указатель, возвращаемый. Вам нужно будет проконсультироваться с вашей документацией, чтобы найти эту функцию. Вопрос содержит недостаточную информацию.

+0

спасибо за все поддерживаемыеdddd :) проблема решена ... –

Смежные вопросы