额。。。刚开始信誓旦旦说要写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. Linux下hosts、host.conf、resolv.conf

    /etc/resolv.conf 该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数. resolv.conf的关键字主要有四个,分别是: nameserver   ...

  2. nginx做反向负载均衡,后端服务器获取真实客户端ip

    首先,在前端nginx上需要做如下配置: location / proxy_set_header host                   $host; proxy_set_header X-fo ...

  3. Servlet实现文件上传(多文件)(三)

    1.上传文件的页面fileUpload2.jsp <%@ page language="java" import="java.util.*" pageEn ...

  4. HTML学习二(基础)

    HTML标题标题(Heading)是通过<h1>-<h6>等标签进行定义的<h1>定义最大标题<h6>定义最小标题注释:浏览器会自动地在标题的前后添加空 ...

  5. Android线程之基本用法

    一: 在android中有两种实现线程thread的方法: 一种是,扩展java.lang.Thread类 另一种是,实现Runnable接口 二: Thread类代表线程类,它的两个最主要的方法是: ...

  6. iOS中UITextField 使用全面解析 分类: ios技术 2015-04-10 14:37 153人阅读 评论(0) 收藏

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  7. WebService调用权限验证 SoapHeader

    一般在项目中,制作的都是基于SOAP协议的webservices,其描述语言是WSDL.但是有时候在项目中,需要保证webservices的安全,需要对其进行进行验证,那么我们就要实现SoapHead ...

  8. java系列--集合

    ==比较地址,equals比较内容 一.常用集合框架: 1.List结构集合类:ArrayList类: LinkedList类:addFirst( ),addLast( ),remove( ), Ve ...

  9. ML_note1

    Supervised Learning In supervised learning, we are given a data set and already know what our correc ...

  10. 华硕A450c详细清灰拆机教程

    很久都想写点东西,但又无从下笔. 上次把自己的笔记本清了灰,这次有时间就整理一下,随便作为我的第一次随笔. 准备:笔记本(我的是华硕A450c),拆机工具(螺丝刀等) 温馨提示:要慢点 1,先翻开笔记 ...