VC6和VS2005(及2010)的一些區別總結


VC6.0與VS2005的一些差別

分類: 
一、         VC 6.0 中的 MFC ClassWizard 從 Visual Studio 2005 開始已被分拆成兩個功能:

1.     對控件和菜單建立事件映射的功能

菜單視圖 (View)->Solution Explorer 或 Ctrl+W,S 中 Resource Files 樹下,在資源視圖(通過雙擊資源文件 *.rc 可進入該視圖)選中某一個菜單或者控件,右鍵其中的某項,在彈出的菜單中選擇“添加事件處理程序” (Add Event Handler...) ,接下來就能找到 VS 6 中類似 Message Maps 的選項;

2.     添加窗體的消息映射

菜單視圖 (View)-> 類視圖 (Class View) 或 Ctrl+W,C 進入類視圖單擊類,右鍵此類選中“屬性” (Properties) ,進入屬性界面,其上有事件 (Events) 、消息 (Messages) 、重寫 (Overrides) 等。對比 VS 6 沒有了 Automation( 以前稱作 OLE 自動化, COM IDispatch 接口 ) 選項。

從 Visual Studio 2005 開始有了 MFC Class Wizard ,不過是在類視圖中選中項目,右鍵 Add->Class ,選中 MFC->MFC Class ,點擊 Add 后才出現的。

二、         自 Visual Studio 2005 環境起,字符串如 "Microsoft" 無法自動轉換為 LPCTSTR 類型,解決方法見微軟 FAQ: Cannot convert from 'const char [..]' to 'LPCTSTR' 。

三、         *View.h 消息映射中

//{{AFX_MSG(*)

...

//}}AFX_MSG

這兩個 AFX_MSG 注釋宏不再存在,其中 * 代表建立的項目名。

同樣在 *View.cpp 消息映射中注釋宏 AFX_MSG_MAP 也不再存在了。

四、         連接 *.lib 。在 VC6.0 中是在 Project->Setting 中設置,而自 Visual Studio 2005 起,菜單 Project->Properties ,設置 lib 路徑(只存在 VS2005 中) :Configuration Properties->General->Addition Library Directories ,添加 lib:Configuration Properties->Linker->Input->Addition Dependences 。

五、         Visual C++ Components 目錄 自 VC 7.0 就已被移除,原先在 VC++ 6.0 中的操作為:菜單 Project->Add To Project->Components and Controls->Visual C++ Components->Popup Menu 。 .Net 環境項目可以通過工具 (Tools) -> 選擇工具箱項 (Choose Toolbox Items) 進行 ; MFC 中添加 Popup Menu 可以通過向 View 類中添加消息 WM_CONTEXTMENU 進行。 Splash Screen 組件也因此不存在 ,但 可以參照 Microsoft Visual Studio 9.0\Samples\1033\AllVCLanghageSamples.zip 中拷貝出 splash.cpp 和 splash.h 這兩個文件 , 加入到現有項目中或者 對話框增強版 。


六、          自 Visual Studio 2003 起,控件通知消息 WM_INITDIALOG 移到了重寫 (Overrides) 里面,重寫里的方法 OnInitDialog() 對應 WM_INITDIALOG 消息。

七、          自 VS2005 起對消息的檢查更為嚴格, VC6 中沒問題的

ON_MESSAGE(message,OnMyMessage); 
 

返回值必須規范為 LRESULT

afx_msg LRESULT OnMyMessage(WPARAM, LPARAM) ; 
 

返回值可以為 TRUE 或者 FALSE 。 


 

八、          從 Components 里添加 ActiveX (基於 COM )不再可行,自 VS2005 以來中需要 Add Class->MFC Class From ActiveX Control ,點 Add ,窗口 Add Class From ActiveX Control Wizard 顯現。 

九、          ActiveX Control Test Container 即 tstcon32.exe ,默認保存在 %programfiles%\Microsoft Visual Studio 9.0\Common7\Tools\ 目錄中,但從 VS2008 起已被移除, VS2005 是最后一個包含它的版本,如想獲取它可以自行編譯 TSTCON sample 或者單獨獲取其早期版本。

【資源】

Activex 、 OLE 、 COM 、 OCX 、 DLL 之間有什么區別?

Activex、 OLE、 COM、 OCX、 DLL之間有什么區別? 

