在創建MFC項目時, 不使用MFC AppWizard嚮導, 如果沒有設置好項目參數, 就會在編譯時產生很多連接錯誤, 如error LNK2001錯誤, 典型的錯誤提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
下面介紹解決的方法:
1. Windows子系統設置錯誤, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows項目要使用Windows子系統, 而不是Console, 可以這樣設置:
[Project] --> [Settings] --> 選擇"Link"屬性頁,
在Project Options中將/subsystem:console改成/subsystem:windows
2. Console子系統設置錯誤, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
控制檯項目要使用Console子系統, 而不是Windows, 設置:
[Project] --> [Settings] --> 選擇"Link"屬性頁,
在Project Options中將/subsystem:windows改成/subsystem:console
3. 程序入口設置錯誤, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
通常, MFC項目的程序入口函數是WinMain, 如果編譯項目的Unicode版本, 程序入口必須改爲wWinMainCRTStartup, 所以需要重新設置程序入口:
[Project] --> [Settings] --> 選擇"C/C++"屬性頁,
在Category中選擇Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
4. 線程運行時庫設置錯誤, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
這是因爲MFC要使用多線程時庫, 需要更改設置:
[Project] --> [Settings] --> 選擇"C/C++"屬性頁,
在Category中選擇Code Generation,
再在Use run-time library中選擇Debug Multithreaded或者multithreaded
其中,
Single-Threaded 單線程靜態鏈接庫(release版本)
Multithreaded 多線程靜態鏈接庫(release版本)
multithreaded DLL 多線程動態鏈接庫(release版本)
Debug Single-Threaded 單線程靜態鏈接庫(debug版本)
Debug Multithreaded 多線程靜態鏈接庫(debug版本)
Debug Multithreaded DLL 多線程動態鏈接庫(debug版本)
單線程: 不需要多線程調用時, 多用在DOS環境下
多線程: 可以併發運行
靜態庫: 直接將庫與程序Link, 可以脫離MFC庫運行
動態庫: 需要相應的DLL動態庫, 程序才能運行
release版本: 正式發佈時使用
debug版本: 調試階段使用
Q:setup was unable to create a DCOM
user account in order to register microsoft visual
Studio/common/tools/vs_ent98/valec.exe提示安裝不成功!怎麼辦?
A:這是Visual Studio的一個BUG,如果你不使用Visual Studio Analyzer,可以在安裝
時選擇Custom,然後在Enterprise Tools中清除掉Visual Studio Analyzer。再安裝就
沒有這個
問題了。
如果一定要使用Visual Studio Analyzer,可以在安裝後在進行配置工作,
參考微軟的Knowledge Base的文章:“Q257413 BUG: Visual Studio "Setup
Was Unable to Not Create a DCOM User A”。
[03]
Q:安裝VC後,如何禁止對錯誤網頁的調試?
A:從IE菜單,工具->internet選項->選擇高級標籤
把裏面的"禁止腳本調試"選中就可以了.
[04]
Q: Error spawning cl.exe
A:程序給出提示是說編譯的時候找不到CL.EXE這個程序。這主要是VC編譯環境
未設置好造成的。一定是你在安裝完VC後又移動了VC的安裝目錄。可以在VC
中重新設計:Tools->Options...打開Options對話框,選中Directories選
項卡,其中有一個Show directiories for下拉列表框,選中Include files
。然後在下面設置正確的包含文件目錄。CL.exe默認所在的目錄爲
C:/MICROSOFT VISUAL STUDIO/VC98/INCLUDE.
[05]
Q:VC6對類成員的智能提示功能很有用,但有時候失靈?
A:你可以先關掉項目,將.clw和.ncb刪掉,然後重新打開項目,點擊菜單
項View->ClassWizard,在彈出的對話框中按一下“Add All”按鈕;重
新Rebuild All。應該可以解決問題
[06]
Q:如何給已有的Project改名字?
A:將該Project關掉。然後以文本格式打開.dsp文件,替換原來
的Project名字即可。
這個操作有一定的危險,建議有經驗的網友使用。
一般也可以使用工具修改,百度之。
[07]
Q:VC工作區的classview內怎麼經常丟“類”?當建立一個新的類後,原來
的類爲何就不見了?
A:刪除clw文件,重新建立一下就可以了
[08]
Q:fatal error C1010: unexpected end of file while looking for
precompiled header directive該如何解決
A:如果發生錯誤的文件是由其他的C代碼文件添加進入當前工程而引起的,則
Alt+F7進入當前工程的Settings,選擇C/C++選項卡,從Category組合框中
選中Precompiled Headers,選擇Not Using Precompiled headers。確定
如果發生錯誤的文件原本是該工程中的,則檢查該文件頭部有沒有
#include "stdafx.h"語句,沒有的話添加。
如果還不行,也有可能是定義的類或結構體等最後忘了加分號,注意一下
[09]
Q:以前安裝過VC,卸載後重新安裝不成功怎麼辦
A:基本上有三個辦法解決:
1>.重新安裝系統,然後在全新安裝VC。
2>.使用綠色免安裝版的VC,在版面ftp可以下載。
3>.清除註冊表中的vc安裝時生成的項,可以手工清除,也可以藉助於超級兔子,優
化大師等工具。
[10]
Q:請推薦幾個學習VC的站點
A:http://www.csdn.net http://www.codeguru.com
http://www.vccode.com http://www.codeproject.com
http://www.vckbase.com http://www.vchelp.net
[11]
Q:Cannot acess the ClassView
A:將工程文件的只讀屬性去掉
[12]
Q:ClassView中少了某些類
A:這是Visual Studio的一個BUG,把ncb文件刪掉重新打開工程
[13]
Q:代碼無誤,但不出現提示
A:把ncb文件刪掉重新打開工程
[14]
Q:出現C1033 fatal error:Cannot Open programe database xxxxxx.pdb
A:重新編譯選Rebuild All
[15]
Q:推薦書籍
A:《VC++技術內幕(第四版)》(Inside Visual C++ 4.0) ,
(Programming Windows 95 with MFC),《MFC深入淺出》(Dissecting MFC),
《windows程序設計》(不分先後)
[16]
Q:VC中常用的文檔類,視圖類,框架類,應用程序類,自定義類中獲取其它四個類的
方法
A:
GET App
AfxGetInstanceHandle()
AfxGetApp()
GET Frame->View->Document
SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument()
MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocumen
t()
GET Menu
CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetMenu();
GET ToolBar,StatusBar
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
CStatusBar * pStatusBa=(CStatusBar*)AfxGetMainWnd()->GetDescendantWind
ow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar*)AfxGetMainWnd()->GetDescendantWindow(AF
X_IDW_TOOLBAR);
Get View from Document
GetFirstViewPosition 和 GetNextView 函數得到指針。
最後提醒:
在提取到各個句柄之後,因爲初次提取的都是標準類句柄,所以,在使用時要注意
將標準句柄轉換成自己的類的句柄。
((CMyApp*)AfxGetApp())->XXXX();//這的xxxx()就是你定義的類中間的成員。
最後,我要說的是:vc++是一個好工具,更是一個好朋友!