在ATL项目中添加WTL界面
来源:互联网 发布:python 交易 行情平台 编辑:程序博客网 时间:2024/05/27 06:16
之前在Atl项目中添加过mfc的dialog对话框,只要在建立atl项目时勾选mfc支持就可以。
现在想在AtL的动态链接库中调用Wtl框架,拿到之后,就犯迷糊了。网上查了一些资料,参考了:http://blog.csdn.net/dragoo1/article/details/8896381,但是当把该实例下载下来后,发现少了个文件,无法编译通过,不过其中的部分思路给了我很大启发。自己着手做了一个实例:
第一步:通过WTL项目向导建立界面程序,
本实例建立的是一个框架(mainFrame),和一个视图(view),
其中的部分程序相应做好,但是该项目最终生成的是exe可执行文件。
该步骤的目的:画界面,实现基本的界面功能。方便后面封装进AtL项目中。
第二步:建立Atl项目,
1:通过向导,建立 ATL动态链接库项目,
2:在Atl项目名的cpp.文件中编写导出函数:ConfigDataExtension
void WINAPI ConfigDataExtension(HWND hwnd){ //调用:简单atl对象,通过该对象实现界面的生成,消息的传递 ::MessageBox(NULL, _T(" AtlWtlSecond DLL载入成功;"), _T("标题"), MB_OK);}
在项目名的.def中加入ConfigDataExtension,结果是:
; AtlWtlSecond.def : 声明模块参数。LIBRARYEXPORTS DllCanUnloadNow PRIVATE DllGetClassObject PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE DllInstall PRIVATE ConfigDataExtension
方便外部调用。
三:将前面建立的WTL界面资源导入到AtL项目中
就是采取复制粘贴的方式,包括(dialog,toolbar等)
复制完要修改:Resource.h文件,把部分注释掉,不然编译的时候会出现重复宏定义的警告。也可以等到编译的时候,根据错误直接删除。
这是由于复制,粘贴过程中自动生成造成的。
四:将前面项目中的Fram,view代码导入到当前Atl项目,并做修改
1,将MainFrm.h,MainFrm.cpp文件合并为一个MainFrm.h;不然会报错未定义标识符:……LIB
2,在MainFrm.h中包含:dllmain.h
#include "dllmain.h"。
3,将MainFrm.h中的 _Module修改为_AtlModule;4,view的.h和。cpp文件不用合并。至此,MianFrm已经包装完成,下面处理,消息循环,与提供接口的问题
五,建立Atl简单对象
添加类——》AtL——》Atl简单对象
为该对象添加 属性和方法
1:开头添加:class CMainFrame; 导入CMainFrame;
2:定义属性,方法:
public: STDMETHOD(Hello)(void); CMessageLoop m_MsgLoop; CMainFrame* wndMain;
实现:
extern CAtlWtlSecondModule _AtlModule;void runloop(void* p){ CMessageLoop* theLoop = (CMessageLoop*)p; theLoop->Run();}//STDMETHODIMP CSimple2::Hello(void)STDMETHODIMP CFrameAtl::Hello(void){ // TODO: 在此添加实现代码 ::MessageBox(NULL, _T("FrameAtl::Hello(void)函数调用成功!!!"), _T("ASDF"), MB_OK); _AtlModule.AddMessageLoop(&m_MsgLoop); wndMain = new CMainFrame; if (wndMain->CreateEx() == NULL) { ATLTRACE(_T("Main window creation failed!\n")); return 0; } wndMain->ShowWindow(SW_SHOW); DWORD nThread = _beginthread(runloop, 0, (void*)&m_MsgLoop); return S_OK;}
六:修改cpp导出函数:ConfigDataExtension,结果为:
void WINAPI ConfigDataExtension(HWND hwnd){ //调用:简单atl对象,通过该对象实现界面的生成,消息的传递 ::MessageBox(NULL, _T(" AtlWtlSecond DLL载入成功;"), _T("标题"), MB_OK); CComObject<CFrameAtl>* p = NULL; if (SUCCEEDED(p->CreateInstance(&p))) // 这里会创建对象实例,调用默认构造函数 { p->Hello(); // 如果需要用参数初始化,在这里进行,不能在构造函数里进行 }}
测试,编译是否成功,就可以编写测试代码了。我是测试代码是:
LRESULT CMainDlg::OnBnClickedButton2(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/){ // TODO: 在此添加控件通知处理程序代码 typedef void(WINAPI *AtlConfCall)(HWND); //创建dll句柄 HINSTANCE hDll; //装载dll ATLwtlTe.dll hDll = LoadLibrary(_T("AtlWtlSecond.dll")); //装载dll NEUDataEx //hDll = LoadLibrary(_T("NEUDataExt.DPF")); //hDll = LoadLibrary(_T("BFSUDataExt.DPF")); if (NULL == hDll) { ::MessageBox(NULL, _T("AtlWtlSecond.dll加载失败!;"), _T("ASDF"), MB_OK); //MessageBox(_T("ATLwtlFirst.dll加载失败!")); return 0 ; } //检索指定DLL中的输出库函数地址 AtlConfCall pConfigData = (AtlConfCall)GetProcAddress(hDll, "ConfigDataExtension"); if (NULL == pConfigData) { ::MessageBox(NULL, _T("DLL内部函数调用失败!!;"), _T("ASDF"), MB_OK); //::MessageBox(_T("DLL内部函数调用失败!")); return 0; } //启动函数 //HWND hwnd; //pConfigData(m_hWnd); pConfigData(NULL); return 0;}
只是实现了框架的调出,部分消息的响应,没有复杂的细化。欢迎指正。样例平台:vs2015
将样例下载地址:http://download.csdn.net/detail/bluecy/9877212
- 在ATL项目中添加WTL界面
- 向VS2015添加WTL项目向导(ATL/WTL Application Wizard)
- VS2008 添加ATL/WTL Wizard
- atl dll中调用wtl
- 为DLL添加ATL/WTL支持
- 为DLL添加ATL/WTL支持
- 为DLL添加ATL/WTL支持
- 在ATL接口中添加自定义函数
- 在MFC工程中添加ATL
- WTL项目的ATL支持问题
- 开源项目链接(ATL/WTL)
- 一些(ATL/WTL)开源项目链接
- WTL和ATL中CString冲突
- MFC程序员的WTL指南: Part I - ATL 界面类
- MFC程序员的WTL开发指南之ATL界面类
- MFC程序员的WTL指南: Part I - ATL 界面类
- MFC程序员的WTL指南: Part I - ATL 界面类
- WTL学习笔记——(3)ATL界面类
- 数据库笔记——Mysql、Oracle、Sqlserver || Redis、Memcached、mongoDB环境搭建
- pycaffe 搭建:常见问题解决办法
- bzoj 3864 Hero meet devil
- POJ 1845 Sumdiv 笔记
- 初识node 创建或者删除一个文件目录
- 在ATL项目中添加WTL界面
- 面试题25:二叉树中和为某一值的路径
- mFAST fast_type_gen流程详解
- 《使用python进行自然语言理解》学习笔记二
- 论android等平台回音消除解决方案
- 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件
- JavaScript基础
- meta标签用法
- Bzoj 3662: Clever Rabbit