【附錄】

A : LPCTSTR

LPCTSTR = Long Pointer to a Const TCHAR STRing

LP 表示長指針,這是為了兼容 Windows 3.1 等 16 位操作系統遺留下來的,在 win32 中以及其它 32 位操作系統中, long 指針和 near 指針及 far 修飾符都是為了兼容的作用,沒有實際意義。

P 表示是指針。

C 表示是常量即 const 。

T 在 Win32 環境中是一個 _T 宏,這個宏用來表示你的字符是否使用 UNICODE 。如果你的程序定義了 UNICODE 或者其它相關的宏,那么這個字符或者字符串將被作為 UNICODE 字符串, 否則就是標准的 ANSI 字符串。

STR 表示這個變量是字符串。

所以 LPCTSTR 就表示一個指向長地址的可以根據一些宏定義改變語義的固定字符串。

完整定義見 WinNT.h :

FAQ: Cannot convert from 'const char [..]' to 'LPCTSTR'

Question

I'm trying to compile a piece of code such as:  //我試着編譯這個代碼片段:

MessageBox("Hello world!");

... when I compile the project, the compiler yields:  //當我編譯這個項目的時候,編譯結果:

error C2664: 'CWnd::MessageBoxW' : cannot convert parameter 1 from 'const char [12]' to 'LPCTSTR'

What am I doing wrong? //我做錯了什么呢?

Problem   (問題)

This error message means that you are trying to pass a multi-byte string (const char [12]) to a function which expects a unicode string (LPCTSTR). The LPCTSTR type extends to const TCHAR*, where TCHAR is char when you compile for multi-byte and wchar_t for unicode. Since the compiler doesn't accept the char array, we can safely assume that the actual type of TCHAR, in this compilation, is wchar_t.

Resolution (解決)

You will have to do one of two things:  //你得做兩件事中的任何一件

1、Change your project configuration to use multibyte strings. Press ALT+F7 to open the properties, and navigate to Configuration Properties > General. Switch Character Set to "Use Multi-Byte Character Set".

