2016-11-03 17 views
0

Я пытаюсь вызвать DLL (созданную с помощью LabView) из .NET. Мне удалось использовать большинство методов, но для ввода требуется массив строк.Использование LStrHandleArray в .NET

Labview якобы использует соглашения о вызовах C при создании библиотеки DLL, но прототип функции не использует указатель обугленного, как я бы ожидать, но скорее LStrHandleArray:

void SetOutputUnits(LStrHandleArray *OutputUnits) 

Кто-нибудь знает, что ссылка мне нужно включить, чтобы быть можно использовать LStrHandleArray из .NET?

Googling LStrHandleArray дает только 19 результатов, большинство из которых остались без ответа на другие форумы. Я добавил каждую ссылку на National Instruments, о которой я могу думать, но я не вижу LStrHandleArray, и я не могу найти документацию на нем в Интернете.

ответ

0

Определение типа заключается в следующем:

/** @brief Long Pascal-style string types. */ 
typedef struct { 
    int32 cnt;  /* number of bytes that follow */ 
    uChar str[1];  /* cnt bytes */ 
} LStr, *LStrPtr, **LStrHandle; 
typedef struct _LStrArray { 
    int32 nElts; 
    LStrHandle str[1]; 
} LStrArray, **LStrArrayHandle; 

Обратите внимание, что использование 1 является метод С, чтобы сделать тип массива быть выделен плоский инлайн, а не в виде отдельного указателя. Такое же объявление используется независимо от длины массива или длины строки. Вы выделяете достаточную память для размещения полного размера массива/строки ... индексы намеренно выходят за пределы объявленного размера выделения. Это нечто неслыханное в управляемых языках, но это низкоуровневое структурное объявление, которое использует компилятор.

Для вызова из .NET-кода вам необходимо создать DLL-оболочку, которая принимает сплющенную форму данных, которые вы маршалируете в виде строки или другой упорядоченной структуры данных, а затем unflatten \ construct в коде на C++. И дескриптор массива, и внутренние дескрипторы строк должны быть выделены с помощью DSNewHandle() или DSNewHClr() из файла заголовка extcode.h, чтобы они находились в пространстве памяти, которое LabVIEW может манипулировать.

This example показывает, что вызывает DLL из другой библиотеки DLL, но имеет и другое полезное обсуждение.

PS: LabVIEW Использует условные обозначения C. Это относится к порядку параметров в стеке и тому факту, что структуры данных все определяются с помощью PODs (plain old C data types). Это не означает ничего о структурах данных, используемых в интерфейсах.