我正在研究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网页和一些网络资源,但无法解决崩溃问题。
如果您有任何建议,请发表评论。
答案 0 :(得分:1)
#pragma pack(1)
您生成的函数接受指向Cluster的指针,但是您将其重新定义为接受群集本身的指针。这是个错误。可能的纠正:
typedef void (*FUNC)(Input_t*,int32_t *,char [],int32_t);
所有内部LabVIEW数据句柄都通过LabVIEW内存管理器功能分配到堆上。即你不能在堆栈上分配Input_t Cluster
并将其传递给LabVIEW生成的函数。
你必须使用类似的东西:
Input_t *Cluster(DSNewPtr(sizeof(Input_t));
Cluster->A = 1;
Cluster->B = DSNewHandle(sizeof(LStr));
您还应该编写逻辑以检查内存分配错误和正确的解除分配