博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)
阅读量:5078 次
发布时间:2019-06-12

本文共 2487 字,大约阅读时间需要 8 分钟。

      额。。。刚开始信誓旦旦说要写launcher制作的博客,还没写完就被抛到脑后了真是没毅力。最近把之前写的wpf的launcher改成了mfc版,遇到很多问题,写了三个星期才写完,好好记录一下吧。我也想把wpf版的写完,毕竟过了快一年了。。。。。。我就决定在mfc版中穿插两种方式的对比把我想要写的比较让我头疼的地方写出来吧。

     首先说一下改成C++版主要是因为wpf需要的框架支持很多,有的电脑上没有的话就启动不了。mfc也需要很多的库支持,为了避免这个问题我们只能用静态库的方式了,大是大了点但是经过各种设置之后还是可以接受的大小范围。

     流程还是那些,下载、解压、进程通信。mfc比较麻烦的是界面的东西。

     我用的是对话框,静态库。创建好之后他会自动生成两个类,dlg类和app类。

     进程通信在mfc中没什么好写的,腾讯给的有mfc版demo基本可以直接拷贝过来。但有一个很重要的点就是进程通信一定要放到主线程里,mfc的话就放到dlg类里面,因为线程之前要交互的话也需要通信,所以如果放在其他的线程那么你的主线程是没办法收到消息的。这个是我在用wpf写的时候所遇到的问题,当时我把进程通信单独的放到一个线程里导致我收不到qq大厅发过来的消息。     

      wpf中比较值得说的就是把进程通信再封装成了一个C++dll,因为涉及到继承一个C++进程通信消息事件类,而c#是不能直接继承C++类的,所以我的做法是用C++再封装一层。里面比较值得说的是回调函数。C#中只有委托不存在回调函数这一说。所以有一个注册回调的函数把C#中委托的地址传入保存下来,在C++中调用。

      直接上代码吧感觉说不清楚。

     .h文件中加入一个函数指针用来保存回调函数的地址。

void(CALLBACK *CallFuct) (IClientProcMsgObject *pProcMsgObj);void OnConnectSucc(IClientProcMsgObject* pClientProcMsgObj);

  .cpp中调用。

void SetEventHandler::OnConnectSucc(IClientProcMsgObject* pClientProcMsgObj){	CallFuct(pClientProcMsgObj);}

  然后把注册回调的函数设置成extern "C",C#调用的时候就可以把委托函数的地址传入了。

extern "C" __declspec(dllexport) bool CreateEventHandler(      /*创建事件回调*/	void(CALLBACK *CallFuct) (IClientProcMsgObject *pProcMsgObj),	void(CALLBACK *CallFuct1) (IClientProcMsgObject *pProcMsgObj, DWORD dwErrorCode),	void(CALLBACK *CallFuct2) (IClientProcMsgObject *pProcMsgObj),	void(CALLBACK *CallFuct3) (IClientProcMsgObject *pProcMsgObj, long lRecvLen, const BYTE* pRecvBuf)){	m_pEventHandle = new SetEventHandler;	m_pEventHandle->CallFuct = CallFuct;	m_pEventHandle->CallFuct1 = CallFuct1;	m_pEventHandle->CallFuct2 = CallFuct2;	m_pEventHandle->CallFuct3 = CallFuct3;	if (m_pEventHandle == NULL)	{		OutFile("创建事件失败");		return false;	}		OutFile("成功创建事件");	return true;}

     在C#中使用C++dll。

     加入using System.Runtime.InteropServices;

[DllImport("ProcessCommunication.dll", CharSet = CharSet.Auto, ExactSpelling = true)]        private static extern bool CreateEventHandler(ProcCommunication.FuncOnConnectSucc _FuncOnConnectSucc,            ProcCommunication.FuncOnConnectFailed _FuncOnConnectFailed,            ProcCommunication.FuncOnConnectionDestroyed _FuncOnConnectionDestroyed,            ProcCommunication.FuncOnReceiveMsg _FuncOnReceiveMsg);

  

public delegate void FuncOnConnectSucc(IntPtr _pObject);public static FuncOnConnectSucc OnSuccQQ = null; OnSuccQQ = this.OnConnectSucc;  //OnConnectSucc是一个回调函数的功能实现

把这个delegate委托传入就大功告成了。

感觉虽然这一篇大部分都在写C#。。。。。。mfc的进程通信真的没什么要写的。。。。。。

哦还有一点很重要的就是C#使用C++的dll注意数据类型的转换,百度都会告诉你该怎么转的。。。。。。

     

    

转载于:https://www.cnblogs.com/shellxi/p/6383380.html

你可能感兴趣的文章
synchronized
查看>>
codevs 1080 线段树练习
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
QML学习笔记之一
查看>>
Window 的引导过程
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>