Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2015, 11:35   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Подскажите с DllImport.

Здравствуйте. Нужно написать обертку для библиотеки из С++.

Вроде перевел как положено но при вызове процедур возникает ошибка
Сигнатура типа метода не совместима с PInvoke.


Код в си++
Код:
struct chip_callbacks {
  const char *(*strerror) (const nfc_device_t * pnd);
};

struct driver_callbacks {
  const char *acDriver;

  const struct chip_callbacks *pcc;  // ВОТ ТУТ НЕ ПОЙМУ КАК ПРАВИЛЬНО ПЕРЕНЕСТИ В ШАРП

  nfc_device_desc_t *(*pick_device) (void);

  bool (*list_devices) (nfc_device_desc_t pnddDevices[], size_t szDevices, size_t * pszDeviceFound);

  nfc_device_t *(*connect) (const nfc_device_desc_t * pndd);

  bool (*transceive) (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTxLen, byte_t * pbtRx, size_t * pszRxLen);

  void    (*disconnect) (nfc_device_t * pnd);
};

typedef struct {
  const struct driver_callbacks *pdc;
  char    acName[DEVICE_NAME_LENGTH];
  nfc_chip_t nc;
  nfc_device_spec_t nds;
  bool    bActive;
  bool    bCrc;
  bool    bPar;
  bool    bEasyFraming;
  uint8_t ui8TxBits;
  int     iLastError;
} nfc_device_t;
вот как я его переписал:

Код:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    struct chip_callbacks
    {
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate string strerror(ref nfc_device_t pnd);
    };

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    internal struct driver_callbacks
    {
        public string acDriver;
        public chip_callbacks pcc; // ПОЭТОМУ ПЕРЕНЕС ПРОСТО КАК СТРУКТУРУ

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate nfc_device_desc_t pick_device();

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate bool list_devices(nfc_device_desc_t[] pnddDevices, UInt32 szDevices,ref UInt32 pszDeviceFound);

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate nfc_device_t connect(ref nfc_device_desc_t pndd);

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate bool transceive(ref nfc_device_t pnd, [In, Out]  byte[] pbtTx, UInt32 szTxLen, byte[] pbtRx, ref  UInt32 pszRxLen);

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void disconnect(ref nfc_device_t pnd);
    };

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    internal struct nfc_device_t
    {
        public driver_callbacks pdc;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string acName;

        public byte nc;
        public IntPtr nds;// nfc_device_spec_t 
        public bool bActive;
        public bool bCrc;
        public bool bPar;
        public bool bEasyFraming;
        public byte ui8TxBits;
        public int iLastError;

    }

функции
Код:
__declspec(dllimport) nfc_device_t *nfc_connect (nfc_device_desc_t * pndd);

[DllImport("nfc.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern nfc_device_t nfc_connect(ref nfc_device_desc_t pndd);

То есть описание устройств (nfc_device_desc_t ) нормально получаю. Потом пытаюсь подключится и получаю ошибку сигнатуры. Может я где то ошибся??
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[DllImport("kernel32.dll", SetLastError = true)] Eustacce C# (си шарп) 0 11.10.2014 11:38
Dllimport delphi C# Andreip C# (си шарп) 1 18.09.2014 22:41
DllImport и Windows 8 FaTaL C# (си шарп) 8 12.04.2013 10:19
DllImport, момент связывания, отсутствие dll. Пепел Феникса Общие вопросы .NET 4 17.03.2011 23:36
DllImport + C/C++ BOBAH13 Общие вопросы .NET 2 05.01.2010 18:15