在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

原创粉丝点击