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

时间:2014-12-27 07:07:04

标签: c++ dll call labview

很高兴见到你! 这是我发给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 ++代码更改为foolows。

#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”。 它没有被取消结果,它应该返回5(2 + 3)。

我认为我的代码存在问题,但我无法找出导致此问题的原因。 如果您有任何建议,请发表评论。

谢谢!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

感谢您的评论。

我按如下方式更改了我的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;
}

答案 2 :(得分:0)

直到我将.lib文件包含在项目属性中 - > gt; linker-&gt; Input-&gt; Delay Loaded Dlls

之后才能工作