如何使用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的主要内容,如果未能解决你的问题,请参考以下文章