此次示例包含了常用类型参数的转换及传递包括
1) 基本类型:int, unsigned char, float, double等
2) 指针类型;
3) 引用
4) 一维数组、二维数组
5) 简单结构体
6) 结构体中包含数组
7) 字符串类型
8) bool类型
后续再进行其它 类型的封装,如
9) 函数指针与回调函数
10) 类
下面结合代码对这些类型
1。 创建一个C++ 动态链接库的工程
实现文件dlldemo.cpp,内容如下
#include <stdlib.h>
#include <iostream>
#include <cmath>
#include "dlldemo.h"
int __stdcall PassString(char* msg)
{
std::cout<<"msg:"<<msg<<std::endl;
return 0;
}
long double __stdcall Power(double x, int y)
{
return pow(x, y);
}
double __stdcall GetDistance2D(Location p1, Location p2)
{
return sqrt( (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y) );
}
int __stdcall GetDistance1D(int x1, int x2)
{
return abs(x1 - x2);
}
int __stdcall GetValues(int **values,int width, int height)
{
if( values == NULL || *values == NULL)
return -1;
for(int i=0; i<width; ++i){
for(int j=0; j<height; ++j){
values[i][j] = i*j;
}
}
return width * height;
}
int __stdcall CopyValues(int* dst, int* src, int length)
{
if( dst == NULL || src == NULL || length < 0)
return -1;
memmove(dst, src, sizeof(int)*length);
return length;
}
int __stdcall GetValue(int& dst)
{
return dst = 0x1155;
}
int __stdcall CopyArray2D(unsigned char** dst, unsigned char** src, int m, int n)
{
if(dst == NULL || src == NULL || m <= 0 || n <= 0)
return -1;
memmove(dst[0],src[0],m * n * sizeof(unsigned char));
return m * n;
}
int __stdcall CopyPointerArray2D(unsigned char** dst, unsigned char** src, int m, int n)
{
if(dst == NULL || src == NULL || m <= 0 || n <= 0)
return -1;
for(int i=0; i<m; ++i){
for(int j=0; j<n; ++j){
dst[i][j] = src[i][j];
}
}
return m * n;
}
bool __stdcall GetPerson(Person* p, char* name)
{
if( name == NULL || p == NULL)
return false;
p->age = sizeof(bool);
p->age = 100;
strcpy(p->name, "Steve Jobs");
strcpy(p->email, "Steve.Jobs@apple.com");
p->isFemale = 0;
return true;
}
int __stdcall SetEnable(bool enabled)
{
return enabled;
}
头文件dlldemo.h内容如下:
#ifndef DLLDEMO_H_H
#define DLLDEMO_H_H
extern int __stdcall GetValues(int **values,int width, int height);
extern int __stdcall PassString(char* msg);
extern long double __stdcall Power(double x, int y);
struct Location{
int x;
int y;
};
double __stdcall GetDistance2D(Location p1, Location p2);
int __stdcall GetDistance1D(int x1, int x2);
extern int __stdcall CopyValues(int* dst, int* src, int length);
extern int __stdcall GetValue(int& dst);
extern int __stdcall CopyArray2D(unsigned char** dst, unsigned char** src, int m, int n);
extern int __stdcall CopyPointerArray2D(unsigned char** dst, unsigned char** src, int m, int n);
struct Person{
char name[20];
unsigned char age;
bool isFemale; // can NOT be bool
char email[50];
};
extern bool __stdcall GetPerson(Person* p, char* name);
extern int __stdcall SetEnable(bool enabled);
#endif
因为要导出函数,还要创建一个导出文件dlldemo.def
LIBRARY dlldemo
EXPORTS
GetValues
PassString
Power
GetDistance1D
GetDistance2D
CopyValues
GetValue
CopyArray2D
CopyPointerArray2D
GetPerson
SetEnable
因为C++函数实际生成的名称与我们看到的名称是不一样的,所以直接在C++代码中使用
__declspec(dllexport) 导出的函数在C#中找不到,需要用.def文件来实现。
分享到:
相关推荐
c++动态库调用另一个动态库 c++动态库调用c动态库 c#等其他语言调用c/c++动态库
C#可以通过P/Invoke调用C/C++写的DLL,一般在从DLL接收字符串时比较麻烦,本人在某个项目中遇到这个问题, 从DLL收读取字符串时遇到中文乱码,这里总结一下C#收取字符串时的处理。 C/C++字符串一般通过char* ...
在C#开发软件的过程中,要经常调用C/C++生成的dll,本文主要介绍用C/C++生成dll的步骤,以及用C/C++、C#两种语言实现dll的引用实现。本文使用的IDE是VS2019,文章通过具体实例进行讲解,大家可以跟着自己动手进行...
1.C#调用C++封装的动态库dll 2.结构体含union共同体的C++转C#示例 3.C#结构体指针的调用演示 4.C#读取USB数据设备的示例 5.C#动态调用C++dll库示例 6.C#静态调用C++dll库示例 注意:UsbLibDotNet使用时候需要先安装...
C#使用CLR调用C++的DLL库的windows完整解决方案 说明如下: 1、工程一:C++的DLL 2、工程二:C++的CLR的类库 3、工程三:C#的exe
C#调用C++中动态链接库DLL中的结构体使用方法,范例。。。
c#调用c++ 动态链接库 dll
实例代码说明如何在托管的C#代码中调用非托管的Win32 API或者自己用C/C++写的Dll中的函数,以及如何传递输入、输出字符串参数,结构类型参数等问题。
c#开发框架下调用c++开发的dll动态库,实现跨语言开发功能。
c#调用c++DLL,DLL里是二维数组 ,c#里如何调用二维数组
C#调用C++动态链接库DLL的方法大全[归纳].pdf
C#动态调用DLL文件(有的DLL是用C++或其它语言写的不能直接调用,但可以用态调用)
资源代码演示的是c#代码调用c++ DLL 的方式。该演示为原创,绝非搬砖。解决了c# 调用 C++ Dll获取相关信息之如何传递结构体数组引用以及如何处理获取到的结构体数组数据的问题。
演示c# 通过设置DLL文件 生成操作 为 嵌入的资源 后,DLL文件嵌入生成的EXE里,然后动态调用DLL,妈妈再也不用担心我找不到DLL文件了
C#调用C++DLL的参数传入,传出,string类型的传出等 1.数据类型转换问题 2.指针或者地址传送问题
electron实战项目集成了串口通信、C#动态库dll调用、C++动态链接库dll调用、本地数据关系数据库SQLit3、执行cmd命令(启动nginx、本地mysql数据库等)、系统通知
本解决方案包含两个工程,一个是生成动态链接库dll(Mydll),一个工程test_mydll用于调用生成的动态链接库mydll.dll,适合初学者
C++调用C#的DLL实例程序,压缩包中包含部分程序说明,很小的几行代码,但是C++调用C#的DLL目的已经达到。
本例子适用范围:程序初学者。...2.c# 调用 QT C++ Dll (QT 工程中提供了 QTC++调用QTC++DLL例子) CSharp_Call_Cplusplus_Dll 例子: 针对2说明,目前只实现了网络连接,数据发送暂不行 能力有限,不喜勿碰,仅供参考