Получение структуры с DLL

ActiveX, .NET, DLL
Ответить
anda55
assistant
assistant
Сообщения: 149
Зарегистрирован: 19 янв 2012, 10:15
Версия LabVIEW: 2010-2012
Откуда: Киев
Контактная информация:

Получение структуры с DLL

Сообщение anda55 »

Всем привет
есть ключи защиты Guardant.
была разработана программа в LV которая использует для защиты API функции от этого ключей.
программа работает нормально.
Есть функция в API: GrdFind .
Функция GrdFind осуществляет поиск локальных и удаленных ключей, удовлетворяющим установленным критериям поиска:
int GRD_API GrdFind(
HANDLE hGrd,
DWORD dwMode,
DWORD *pdwID,
TGrdFindInfo *pFindInfo
);
где, pFindInfo - указатель на структуру типа TGrdFindInfo, в поля которой должны возвращаться данные о найденном ключе. Память для структуры должна быть выделена до вызова функции. В случае, если структура не используется, или не использование структур не поддерживается языком программирования, параметр pdwID должен быть равен NULL.

typedef struct {
DWORD dwPublicCode; // Public code
BYTE byHrwVersion; // Аппаратная версия ключа
BYTE byMaxNetRes; // Максимальный сетевой ресурс
WORD wType; // Флаги типа ключа
DWORD dwID; // ID ключа
BYTE byNProg; // Номер программы
BYTE byVer; // Версия
WORD wSN; // Серийный номер
WORD wMask; // Битовая маска
WORD wGP; // Счетчик запусков GP/Счетчик времени
WORD wRealNetRes; // Текущий сетевой ресурс, д.б. <= byMaxNetRes
DWORD dwIndex; // Индекс для удаленного программирования
BYTE abyReserved[0x200-0x1A]; // Зарезервировано
} TGrdFindInfo;

Как мне подключить эту структуру из LV к API функции, чтоб я увидел всю эту информацию в проекте LV?

Александр
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Получение структуры с DLL

Сообщение dadreamer »

Структура в :labview: является кластером, так что если вы хотите передать в функцию указатель на структуру, вам нужно создать кластерную константу и заполнить её согласно описанию типов. Заходите в описание типов Windows, смотрите обозначение типа и назначаете в :labview: такой же тип. Например, DWORD = 32-bit unsigned integer = U32. Если в структуре только числа, то всё достаточно просто.
Без имени-2.jpg
Однако, меня насторожило вот это:

Код: Выделить всё

BYTE abyReserved[0x200-0x1A]; // Зарезервировано
То есть, в конце структуры ещё нужно выделить массив U8 на 486 элементов... Массив :labview: использовать нельзя, у него другой тип. Можно, конечно, вставлять 486 констант U8 друг за другом :crazy: Или поставить только одну, если в API в эту область памяти ничего не пишется и оттуда не читается. Иначе будет access violation. Ну, или сделать вот так:
Untitled 1.vi
LV2010
(6.79 КБ) 176 скачиваний
Ещё вариант - выделить одну большую область памяти размером sizeof (TGrdFindInfo), передать на неё указатель в вашу функцию, а после вызова перемещать MoveBlock'ом обратно в :labview: , разбирая по частям.
Когда будете передавать в функцию кластер TGrdFindInfo, делайте в CLFN тип аргумента (Type) равным Adapt To Type, а формат данных (Data Format) - Handles By Value. :labview: в этом случае передает как раз указатель на struct.
anda55
assistant
assistant
Сообщения: 149
Зарегистрирован: 19 янв 2012, 10:15
Версия LabVIEW: 2010-2012
Откуда: Киев
Контактная информация:

Re: Получение структуры с DLL

Сообщение anda55 »

Большое спасибо
на работе буду пробовать
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приложениями»