2、Indicate that the string literal, in this case "Hello world!" is of a specific encoding. This can be done through either prefixing it with L, such as L"Hello world!", or surrounding it with the generic _T("Hello world!") macro. The latter will expand to the L prefix if you are compiling for unicode (see #1), and nothing (indicating multi-byte) otherwise.

(譯)

1、改變你的項目配置為使用多字節字符串。按Alt + F7打開的屬性,並導航到配置屬性>“常規。切換字符集“使用多字節字符集”。

2、表明字符串在此情況下,"Hello world!" 是一個特定的編碼。這也可以通過在字符串前面加上前綴L,如: L"Hello world!", ,或通用宏_T來這樣使用,如: _T("Hello world!")。后者將擴大到L前綴如果您對Unicode編譯(見#1),除了將它轉多字節格式,其它沒有什么。

   例如:  MessageBoxW(L"出錯啦!"); 或者 MessageBoxW(_T("出錯啦!"));

第一種方法:

按下Alt+F7或右鍵項目->單擊“屬性”->配置屬性->項目默認值->字符集

然后,將“使用Unicode字符集”改為“使用多字節字符集”

見圖:

Variations

Another error message, indicating the same problem, would be:

cannot convert parameter 1 from 'const char [12]' to 'LPCWSTR'

'LPCWSTR'

Where LPCWSTR maps to a wchar_t pointer, regardless of your build configuration. This problem can be resolved primarily by using solution #2, but in some cases also #1. A lot of the Microsoft provided libraries, such as the Platform SDK, have got two variations of each function which takes strings as parameters. In case of a unicode build, the actual functions are postfixed W, such as the MessageBoxW seen above. In case of multi-byte, the function would be MessageBoxA (ASCII). Which of these functions is actually used when you compile your application, depends on the setting described in resolution #1 above.

 (譯)凡LPCWSTR映射到一個wchar_t指針,不管你的構建配置。這個問題可以解決,主要通過使用解決方案#2,但在某些情況下也#1。是微軟提供了很多這樣的SDK庫為平台,有兩只每個函數,它接受字符串作為參數的變化。在建立一個Unicode案件,實際功能是后綴瓦,如MessageBoxW上面看到的。在多字節的情況下,函數將MessageBoxA(ASCII碼)。實際使用的是當你編譯你的應用這些功能其中,取決於在1號決議所述的設置。 

Activex、 OLE、 COM、 OCX、 DLL之間有什么區別? 

熟悉面向對象編程和網絡編程的人一定對ActiveX、OLE和COM/DCOM這些概念不會陌生,但是它們之間究竟是什么樣的關系,對許多們還是 比較模糊的。在具體介紹它們的關系之間,我們還是先明確組件(Component)和對象(Object)之間的區別。組件是一個可重用的模塊,它是由一 組處理過程、數據封裝和用戶接口組成的業務對象(Rules Object)。組件看起來像對象,但不符合對象的學術定義。它們的主要區別是: 1)組件可以在另一個稱為容器(有時也稱為承載者或宿主)的應用程序中使用,也可以作為獨立過程使用; 2)組件可以由一個類構成,也可以由多個類組成,或者是一個完整的應用程序; 3)組件為模塊重用,而對象為代碼重用。現在,比較流行的組件模型有COM(Component Objiect Module,對象組件模型)/DCOM( Distributed COM,分布式對象組件模型)和CORBA(Common Object Request Broker Architecture,公共對象請求代理體系結構)。到這里,已經出現了與本文相關的主題COM,而CORBA與本文無關,就不作介紹。之所以從組件 與對象的區別說起,是想讓大家明確COM和 CORBA是處在整個體系結構的最底層,如果暫時對此還不能理解,不妨繼續往下看,最后在回過頭看一看就自然明白了。現在開始闡述ActiveX、OLE 和COM的關系。首先,讓大家有一個總體的概念,從時間的角度講,OLE是最早出現的,然后是COM和ActiveX;從體系結構角度講,OLE和 ActiveX是建立在 COM之上的,所以COM是基礎;單從名稱角度講,OLE、ActiveX是兩個商標名稱,而COM則是一個純技術名詞,這也是大家更多的聽說 ActiveX和OLE的原因。既然OLE是最早出現的,那么就從OLE說起,自從Windows操作系統流行以來,“剪貼板”( Clipboard)首先解決了不同程序間的通信問題(由剪貼板作為數據交換中心,進行復制、粘貼的操作),但是剪貼板傳遞的都是“死”數據,應用程序開 發者得自行編寫、解析數據格式的代碼,於是動態數據交換(Dynamic Data Exchange,DDE)的通信協定應運而生,它可以讓應用程序之間自動獲取彼此的最新數據,但是,解決彼此之間的“數據格式”轉換仍然是程序員沉重的 負擔。對象的鏈接與嵌入(Object Linking and Embedded,OLE)的誕生把原來應用程序的數據交換提高到“對象交換”,這樣程序間不但獲得數據也同樣獲得彼此的應用程序對象,並且可以直接使用 彼此的數據內容,其實OLE是Microsoft的復合文檔技術,它的最初版本只是瞄准復合文檔,但在后續版本OLE2中,導入了COM。由此可 見,COM是應OLE的需求而誕生的,所以雖然COM是OLE的基礎,但OLE的產生卻在COM之前。 COM的基本出發點是,讓某個軟件通過一個通用的機構為另一個軟件提供服務。COM是應OLE 的需求而誕生,但它的第一個使用者卻是OLE2,所以COM與復合文檔間並沒有多大的關系,實際上,后來COM就作為與復合文檔完全無關的技術,開始被廣 泛應用。這樣一來, Microsoft就開始“染指”通用平台技術。但是COM並不是產品,它需要一個商標名稱。而那時Microsoft的市場專家們已經選用了OLE作為 商標名稱,所以使用COM技術的都開始貼上了 OLE的標簽。雖然這些技術中的絕大多數與復合文檔沒有關系。Microsoft的這一做法讓人產生這樣一個誤解OLE是僅指復合文檔呢?還是不單單指復 合文檔?其實OLE是COM的商標名稱,自然不僅僅指復合文檔。但Microsoft自己恐怕無法解釋清楚,這要花費相當的精力和時間。 於是,隨着Internet的發展,在1996年春,Microsoft改變了主意,選擇ActiveX作為新的商標名稱。ActiveX是指寬松定義 的、基於COM的技術集合,而OLE仍然僅指復合文檔。當然, ActiveX最核心的技術還是COM。ActiveX和OLE的最大不同在於,OLE針對的是桌面上應用軟件和文件之間的集成,而ActiveX則以提 供進一步的網絡應用與用戶交互為主。到這里,大家應該對ActiveX、OLE和COM三者的關系有了一個比較明確的認識,COM才是最根本的核心技術, 所以下面的重點COM。讓對象模型完全獨立於編程語言,這是一個非常新奇的思想。這一點從C++和Java的對象概念上,我們就能有所了解。但所謂COM 對象究竟是什么呢?為了便於理解,可以把COM看作是某種(軟件)打包技術,即把它看作是軟件的不同部分,按照一定的面向對象的形式,組合成可以交互的過 程和以組支持庫。COM對象可以用C++、Java和VB等任意一種語言編寫,並可以用DLL或作為不同過程工作的執行文件的形式來實現。使用COM對象 的瀏覽器,無需關心對象是用什么語言寫的,也無須關心它是以DLL還是以另外的過程來執行的。從瀏覽器端看,無任何區別。這樣一個通用的處理技巧非常有 用。例如,由用戶協調運行的兩個應用,可以將它們的共同作業部分作為COM對象間的交互來實現(當然,現在的OLE復合文檔也能做到)。為在瀏覽器中執行 從Web服務器下載的代碼,瀏覽器可把它看作是COM對象,也就是說,COM技術也是一種打包可下載代碼的標准方法(ActiveX控件就是執行這種功能 的)。甚至連應用與本機OS進行交互的方法也可以用COM來指定,例如在Windows和Windows NT中用的是新API,多數是作為COM對象來定義的。可見,COM雖然起源於復合文檔,但卻可有效地適用於許多軟件問題,它畢竟是處在底層的基礎技術。 用一句話來說,COM是獨立於語言的組件體系結構,可以讓組件間相互通信。隨着計算機網絡的發展,COM進一步發展為分布式組件對象模型,這就是 DCOM,它類似於CORBA的ORB,本文對此將不再做進一步的闡述。通過上面的講述相信大家一定對ActiveX、OLE和COM/DCOM的關系有 了一個清楚的了解。

        使用Windows的人對於ActiveX控制一定不會陌生,它提供了一種類似於DLL動態鏈接庫的調用,不過它與DLL的唯一區別就是ActiveX不 注冊不能被系統識別並使用。那么,當我們得到一個ActiveX沒有被正確安裝且不能使用的消息后,又要安裝ActiveX怎么辦 呢?1.Regsvr32程序法在Windows的System文件夾下有一個regsvr32.exe的程序,它就是Windows自己帶的 ActiveX注冊和反注冊工具。利用它也能夠非常方便地注冊AcitveX控件,它的用法為:regsvr32/u/s/n/i dllname, dllname其中dllname為ActiveX控件文件名,建議在安裝前拷貝到System文件夾下參數有如下意義:/u - 反注冊控件/s - 不管注冊成功與否,均不顯示提示框/c - 控制台輸出/i - 跳過控件的選項進行安裝 (與注冊不同)/n - 不注冊控件,此選項必須與/i 選項一起使用例如筆者要注冊一amovie.ocx控件,則打入 regsvr32 amovie.ocx即可,要反注冊它時只需使用 regsvr32 /u amovie.ocx就行了。2.注冊表法所謂注冊AcitveX,無非是將一些信息記錄在Windows的注冊表中,如Shockwave Flash Object控件,我們可以運行Regedit.exe注冊表編輯程序,利用關鍵字進行搜索,然后把搜索得到后的注冊表導出為一REG注冊表文件,再將其 相應的ActiveX文件拷貝到Windows的System文件夾(一般ActiveX的文件名為OCX,安裝在Windows的System文件夾 內)下,最后在要安裝ActiveX的機器上雙擊導入剛才導出的注冊表文件即可完成安裝。

       Activex,OLE,COM都是微軟的一些技術標准。Ole比較老后來發展成Activex,再后來發展成為COM OCX,DLL是擴展名。 Activex有兩種擴展名OCX和DLL。實際上你可以把它們的擴暫名字調換。 COM作為ActiveX的更新技術,擴展名也有可能是DLL DLL文件還有可能是動態鏈接庫。主要是裝載一些函數,可以動態加載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM