微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)

时间:2023-03-09 08:18:45
微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)

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