Проблемы с типами данных из внешних dll - PullRequest
3 голосов
/ 25 февраля 2010

Я использую MipRc500.dll от Philip для связи с чипами RFID. Он содержит функцию для чтения данных, которая определяется следующим образом:

signed char Mf500PiccRead(unsigned char addr, unsigned char * data)

Я использую его в VB.NET так:

Private Declare Function RFID_PiccRead Lib "MfRc500.dll" Alias "_Mf500PiccRead@8" (ByVal addr As UShort, ByRef value As Long) As Short

и затем обертка:

Public Function PiccRead(ByVal addr As UShort, ByRef value As Long) As Short
    Return RFID_PiccRead(addr, value)
End Function

Второй параметр в функции Mf500PiccRead может возвращать «16-байтовый блок данных», поэтому мой длинный тип данных слишком мал. Если я использую byte () вместо long, тогда я получаю исключение ExecutionEngineException.

Какой тип данных мне следует использовать и как?

Ответы [ 3 ]

3 голосов
/ 25 февраля 2010

Последний аргумент - это Byte (). ExecutionEngineException указывает, что куча мусора была повреждена. Обязательно передайте инициализированный массив, достаточно большой, чтобы содержать ответ:

    Dim buffer(666) As Byte
    Dim retval As SByte = RFID_PiccRead(42, Buffer)
...
  Private Declare Function RFID_PiccRead Lib "MfRc500.dll" Alias "_Mf500PiccRead@8" _
     (ByVal addr As Byte, Byval buffer() As Byte) As SByte
1 голос
/ 25 февраля 2010

A char эквивалентно Byte, поэтому некоторые другие части вашего заявления также неверны.

Я рекомендую использовать PInvoke Interop Assistant для автоматического преобразования заголовка C в объявления VB.Net PInvoke.

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

Private Declare Function RFID_PiccRead Lib "MfRc500.dll" _ 
  Alias "_Mf500PiccRead@8" (ByVal addr As Byte, ByRef value() As Byte) As Byte 

Обязательно передайте 16-байтовый массив для второго параметра, и я думаю, что он должен работать.

0 голосов
/ 25 февраля 2010

попробуйте использовать Int или Integer вместо короткого.

Закрытое Объявление функции RFID_PiccRead Lib "MfRc500.dll" Псевдоним "_Mf500PiccRead @ 8" (ByVal addr As UShort, значение ByRef As Long) Как Int или использовать Integer

Открытая функция PiccRead (ByVal addr As UShort, значение ByRef As Long) как Int inter Integer Возврат RFID_PiccRead (адрес, значение) Конечная функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...