2014-12-28 5 views
-1

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

Это файл заголовка.

#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 и некоторый веб-ресурс, но не смог решить проблему.

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

+0

Почему вы не используете сгенерированный заголовок. Также вы не должны передавать неопределенный указатель. По крайней мере, null. –

ответ

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

    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)); 

вы должны также запрограммировать вашу логику, чтобы проверить на наличие ошибок выделения памяти и собственных deallocations

Смежные вопросы