Доступ к LStrHandle в DLL

я делаю новое исследование о LabVIEW и DLL.
Я создал DLL, которую создал LabVIEW.

Это заголовочный файл.

#include "extcode.h"#pragma pack(push)
#pragma pack(1)

#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
int32_t numeric_input;
LStrHandle string_input;
} Cluster;

/*!
* Cluster_dll
*/
void __cdecl Cluster_dll(Cluster *Input, int32_t *numeric_output,
char string_output[], int32_t length);

MgErr __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module);

#ifdef __cplusplus
} // extern "C"#endif

#pragma pack(pop)

Чтобы назвать это, я создал программу Visual C ++.

#include "stdafx.h"#include <Windows.h>
#include <iostream>
#include <cstdint>
#include "C:\Program Files\National Instruments\LabVIEW 2014\cintools\extcode.h"using namespace std;

struct Input_t{
int32_t A;
LStrHandle B;
} variable_t;

typedef void (*FUNC)(Input_t,int32_t *,char [],int32_t);int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDLL = LoadLibrary(TEXT("C:\\Cluster_dll.dll"));
if(hDLL == NULL){
cout << "error" << endl; // error check
}FARPROC lpIO = GetProcAddress(HMODULE(hDLL),"Cluster_dll");

//define type
FUNC myFunc;
myFunc = FUNC(lpIO);

//define returned variable

Input_t Cluster;
Cluster.A = 1;
Cluster.B;

int32_t myValue = 0;
char str[10];

//call function
myFunc(Cluster,&myValue,str,10);FreeLibrary(hDLL);
return 0;
}

Я построил это и побежал. затем приложение упало.
Я думаю, я не могу правильно относиться к «LStrHandle».
это оригинальный тип данных, определенный LabVIEW.

typedef struct {
int32 cnt;  /* number of bytes that follow */
uChar str[1];  /* cnt bytes */
} LStr, *LStrPtr, **LStrHandle;

Я искал веб-страницу NI и некоторый веб-ресурс, но не смог решить проблему.

Пожалуйста, прокомментируйте, если у вас есть какие-либо советы.

-1

Решение

  1. если вы не используете сгенерированный заголовок, хотя бы вставьте #pragma pack(1)
  2. Ваша сгенерированная функция принимает указатель на Cluster, однако вы переопределяете его как принимающий сам кластер. Это ошибка. Вероятная коррекция:

    typedef void (*FUNC)(Input_t*,int32_t *,char [],int32_t);
    
  3. Все внутренние дескрипторы данных LabVIEW размещаются в куче с помощью функций менеджера памяти LabVIEW. То есть Вы не можете выделить Input_t Cluster в стеке и передать его сгенерированной LabVIEW функции.

Вы должны использовать что-то вроде этого:

Input_t *Cluster(DSNewPtr(sizeof(Input_t));
Cluster->A = 1;
Cluster->B = DSNewHandle(sizeof(LStr));

Вы также должны запрограммировать свою логику для проверки ошибок выделения памяти и правильного освобождения

1

Другие решения


По вопросам рекламы [email protected]