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技术都全活了
...全文
140 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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写的

厉害...



友情帮顶.

111,097

社区成员

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

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

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