您的位置:首页 > 其它

在ATL项目中添加WTL界面

2017-06-21 19:33 281 查看
之前在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 : 声明模块参数。

LIBRARY

EXPORTS
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 框架 界面