**
Eaglooe 学习日记2
**
首先在Cheat.cpp的
- 开辟一个线程
BOOL CCheatApp::InitInstance()
{
CWinApp::InitInstance();
//开辟一个线程
g_hUIThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UIThread, NULL, 0, 0);
return TRUE;
}
- 去做UIThread这件事
- g_hUIThread是一个全局句柄
- 加LPTHREAD_START_ROUTINE 强制编译强转
g_hUIThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UIThread, NULL, 0, 0);
- 然后在外面添加全局变量
HANDLE g_hUIThread; //默认初始化为空
HANDLE g_hFreeThread;
- 在外面添加 UIThread 界面
void UIThread(void *Param)
{
}
- 会变成这样子
// 会变成这样子
#include "stdafx.h"
#include "Cheat.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
BEGIN_MESSAGE_MAP(CCheatApp, CWinApp)
END_MESSAGE_MAP()
CCheatApp::CCheatApp()
{
}
CCheatApp theApp;
HANDLE g_hUIThread; //**********
void UIThread(void *Param) //**********
{
}
// CCheatApp 初始化
BOOL CCheatApp::InitInstance()//程序先执行这里
{
CWinApp::InitInstance();//主线程执行
//开辟一个线程
g_hUIThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UIThread, NULL, 0, 0);
return TRUE;
}
把创建的窗口,右击 添加类,加入到头文件和源文件,头文件会出现CMainView.h
- 在Cheat.cpp添加头文件
#include "CMainView.h"
- (搭建框架)把资源切换到我们的模块中最后释放掉
- 使用 AFX_MANAGE_STATE() 来切换资源到 AfxGetStaticModuleState() 这个目录
AFX_MANAGE_STATE(AfxGetStaticModuleState());
- 用 hResOld 保存旧句柄
HINSTANCE hResOld = AfxGetResourceHandle();
- AfxSetResourceHandle() 设置资源句柄为我们自己的theApp目录
AfxSetResourceHandle(theApp.m_hInstance);
把CMainView窗口叫出来,设定元素为模态窗口,类似关于,帮助等等的窗口,不把它关掉是无法进行下一步的
CMainView* MainDlg = new CMainView();
MainDlg->DoModal();
- 创建一个线程去关掉MainDlg
其中 FreeLibrary 是释放模块
C语言强转为 (LPTHREAD_START_ROUTINE) FreeLibrary
C++强转为 reinterpret_cast<LPTHREAD_START_ROUTINE>(FreeLibrary)
delete MainDlg; //关掉后,释放掉
MainDlg = NULL; //好习惯
g_hFreeThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, theApp.m_hInstance, 0, 0);
CloseHandle(g_hUIThread); //释放界面线程的句柄
CloseHandle(g_hFreeThread); //释放销毁线程的句柄
- 刚刚创建的旧句柄呼唤回去,资源切换回去。
AfxSetResourceHandle(hResOld);// 使用旧句柄
完成后的完整代码:
// 完成后的完整代码
#include "stdafx.h"
#include "Cheat.h"
#include "CMainView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
BEGIN_MESSAGE_MAP(CCheatApp, CWinApp)
END_MESSAGE_MAP()
CCheatApp::CCheatApp()
{
}
CCheatApp theApp;
HANDLE g_hUIThread;
HANDLE g_hFreeThread;
void UIThread(void *Param)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); //把资源切换到我们的模块中
HINSTANCE hResOld = AfxGetResourceHandle(); //保存旧句柄
AfxSetResourceHandle(theApp.m_hInstance); //使用我们的模块
//创建界面出来
CMainView* MainDlg = new CMainView();
MainDlg->DoModal();
//关闭了窗口才会执行这里跟后面
delete MainDlg; //关掉后,释放掉
MainDlg = NULL; //好习惯
//创建线程去释放掉模块:FreeLibrary是释放模块
g_hFreeThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, theApp.m_hInstance, 0, 0);
CloseHandle(g_hUIThread); //释放界面线程的句柄
CloseHandle(g_hFreeThread); //释放销毁线程的句柄
//资源切换回去
AfxSetResourceHandle(hResOld);
}
// CCheatApp 初始化
BOOL CCheatApp::InitInstance()
{
CWinApp::InitInstance();
g_hUIThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UIThread, NULL, 0, 0);
return TRUE;
}