Как передать параметр типа указатель на PVOID из LabVIEW в DLL?

#c #pointers #dll #parameter-passing #labview

#c #указатели #dll #передача параметров #labview

Вопрос:

Я вызываю DLL, написанную на C , из LabVIEW. Прототип функции:

 ULONG DAQ_Open(PVOID *pHandle);
  

Как я могу передать правильный параметр из LabVIEW? Неужели просто невозможно передать параметры типа pointer в pointer из LabVIEW в DLL?

Комментарии:

1. Как насчет приведения вашего параметра к PVOID* ? Или привести адрес вашего параметра к PVOID* ?

2. извините за оффтоп, но я не совсем понимаю, в чем преимущество наличия void ** вместо void * ?

3. @GreenScape, в системе Windows фактический тип идентификатора ресурса — PVOID . Функция DAQ_Open пытается получить дескриптор, представляющий некоторый ресурс. Поскольку возвращаемое значение использовалось в качестве кода ошибки, PVOID* является единственным выбором.

Ответ №1:

Пока вы не ожидаете передачи указателя на LabVIEW VI для использования в качестве обратного вызова (что является отдельным и гораздо более сложным ответом), параметр — это просто указатель. При настройке узла библиотеки вызовов используйте тип «числовой» и тип данных «целое число без знака размером с указатель» и передайте «указатель на значение».

Это должно дать вам прототип: void funcName(uintptr_t *arg1);

Ответ №2:

Для получения дополнительных примеров вызова DLL-файлов из LabVIEW (включая указатели, структуры, массивы и т. Д.), Вот удобная статья, Которая ссылается на несколько других подробных примеров: https://decibel.ni.com/content/docs/DOC-9076

Ответ №3:

Вам следует поискать «указатели DLL labview» на веб-сайте NI, чтобы получить представление. Кроме того, есть пример, поставляемый с LabVIEW, называемый Call DLL.vi в котором есть примеры того, как вы можете этого добиться. Пример VI можно найти, перейдя в раздел Справка -> Найти примеры, а затем выполнив поиск DLL.

Вызов DLL.vi VI позволяет просматривать примеры типов данных внешнего кода (C и C ) и то, как они взаимодействуют с LabVIEW. У каждого типа данных есть пример VI, который демонстрирует использование узла функции библиотеки вызовов. Чтобы открыть пример VI для определенного типа данных, выберите этот тип данных из списка слева, а затем нажмите кнопку «Открыть пример VI для текущего типа данных». Прототип функции, исходный код функции и любые конкретные сведения об этом примере появятся в кластере информации о внешнем коде.

Комментарии:

1. Привет, Аднан, спасибо за твой ответ. В вызове нет эквивалента LPVOID ** DLL.vi . подход flndr решает эту проблему.