额。。。刚开始信誓旦旦说要写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. Tengine TCP 负载均衡

    tar jxvf jemalloc-3.5.1.tar.bz2 cd jemalloc-3.5.1 ./configure make && make install echo '/us ...

  2. CI框架学习——基本的用法(一)

    一.必备知识 1.如何访问你的页面 我在控制器下面建立了admin文件夹,此文件夹下有login.php 文件,我们现在要访问这个文件 http://localhost/gradesystem/ind ...

  3. jqgrid的外观重绘

    1.如果你想随时更改jqGrid的外观和列,可以先将jqGrid卸载掉再重新加载:$(grid).GridUnload();  $("#list_server_table").tr ...

  4. Android手势识别总结

    一:首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouc ...

  5. 火狐上的一个post提交工具(主要用于测试接口时候)

    添加的过程 安装完后,就可以在下图上,看到一个poster 点击poster就可以看到下图 图中红线圈好的,是必须要填写的 Url是访问路径 Name是参数名称 Value是参数值 需要注意一点的是: ...

  6. iOS开发——打开手机相册,获取图片

    1.添加代理UIImagePickerControllerDelegate 2.设置点击跳转事件 - (IBAction)picButton:(UIButton *)sender { NSLog(@& ...

  7. 用简单的http抓包来实现微信公众网页如何模拟登录

    一.准备工具: 系统:XP 浏览器:IE8 抓包工具:HttpWatch(它可以查看url请求的数据包) 二.抓包思路: 浏览器上的任何获取数据的方式都符合http协议的请求,只要发送符合要求的数据就 ...

  8. iOS调试-LLDB学习总结

    from:http://www.jianshu.com/p/d6a0a5e39b0e LLDB阐述 LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器.LLDB 绑定在 ...

  9. Backbone视图渲染React组件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  10. JavaScript(一)---- 概述

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...