C#调用C/C++ 动态链接库DLL(二)
来源:互联网 发布:域名top 编辑:程序博客网 时间:2024/05/23 18:58
此次示例包含了常用类型参数的转换及传递包括
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_Hextern 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 boolchar email[50];};extern bool __stdcall GetPerson(Person* p, char* name);extern int __stdcall SetEnable(bool enabled);#endif
因为要导出函数,还要创建一个导出文件dlldemo.def
LIBRARY dlldemoEXPORTSGetValuesPassStringPowerGetDistance1DGetDistance2DCopyValuesGetValueCopyArray2DCopyPointerArray2DGetPersonSetEnable
因为C++函数实际生成的名称与我们看到的名称是不一样的,所以直接在C++代码中使用__declspec(dllexport) 导出的函数在C#中找不到,需要用.def文件来实现。
- C#调用C/C++ 动态链接库DLL(二)
- C#调用C/C++ 动态链接库DLL(一)
- C#调用C/C++ 动态链接库DLL(三)
- C#调用C/C++动态链接库(.dll)详解
- C#调用C/C++动态链接库(.dll)详解
- C#调用C/C++ 动态链接库DLL(四) -- 调用C++类
- C#动态调用C++DLL
- C#调用C/C++动态链接库
- 【c#】C#调用matlab动态链接库
- 在C#中调用C语言写的动态链接库 DLL
- C#中调用C++ 动态链接库 dll 的方…
- C#中调用C++ 动态链接库 dll 的方…
- VC与Matlab混合编程之调用动态链接库dll(C++)——<二>
- C语言调用DLL动态链接库出错
- python 3 调用c/c++ 动态链接库 *.dll
- SAS中调用动态链接库(C++,DLL)
- python中调用动态链接库(C++,DLL)
- C#使用C/C++编译的动态链接库dll
- ARM920T的Cache
- ARM920T的MMU
- Oracle EBS各个模块日志收集的方法[Index]
- Gentoo使用WPA2-PSK
- 状态栏SystemUI的启动过程
- C#调用C/C++ 动态链接库DLL(二)
- MyEclipse内存溢出问题
- Vim配置
- PHP学习之一:PHP脚本、类型和变量
- UVa10026 - Shoemaker's Problem
- VC++图形平移功能的实现
- REST架构之Apache Wink介绍
- 随机函数
- PHP提取emule下载ed2k链接