Labview DLL Import
Labview DLL Import
我已经创建了一个虚拟项目(c++)"创建DLL"和为C_Wrapper编写:Myclass.h
#pragma once
//#include <QString>
class MyClass
{
public:
MyClass(double, double);
~MyClass();
double Add(double,double );
double Subst(double, double);
double Mult(double, double);
double Divid(double, double);
bool Vergleich(double,double);
long Avg_num(float *, long, float *);
unsigned int NumInteger(char * inputString);
//QString GibEinString(double, double);
private:
double m_a, m_b;
};
MyClass.cpp
#include "stdafx.h"
#include "MyClass.h"
MyClass::MyClass(double a,double b)
{
this->m_a = a;
this->m_b = b;
}
MyClass::~MyClass(){ }
double MyClass::Add(double a, double b)
{
return a+=b;
}
double MyClass::Mult(double a, double b)
{
return a*=b;
}
double MyClass::Subst(double a, double b)
{
return b-=a;
}
double MyClass::Divid(double a, double b)
{
return (b / a);
}
bool MyClass::Vergleich(double a,double b)
{
if(a>=b) return true;
else return false;
}
long MyClass::Avg_num(float *a, long size, float *avg)
{
float sum = 0;
if(a != NULL)
{
for(int i=0;i < size; i++)
sum = sum + a[i];
}
else
return (1);
*avg = sum / size;
return (0);
}
unsigned int MyClass::NumInteger(char * inputString)
{
int lastDigit = 0;
int numberOfNumbers = 0;
int stringSize;
stringSize = strlen(inputString);
for(int i = 0; i < stringSize; i++)
{
if (!lastDigit && isdigit(inputString[i]))
numberOfNumbers++;
lastDigit = isdigit(inputString[i]);
}
return numberOfNumbers;
}
C_Wrapper.h
#pragma once
#define DLLIMPORT __declspec (dllexport)
#ifdef __cplusplus
extern "C" {
#endif
typedef struct Wrapper
{
void *MYClass;
}Wrapper;
DLLIMPORT Wrapper createWrapper(double a, double b);
DLLIMPORT void destoryWrapper(Wrapper LV_ref);
DLLIMPORT double Add(Wrapper LV_ref, double a, double b);
DLLIMPORT double Subst(Wrapper LV_ref ,double a, double b);
DLLIMPORT double Mult(Wrapper LV_ref, double a, double b);
DLLIMPORT double Divid(Wrapper LV_ref, double a, double b);
DLLIMPORT bool Vergleich(Wrapper LV_ref, double a, double b);
DLLIMPORT long Avg_num(Wrapper LV_ref,float *a, long size, float * avg);
DLLIMPORT unsigned int NumInteger(Wrapper LV_ref, char * inputString);
#ifdef __cplusplus
}
#endif
C_Wrapper.cpp
#include "stdafx.h"
#include "MyClass.h"
#include "C_DllWrapper.h"
DLLIMPORT Wrapper createWrapper(double a, double b)
{
Wrapper wrapper = {static_cast<void*>(new MyClass(a,b))};
return wrapper;
}
DLLIMPORT void destoryWrapper(Wrapper LV_ref)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
delete myClass;
}
DLLIMPORT double Add(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Add(a, b);
}
DLLIMPORT double Mult(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Mult(a, b);
}
DLLIMPORT double Subst(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Subst(a, b);
}
DLLIMPORT double Divid(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Divid(a, b);
}
DLLIMPORT bool Vergleich(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Vergleich(a,b);
}
DLLIMPORT long Avg_num(Wrapper LV_ref,float *a, long size, float * avg)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Avg_num(a,size,avg);
}
DLLIMPORT unsigned int NumInteger(Wrapper LV_ref, char * inputString)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->NumInteger(inputString);
}
当我在Labview中导入DLL时,几乎做了所有事情。我的问题是指一个函数主要为:
DLLIMPORT Wrapper createWrapper(double a, double b)
{
Wrapper wrapper = {static_cast<void*>(new MyClass(a,b)) };
return wrapper;
}
如何在Labview中初始化?
谢谢
对于包含指针的结构体,您不能真正做到这一点,而是直接使用包装器函数中的指针,并在LabVIEW
中使用ptr类型。变成
typedef void* Wrapper;
DLLIMPORT double Mult(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = reinterpret_cast<MyClass*>(LV_ref);
return myClass->Mult(a, b);
}
DLLIMPORT Wrapper createWrapper(double a, double b)
{
Wrapper wrapper = reinterpret_cast<void*>(new MyClass(a,b));
return wrapper;
}
头文件
#pragma once
#ifdef __cplusplus
#endif
extern "C"__declspec(dllexport) void* createWrapper(double a, double b);
extern "C"__declspec(dllexport) void destoryWrapper(void *instance);
extern "C"__declspec(dllexport) double Add(void *instance, double a, double b);
……
#ifdef __cplusplus
#endif
源文件:#include "stdafx.h"
#include "MyClass.h"
#include "C_DllWrapper.h"
extern "C"__declspec(dllexport) void* createWrapper(double a, double b)
{
return new MyClass(a, b);
}
extern "C"__declspec(dllexport) void destoryWrapper(void *instance)
{
MyClass *myClass = static_cast<MyClass*>(instance);
delete myClass;
}
extern "C"__declspec(dllexport) double Add(void *instance, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(instance);
return myClass->Add(a, b);
}
…ok也是!!
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 如何检测#Import dll
- Labview DLL Import
- c++ to c# dll import ReadImage
- Import c++ DLL to c#