如何向 MFC EXE 添加 ATL 支持
来源:互联网 发布:招商局金融科技 知乎 编辑:程序博客网 时间:2024/05/18 18:20
概要
此文章步骤都需要添加 ATL 支持到没有自动化支持 MFC EXE 列表。
更多信息
1.将以下声明后添加到 CWinApp 派生对象在全局范围:
CExeModule _Module;
LONG CCExeModule Module::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}
BEGIN_OBJECT_MAP(ObjectMap)
END_OBJECT_MAP()
LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
{
while (*p1 != NULL)
{
LPCTSTR p = p2;
while (*p != NULL)
{
if (*p1 == *p++)
return p1+1;
}
p1++;
}
return NULL;
}
2.至段首 InitInstance() 添加以下:
LONG CCExeModule Module::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}
BEGIN_OBJECT_MAP(ObjectMap)
END_OBJECT_MAP()
LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
{
while (*p1 != NULL)
{
LPCTSTR p = p2;
while (*p != NULL)
{
if (*p1 == *p++)
return p1+1;
}
p1++;
}
return NULL;
}
2.至段首 InitInstance() 添加以下:
// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox("OLE initialization failed");
return FALSE;
}
m_bATLInited = TRUE;
HRESULT hRes = 0;
if (FAILED(hRes))
{
m_bATLInited = FALSE;
return FALSE;
}
_Module.Init(ObjectMap, AfxGetInstanceHandle());
_Module.dwThreadID = GetCurrentThreadId();
TCHAR szTokens[] = _T("-/");
BOOL bRun = TRUE;
LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);
while (lpszToken != NULL)
{
if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_ATLMFC, FALSE);
_Module.UnregisterServer();
bRun = FALSE;
break;
}
if (lstrcmpi(lpszToken, _T("RegServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_ATLMFC, TRUE);
_Module.RegisterServer(TRUE);
bRun = FALSE;
break;
}
lpszToken = FindOneOf(lpszToken, szTokens);
}
if (!bRun)
{
m_bATLInited = FALSE;
return FALSE;
}
hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE);
if (FAILED(hRes))
{
m_bATLInited = FALSE;
return FALSE;
}
if (!AfxOleInit())
{
AfxMessageBox("OLE initialization failed");
return FALSE;
}
m_bATLInited = TRUE;
HRESULT hRes = 0;
if (FAILED(hRes))
{
m_bATLInited = FALSE;
return FALSE;
}
_Module.Init(ObjectMap, AfxGetInstanceHandle());
_Module.dwThreadID = GetCurrentThreadId();
TCHAR szTokens[] = _T("-/");
BOOL bRun = TRUE;
LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);
while (lpszToken != NULL)
{
if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_ATLMFC, FALSE);
_Module.UnregisterServer();
bRun = FALSE;
break;
}
if (lstrcmpi(lpszToken, _T("RegServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_ATLMFC, TRUE);
_Module.RegisterServer(TRUE);
bRun = FALSE;
break;
}
lpszToken = FindOneOf(lpszToken, szTokens);
}
if (!bRun)
{
m_bATLInited = FALSE;
return FALSE;
}
hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE);
if (FAILED(hRes))
{
m_bATLInited = FALSE;
return FALSE;
}
3.InitInstance() 中添加以下 ParseCommandLine(cmdInfo) 后:if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
{
return TRUE;
}
4.将下列公共成员变量添加到 CWinApp 派生对象:BOOL m_bATLInited;
5.覆盖 ExitInstance() 并调用基类 ExitInstance() 之前添加以下代码:
{
return TRUE;
}
4.将下列公共成员变量添加到 CWinApp 派生对象:BOOL m_bATLInited;
5.覆盖 ExitInstance() 并调用基类 ExitInstance() 之前添加以下代码:
if (m_bATLInited)
{
_Module.RevokeClassObjects();
_Module.Term();
}
6.向项目添加 <project_name> .idl 文件并建立自定义规则以便调用 MIDL 编译器将生成 <project_name> .tlb、 project>_i.h 和 <project> _i.c 文件。 例如:
{
_Module.RevokeClassObjects();
_Module.Term();
}
6.向项目添加 <project_name> .idl 文件并建立自定义规则以便调用 MIDL 编译器将生成 <project_name> .tlb、 project>_i.h 和 <project> _i.c 文件。 例如:
midl /Oicf /h "<project_name>_i.h" /iid "<project_name>_i.c"
"<project_name>.idl"
#define _ATL_APARTMENT_THREADED
#include <atlbase.h>
// You may derive a class from CComModule and use it if you want to
// override something, but do not change the name of _Module.
class CExeModule : public CComModule
{
public:
LONG Unlock();
DWORD dwThreadID;
};
extern CExeModule _Module;
#include <atlcom.h>
#ifdef _ATL_STATIC_REGISTRY
#include <statreg.h>
#include <statreg.cpp>
#endif
#include <atlimpl.cpp>
注意 : 对于发布版本, 然后如果做不希望将 ATL 注册, 中静态链接包括 _ATL_DLL 项目设置 对话框中的预处理器符号中。
这篇文章中的信息适用于:
•Microsoft ActiveX Template Library 2.0•Microsoft ActiveX Template Library 2.1
更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn
- 如何向 MFC EXE 添加 ATL 支持
- 给 ATL EXE 项目添加 MFC 支持
- 如何让ATL支持MFC
- HOWTO: 给 ATL 项目添加 MFC 支持
- HOWTO: 给 ATL 项目添加 MFC 支持
- 给ATL项目添加MFC支持
- 如何添加对 ATL 的应用程序承载 VBScript 的支持
- atl server com 支持mfc
- VC6 当MFC支持ATL
- ATL/MFC 跟踪工具 (AtlTraceTool8.exe)
- MFC生成的exe如何添加使用期限
- 为MFC程序添加ATL简单对象
- 在MFC工程中添加ATL
- 为DLL添加ATL/WTL支持
- 为DLL添加ATL/WTL支持
- 为DLL添加ATL/WTL支持
- DLL 添加MFC 支持
- MFC添加Socket支持
- inner join 和where 區別
- zip的压缩原理与实现(一)(转)
- 罗斯柴尔德起家的时代背景
- HOWTO: 给 ATL 项目添加 MFC 支持
- 24条经典哲理性语句的英文翻译
- 如何向 MFC EXE 添加 ATL 支持
- 磁盘文件系统引起的蓝屏
- zip的压缩原理与实现(二)(转)
- test
- asp.net常用的javascript经典例子
- 一个数字转换为人民币货币大写字符的函数(vb2005)
- 如何修改UltraEdit-32中的tab健设置?
- JAVA生成彩色验证码
- gzip 压缩 css,js 等文件