VC 6 到vs2008中的一些錯誤解決方法

2021-05-27 18:08:44 字數 3472 閱讀 6692

1 lptstr 轉換成cstring

解決方法:注釋掉stdafx.h中的 //#define _atl_cstring_explicit_constructors     但是這可能不是最終的解決方法

2. cexception 的錯誤

解決方法:將throw new  cexception 改為throw new cuserexception;

自從 visual c++ 6.0 以來,已經對 atl 和 mfc 庫進行了許多改進。這些更改中某些可能會破壞現有的**,下面列舉了一些示例:

作為 visual c++ .net 2003 的一部分提供的 atl 和 mfc dll 檔案已分別被重新命名為 atl71.dll 和 mfc71.dll。

visual c++ .net atl 和 mfc 類與早期版本的相同類之間沒有二進位制相容性,因此任何使用 mfc42.dll 生成的源**必須用 visual studio .net 重新生成。應用程式使用的任何 dll 或 lib 檔案也必須用 visual studio .net 重新生成。

例如,使用 visual c++ 6.0 生成的、包含匯出函式(該函式將cstring用作引數)的庫在與 visual c++ .net 專案鏈結時將產生無法解析的外部鏈結。

atl 3.0 提供了ccommodule類。在 atl 7.1 中,以前由ccommodule提供的功能由若干新類處理。有關更多資訊,請參見

atl 模組類

。visual c++ 6.0 中 atl 3.0 和 atl 3.0 以前的 atl 版本中,使用 atlconv.h 中的巨集的字串轉換始終是使用系統 (cp_acp) 的 ansi **頁執行的。從 visual c++ .net 中的 atl 7.0 開始,字串轉換將使用當前執行緒的預設 ansi **頁執行,除非定義了_conversion_dont_use_thread_locale(此情況下,如以前一樣使用系統的 ansi **頁)。

請注意,字串轉換類(如cw2aex)使您得以將用於轉換的**頁傳遞給它們的建構函式。如果未指定**頁,這些類使用與巨集相同的**頁。

有關更多資訊,請參見 atl 和 mfc 字串轉換巨集。

cexception在 microsoft 基礎類庫中是所有異常的基類。因為cexception現在是抽象基類,所以您不能直接建立cexception物件;必須建立派生類的物件。如果您確實直接建立了物件,將會收到錯誤。有關更多資訊,請參見 cexception。

在 visual c++ 6.0 中,使用下面的**是可以接受的:

複製

bstr bstr = sysallocstring(l"hello");

cstring str = bstr;

sysfreestring(bstr);

對於 visual c++ .net 下的新專案,這將在 ansi 版本下導致下面的錯誤:

複製

error c2440: 'initializing' : cannot convert from 'bstr' to 

'atl::cstringt'

現在有cstring的 unicode 和 ansi 版本(cstringwcstringa)。若要標記任何由隱式轉換導致的不必要的系統開銷,採用反向型別(如帶 unicode 引數的cstringa,或者帶 ansi 引數的cstringw)的建構函式現在在 stdafx.h 中被使用下面的項標記為顯式的:

#define _atl_cstring_explicit_constructors

若要避免此錯誤,請執行下列操作之一:

在 atl 7.0 之前的版本中,ccomenumimpl::skip 方法不能為輸入值 0 返回正確的錯誤**。它還會以不一致的方式處理大的輸入值。這些行為在 atl 7.0 中已被修復。

當 cwnd::destroywindow 中顯示工具提示時,會發生斷言錯誤。因此,在 mfc 7.0 中,下列成員變數被從afx_thread_state移到afx_module_thread_state

當呼叫採用wchar_t型別的靜態庫或 dll 中的函式時(請注意,bstr 和 lpwstr 解析為wchar_t*),可能會遇到「lnk2001 無法解析的外部符號錯誤」。

此錯誤由

/zc:wchar_t

編譯器選項引起,預設情況下此選項在新的 mfc 專案中設定為開啟。此選項使編譯器將wchar_t當作本機型別。在 visual c++ .net 以前版本中,wchar_t被當作unsigned short

如果主專案和庫不使用 /zc:wchar_t 的相同設定,這將導致函式簽名不匹配。若要避免此問題,請使用 /zc:wchar_t 編譯器選項重新生成該庫,或使用「屬性頁」對話方塊中「語言」屬性頁上的「將 wchar_t 視為內建型別」設定在主專案中將該選項關閉。

請看下面的類:

複製

class cmyclass : public cobject

};

在 visual c++ .net 之前,表示式bflag != false計算為bool並寫入四個位元組;在 visual c++ .net 中,它計算為bool並寫入乙個位元組。這意味著用不同的編譯器版本編譯的程式可能會生成相互不相容的資料檔案。

若要避免該問題,請將表示式轉換為bool

複製

ar << (bool)(bflag != false);

在以前版本的 mfc 中,activex 控制項通過分別指定 guidclsid_ccolorproppageclsid_cfontproppage為顏色或字型屬性顯示屬性頁。這些 guid 指向類ccolorproppagecfontproppage,現在不再實現它們。改用 guidclsid_stockcolorpageclsid_stockfontpage。它們是通過 msstkprp.dll 實現的,因此您必須用應用程式重新發布該 dll。

VC6 和VS2008 中的CTime類使用問題

在開發專案的時候,出現了這種錯誤,用vs2008開發的c 動態庫,提供了乙個對外的結構體如下 typedef struct fileinfo file information 用vs2008呼叫這個動態庫用的時候正常,查詢出來的資料正常,但是用vc6呼叫這個動態庫的時候,查詢出來的資料亂碼,後來de...

vc6 和vs2008編碼方式問題

以下的 無法編譯,vc 6.0可以編譯,c free也可以 include stdafx.h include include int main int argc,char argv process information pi si.dwflags startf useshowwindow si.w...

VC6下開發的應用程式除錯VS2008開發的DLL

最近遇到乙個問題,公司提供給客戶的動態鏈結庫是用vs2008開發的,但是客戶的開發環境是vc6,所以在提供客戶api之前得確認vs2008開發的dll在vc6開發環境下也可以正常的使用,不管是靜態載入還是動態載入。這裡涉及到用vc開發的應用程式除錯vs2008開發的dll的問題。該應用程式採用靜態方...