如何使用C++调用LabVIEW构建的DLL

Posted

技术标签:

【中文标题】如何使用C++调用LabVIEW构建的DLL【英文标题】:How to call a DLL built by LabVIEW with C++ 【发布时间】:2014-12-27 07:07:04 【问题描述】:

很高兴认识你! 这是我在 stacoverflow 上的第一篇文章。 我正在学习 C++ 和 LabVIEW,以供自己学习。

LabVIEW是图形设计编程环境,它可以从LabVIEW代码构建DLL。 “从 LabVIEW 代码创建 DLL” https://decibel.ni.com/content/docs/DOC-15556

我构建了一个简单的 DLL 并尝试从 C++ 代码中调用它。 我们可以通过 DLL 对 A 和 B 求和。 首先,我做了一个源代码如下。

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])

	HINSTANCE hDLL = LoadLibrary(TEXT("C:\\sum_dll.dll"));
		if(hDLL == NULL)
		cout << "error" << endl;
	
	
	FARPROC lpIO = GetProcAddress(HMODULE(hDLL),"Sum_dll");

	typedef int (*FUNC)(int a, int b);

	FUNC myFunc;
	myFunc = FUNC(lpIO);

	int myValue = myFunc(2,32);

	cout << myValue << endl;

	FreeLibrary(hDLL);
	return 0;



**************************** DLL header file ****************************

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

#ifdef __cplusplus
extern "C" 
#endif

/*!
 * Sum_dll
 */
int32_t __cdecl Sum_dll(int32_t A, int32_t B);

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

#ifdef __cplusplus
 // extern "C"
#endif

#pragma pack(pop)

*****************************************************************************

它运行良好,“myValue”的结果是 34 (2+32)。 没关系。

接下来,我把 dll 配置和 C++ 代码改成了傻瓜。

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;

typedef int (*FUNC)(int, int,int *);

int _tmain(int argc, _TCHAR* argv[])

	HINSTANCE hDLL = LoadLibrary(TEXT("C:\\sum_dll.dll"));
		if(hDLL == NULL)
		cout << "error" << endl;
	
	
	FARPROC lpIO = GetProcAddress(HMODULE(hDLL),"Sum_dll");
	
	FUNC myFunc;
	myFunc = FUNC(lpIO);

	
	cout << myFunc(2,3,0) << endl;

	//cout << "myValue = " << myValue << endl;

	FreeLibrary(hDLL);
	return 0;




**************************** DLL header file ****************************

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

#ifdef __cplusplus
extern "C" 
#endif

/*!
 * Sum_dll
 */
void __cdecl Sum_dll(int32_t A, int32_t B, int32_t *C);

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

#ifdef __cplusplus
 // extern "C"
#endif

#pragma pack(pop)

*****************************************************************************

“myValue”返回“0”。 它不是 expexted 结果,它应该返回 5 (2+3)。

我认为我的代码有问题,但我找不到原因。 如果您有任何建议,请发表评论。

谢谢!

【问题讨论】:

你已经在你的代码中注释掉了myValue。那么它怎么会返回0呢? myFunc 的第二个版本中的第三个参数表示什么?这应该是总和吗? 【参考方案1】:

假设myFunc 的第三个参数表示总和:

函数签名不匹配。 myFunc 返回 void,但你的函数指针 typedef 说它返回一个 int。执行此操作时行为未定义(我很惊讶程序没有崩溃)。

typedef void (*FUNC)(int32_t, int32_t, int32_t*);

此外,您应该完全匹配导出的 DLL 函数期望的类型。在 typedef 中,您说 int,但该函数采用 int32_t

鉴于上述修复,其他问题:

1) 调用应该传递myValue的地址

2) DLL函数返回void,所以在cout中使用没有意义。

myFunc(2,3,&myValue);
cout << "myValue = " << myValue << endl;

【讨论】:

【参考方案2】:

感谢您的评论。

我更改了我的 C++ 源代码如下。 没有崩溃并返回正确的值。

我相信我应该学习 C++ 指针和变量类型。 非常感谢!!

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <cstdint> //shoud be called to use int32_t
using namespace std;

//define the type of function
typedef void (*FUNC)(int32_t, int32_t,int32_t *);


int _tmain(int argc, _TCHAR* argv[])
// Loads the specified module into the address space of the calling process.
	HINSTANCE hDLL = LoadLibrary(TEXT("C:\\sum_dll.dll"));
		if(hDLL == NULL)
		cout << "error" << endl; // error check
	
	
	//Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).
	FARPROC lpIO = GetProcAddress(HMODULE(hDLL),"Sum_dll");
	
	//define type
	FUNC myFunc;
	myFunc = FUNC(lpIO);

	//define returned variable
	int32_t myValue;

	//call function
	myFunc(2,3,&myValue);

	cout << myValue << endl;

	FreeLibrary(hDLL);
	return 0;

【讨论】:

【参考方案3】:

直到我将 .lib 文件包含在项目属性->链接器->输入->延迟加载的 Dlls 中,它才起作用

【讨论】:

以上是关于如何使用C++调用LabVIEW构建的DLL的主要内容,如果未能解决你的问题,请参考以下文章

c++ dll的LabVIEW调用库节点错误1097

使用 opencv、dll、visual studio 和 labview 进行编程

Delphi调用C++编写的DLL

Java如何调用本地dll库里面的方法

一个工程怎么知道它调用了那些DLL

labview 中调用WebBrowser, postdata这里的数据要怎么处理, 求指教