更多信息
| 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() 添加以下: |
// 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;
}
| 3. |
InitInstance() 中添加以下 ParseCommandLine(cmdInfo) 后: |
if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
{
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 文件。 例如: |
midl /Oicf /h "<project_name>_i.h" /iid "<project_name>_i.c"