访问DLL中的LStrHandle

时间:2014-12-28 07:20:01

标签: c++ dll call labview

我正在研究LabVIEW和DLL。 我创建了一个由LabVIEW构建的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;
}

我建造并跑了。然后应用程序崩溃了。 我想我不能治疗&#34; LStrHandle&#34;正确。 它是LabVIEW定义的原始数据类型。

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

我查找了NI网页和一些网络资源,但无法解决崩溃问题。

如果您有任何建议,请发表评论。

1 个答案:

答案 0 :(得分:1)

  1. 如果您未使用生成的标头,请至少插入#pragma pack(1)
  2. 您生成的函数接受指向Cluster的指针,但是您将其重新定义为接受群集本身的指针。这是个错误。可能的纠正:

    typedef void (*FUNC)(Input_t*,int32_t *,char [],int32_t);
    
  3. 所有内部LabVIEW数据句柄都通过LabVIEW内存管理器功能分配到堆上。即你不能在堆栈上分配Input_t Cluster并将其传递给LabVIEW生成的函数。

  4. 你必须使用类似的东西:

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

    您还应该编写逻辑以检查内存分配错误和正确的解除分配