C#调用C++dll的问题(高手入,如果你C++没有我这样的输出接口,你可能能学到点东西哦)

charm 2010-06-29 11:24:42
我这里的代码样子都是表示个意思,实际比这复杂多了,但是基本同理(请不要试图编译这个代码,你要是编译,可能需要修改修改,我直接在notepad写的)


dll的输出头文件定义:

//对象驱动接口,仅仅是接口,没有export,因为提供了头文件,应用程序可以使用
class CClassCallback
{
public:
virture HRESULT OnAdded() = 0;
virture HRESULT OnDeled() = 0;
virture HRESULT OnFailed() = 0;
};

//
struct SAtype
{
CString strTest;
int nTest;
CClassCallback* pClassCallback;
};

//类接口,类似COM的接口,没有export,因为提供了头文件,应用程序可以使用
class CTestInterface
{
public:
virture HRESULT Test1(SAtype* pTest) = 0;
virture HRESULT Test2() = 0;
virture void Release() = 0;
};

输出函数export:CTestInterface* ConstructInterface(); //仅仅这个函数是输出的

在dll的实现类似如下:

class CTestObject:public CTestInterface
{
public:
HRESULT Test1(SAtype* pTest)
{
m_sType = *pTest;
}
HRESULT Test2()
{

}
void Release()
{
delete this;
}
private:
void InnerDemoFuc()
{
if(true)
{
m_sType.pClassCallback->OnAdded();
}
}
SAtype m_sType;
}

CTestInterface* ConstructInterface()
{
return new CTestObject();
}


在C++的App中一般这么使用:

(1)派生一个CClassCallback子类

class CClassCallbackEx:public CClassCallback
{
public:
CClassCallbackEx();

virture HRESULT OnAdded()
{
.....//干些通知的业务的活
}
virture HRESULT OnDeled()
{
}
virture HRESULT OnFailed()
{
}
}

(2)如下使用:
CTestInterface* m_pInterface = ConstructInterface(); //调用输出函数创建对象,获取外部接口
SAtype sAtype;
sAtype->pClassCallback = new CClassCallbackEx(); //设置回调驱动对象(我使用对象驱动,非函数驱动)
m_pInterface->Test1(&sAtype); //调用某个函数

。。。。。
m_pInterface->Relese();
m_pInterface=NULL; //在合适的时候释放对象


现在我要想在C#的界面程序中使用这个dll,这么弄啊?
我搜了一下,如果我这个东西弄好的话,所以C#调用C++的dll技术都全活了
...全文
135 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
charm 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sillendliu 的回复:]
public static class dllMapping
{
[DllImport("aaaa.dll", EntryPoint = "FunName", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool FunName();
}
……
[/Quote]

要是有你这么简单的我就不在这问了。

你可能没有仔细看我的内容
Sillen 2010-06-30
  • 打赏
  • 举报
回复
public static class dllMapping
{
[DllImport("aaaa.dll", EntryPoint = "FunName", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool FunName();
}

翻了一下公司项目的码子,有这么个Mapping的类是调C++dll的,你看看
longhair9711 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cpp_yangzuoshi的回复:]
我直接在notepad写的
[/Quote]

太强了
zjtpiaoxue 2010-06-30
  • 打赏
  • 举报
回复

你在C#中调用的 是C++ 写的一个动态库。比如Kernel32.dll 中的 函数;
这个函数用C++写 有如下要求:
1、 必须为全局函数
2、 函数参数 必须为基本类型,也就是C++ 和C#都有的类型,


使用InteropSignatureToolkitSetup工具 可以帮助你简单实现PInvoke对DLL的包装。
具体参照
http://hi.baidu.com/yuye3618447378/blog/item/56b6ac47ab469c036b63e586.html
Sillen 2010-06-29
  • 打赏
  • 举报
回复
等待高手登场
Sillen 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cpp_yangzuoshi 的回复:]
我直接在notepad写的

[/Quote]

写码子的较高境界
Yanger_xy 2010-06-29
  • 打赏
  • 举报
回复
我直接在notepad写的

厉害...



友情帮顶.
量Http、FTP多线程断续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。量Http/FTP下载组件(DLL)支持多线程、断续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。 量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用量Http/FTP组件的功能简介: 标准Http和FTP下载支持:完全标准的Http和FTP协议支持,内部通过网址自动区分是Http还是FTP下载。 极速下载(2.0以后版本):超越国内绝大多数下载软件的下载速度。新版内核在2M ADSL的环境下下载,有些文件的速度可以达到1400K字节/秒以上,超过了带宽的极限。下载速度可以用极速形容。 多线程传输:可以将文件自动分块,并采用多线程下载。并可自由设置线程数目。 断续传:量Http/FTP有优秀的断续传支持,每次启动自动从上次下载的位置开始,不需要重复下载。 提供详细的下载详情接口(2.0以后版本):可以看到整个下载过程的步骤,比如开启了多少线程、服务器的应答过程、错误信息等。 支持多种高级设置:设置线程数目、磁盘缓存大小、搜索镜像服务器的详细参数设置、下载文件完成后同步文件为服务器上的文件时间、下载过程中可以自定义文件临时后缀、未完成的文件设为隐藏属性。 支持磁盘缓存:量Http/FTP下载DLL支持设置磁盘缓存,减少对磁盘的读写,并提升下载速度。 支持设置Refer:量Http/FTP下载组件支持设置下载时的Refer,以便可以绕过一些防盗链的网站,直接下载内容。 限速功能:量Http/FTP下载组件可方便的设置下载限速。 多种磁盘分配方式:量Http/FTP下载组件支持预分配和边下载边分配两种磁盘方式,满足多种下载需求。 自动搜索镜像加速:量Http/FTP内置了镜像搜索功能,在下载文件的同时,会自动搜索哪些其它网站还有这个文件,自动从其它网址下载加速。 可提供源码:支付一定的费用,便可以获得全部的量Http/FTP下载组件的源代码,免除您的所有后顾之忧。 良好的服务:作为量软件旗下的软件,可享受到量软件的优秀服务,我们的服务让您如同拥有一个称心的专业员工。 量Http/FTP 下载组件可以适用于任何Http和FTP下载的领域,让您可以在1天内完成一个完整的Http下载软件的全部功能。比如,您可以用于产品的升级、文件的下载和传输等。

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