在vc6里面一般都沒有這個頭文件的,在后面的版本(.NET)都有相關的說明,不過這個是CString包含的頭文件,我之前將open source的代碼移植到win32 application平臺下面,對方的編譯器是vc2003,而我的是用到了vc6,所以就遇到這個問題了,解決辦法有兩種:
1)在工程里面加入MFCsupport,因為CString是MFC里面的內容。具體做法是project/settings/General/microsoft foundation class處選擇using MFC as a shared dll./ static library.
在msdn上面有具體的說明。
可能看起來比較麻煩,不過不好意思,就這樣弄過來防止msdn上面這個文章過舊了,又被刪除了。
給 ATL EXE 項目添加 MFC 支持
1. |
在包括 Atlbase.h 之前,將以下 #include 指令添加到 StdAfx.h:
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation extensions
|
2. |
更改項目設置以使用 MFC。 在 Project Settings 對話框中,單擊 General 選項卡,然后將 Microsoft Foundation Classes 列表框中的設置更改為 MFC。 |
3. |
添加 CWinApp 衍生類,并聲明一個該類型的全局變量,如下所示:
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
protected:
BOOL m_bRun;
};
|
4. |
用以下 InitInstance 和 ExitInstance 代碼替換 _tWinMain 函數:
BOOL CMyApp::InitInstance()
{
// Initialize OLE libraries.
if (!AfxOleInit())
{
AfxMessageBox(_T("OLE Initialization Failed!"));
return FALSE;
}
// Initialize CcomModule.
_Module.Init(ObjectMap, m_hInstance);
_Module.dwThreadID = GetCurrentThreadId();
// Check command line arguments.
TCHAR szTokens[] = _T("-/");
m_bRun = TRUE;
LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);
while (lpszToken != NULL)
{
// Register ATL and MFC class factories.
if (lstrcmpi(lpszToken, _T("Embedding"))==0 ||
lstrcmpi(lpszToken, _T("Automation"))==0)
{
AfxOleSetUserCtrl(FALSE);
break;
}
// Unregister servers.
// There is no unregistration code for MFC
// servers. Refer to <LINK TYPE="ARTICLE" VALUE="Q186212">Q186212</LINK> "HOWTO: Unregister MFC
// Automation Servers" for adding unregistration
// code.
else if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
{
VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, FALSE)));
VERIFY(SUCCEEDED(_Module.UnregisterServer(TRUE)));
m_bRun = FALSE;
break;
}
// Register ATL and MFC objects in the registry.
else if (lstrcmpi(lpszToken, _T("RegServer"))==0)
{
VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, TRUE)));
VERIFY(SUCCEEDED(_Module.RegisterServer(TRUE)));
COleObjectFactory::UpdateRegistryAll();
m_bRun = FALSE;
break;
}
lpszToken = FindOneOf(lpszToken, szTokens);
}
if (m_bRun)
{
// Comment out the next line if not using VC 6-generated
// code.
_Module.StartMonitor();
VERIFY(SUCCEEDED(_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE)));
VERIFY(COleObjectFactory::RegisterAll());
// To run the EXE standalone, you need to create a window
// and assign the CWnd* to m_pMainWnd.
LPCTSTR szClass = AfxRegisterWndClass(NULL);
m_pMainWnd = new CWnd;
m_pMainWnd->CreateEx(0, szClass, _T("SomeName"), 0, CRect(0, 0, 0, 0), NULL, 1234);
}
return TRUE;
}
int CMyApp::ExitInstance()
{
// MFC's class factories registration is
// automatically revoked by MFC itself.
if (m_bRun)
{
_Module.RevokeClassObjects();
Sleep(dwPause); //wait for any threads to finish
}
_Module.Term();
return 0;
}
|
5. |
對于 Unicode 版本,請確保進入點被設置為 wWinMainCRTStartup,該設置在 Project Settings 對話框中 Link 字段的 Output 類別中。 有關其它信息,請參見 Microsoft Knowledge Base 中的下列文章:
125750 (http://support.microsoft.com/kb/125750/EN-US/) PRB: 錯誤 LNK2001: “_WinMain@16”: 不能解析的外部符號
|
6. |
將以下代碼行添加到 COM 接口、窗口過程和導出函數的每個成員函數的開頭:
AFX_MANAGE_STATE(AfxGetAppModuleState());
有關 AFX_MANAGE_STATE 的詳細信息,請查詢 VC++ 聯機文檔。 |
有關將 MFC 支持添加到 ATL COM AppWizard 項目的詳細信息,請參見下面的 Microsoft Knowledge Base 文章:
181505 (http://support.microsoft.com/kb/181505/EN-US/) PRB: ATL COM AppWizard 不提供對 .EXE 的 MFC 支持
回到頂端
將 MFC 支持添加到 ATL DLL 項目
執行上面的步驟 1 到步驟 3。
1. |
將 AppWizard 生成的 DllMain 的 DLL_PROCESS_ATTACH 和 DLL_PROCESS_DETACH 中的代碼移到 CMyApp 的 InitInstance 和 ExitInstance,并刪除 DllMain,如下所示:
BOOL CMyApp::InitInstance()
{
_Module.Init(ObjectMap, m_hInstance);
return CWinApp::InitInstance();
}
int CMyApp::ExitInstance()
{
// MFC's class factories registration is
// automatically revoked by MFC itself.
if (m_bRun)
_Module.RevokeClassObjects();
|
2. |
將以下代碼行添加到 COM 接口、窗口過程和導出函數的每個成員函數的開頭:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
有關其它信息,請參見 Microsoft Knowledge Base 中的下列文章:
140850 (http://support.microsoft.com/kb/140850/EN-US/) HOWTO: 轉換 DLLTRACE 以使用共享庫中的 MFC
|
另外一種辦法就是將atlstr廢掉,采用其他辦法
因為atlstr實際起作用的是CString,而如果能夠找到CString的替代方案,就可以了。
替代方案在這里:
http://www.codeguru.com/forum/showthread.php?t=402543一般建議用std::string來完成這些不依賴微軟某種技術的做法。
在我的項目里面,因為采用的是win32 application工程,并且該項目已經很大了,不想因為這個而在那里增加一些方案1的處理,我采用了方案2。