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)。
我认为我的代码存在问题,但我无法找出导致此问题的原因。 如果您有任何建议,请发表评论。
谢谢!
答案 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
之后才能工作