额。。。刚开始信誓旦旦说要写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注意数据类型的转换,百度都会告诉你该怎么转的。。。。。。

微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)的更多相关文章

  1. 微端游戏启动器launcher的制作(序篇)

    公司要做一个游戏接入腾讯QQ游戏大厅,腾讯要求制作一个launcher,公司之前并没有接入过腾讯,所以大家其实都不懂,而我又是新人,所以刚拿到这个任务的时候整个人就是一个大写的懵逼.在网上查找了不少的 ...

  2. 微端游戏启动器launcher的制作之下载篇(系列一)

    首先第一篇先讲一讲launcher最核心的功能---下载功能. 这个部分估计得好几篇才能写完,东西比较多也比较杂,慢慢来吧,我的东西也在继续改进中...... 从web上下载文件需要用到几个类,Htt ...

  3. 微端启动器LAUNCHER的制作之MFC版二(下载)

    用了C#再回来用C++写真的有一种我已经不属于这个世界的感觉.C++的下载就没有C#那么方便了,我用的是libcurl.dll,官网上下载的源码自己cmake出来编译的,c++的库引用有debug和r ...

  4. Unity下的开发框架--适应web和微端游戏异步资源请求的框架

    一.   内容简介: 1.   框架对Web与微端游戏特性的支持: Web和微端游戏最重要的特性是,资源是持续从服务器上即时下载下来的.而保证体验流畅的关键就是保证资源下载分散到持续的体验过程中,并保 ...

  5. Egret微端 创建项目(一)

    开发环境: window7 egret engine:5.0.14 egret wing:4.1.0 微端:v0.0.14 官方教程:http://developer.egret.com/cn/git ...

  6. dotNet开发游戏微端

    需求分析 功能要求 当玩家使用不支持 unity webplayer 的浏览器进入游戏时,让玩家通过微端玩游戏. 确保微端的功能和页游戏功能一致. 大体功能就是为unity web game开发微端, ...

  7. 2D客户端+微端技术总结

    本人于2013年9月23号加入一个页游项目组, 并作为项目组的客户端小组的主程, 带领一个4个人(峰值)的前端小组, 进行微端的开发.微端项目于2014年8月底大体完成, 历时11个月.9月份之后微端 ...

  8. 微端 代码project as air 分享

    分享 ^_^ 1. 使用 air , as . 2. 微端下载和更新技术 成功上线棋牌游戏.它可用于传统的游戏开发. 地址: http://download.csdn.net/detail/stone ...

  9. 亲历H5移动端游戏微信支付接入及那些坑(二)——获取Openid和授权

    第一篇中将一些坑说明,那么这篇开始正式进入接入步骤.具体的参数说明,我不会列出,毕竟微信官方文档都有,我想大家都看的懂,而且这接口也有可能微信会变动,所以不列出来,也是不想引起大家的误解,接入步骤只起 ...

随机推荐

  1. Android studio中添加外部的jar包

    1.下载相关的jar包, 2,将jar包复制到当前module的lib中 3.选择新添加的jar包.右键.add as library 就好啦

  2. cron 执行php文件

    php执行的命令要写全路径,不然无法执行

  3. Laravel5 model create使用

    1.在laravel的Eloquent ORM中,默认表会有created_at.updated_at两个字段,因此在使用create函数时若表无这两个字段会出错,可以设置 public $times ...

  4. FATFS外置UNICODE GBK双向转换码表(转)

    源:FATFS外置UNICODE GBK双向转换码表 将UtoG,GtoU双向码表放到存储卡里面实现长文件名,因为FATFS长文件名需要unicode支持, 首先将UtoG.sys,GtoU.sys两 ...

  5. Incompatible pointer types assigning to 'id<>' from 'Class'错误

    实例变量在类方法中被使用 原因:静态方法访问了非静态变量属性(.h中声明的那些属性),就是类方法访问了成员变量

  6. iOS开发UITableView基本使用方法总结 分类: ios技术 2015-04-03 17:51 68人阅读 评论(0) 收藏

    本文为大家呈现了iOS开发中UITableView基本使用方法总结.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDa ...

  7. mongodb更新数据

    1. 获取当前时间: Calendar.getInstance().getTime(); 2. 更新数据: public void updateProcessLandLog(ProcessLandLo ...

  8. 1)Javascript设计模式:Module模式

    最简单的创建对象方法 function User(name) { this.name = name || '' } User.prototype.say = function() { console. ...

  9. 在MVC中添加拦截器实现登录后的权限验证

    1.新建一个类 (以下实现了打印日志功能) using System; using System.Collections.Generic; using System.Linq; using Syste ...

  10. html5 安卓拨打电话 发短信

    方法一: <input name=”phone_no” format=”*m” value=”13″/> <do type=”option” label=”呼出号”> < ...