我是個ace菜鳥,前一陣子頭痛於萬事開頭難的問題,很多問題相當sb,不過考慮到很多初學者和我一樣被老闆罵得焦頭爛額,這裡還是把學習 ace第一周遇到的問題貼上來,希望對剛剛接觸ace的鳥伴有所幫助(-:<。本貼討論的範圍:
1、解決5.6版本的ace使用 ace_has_mfc 後提示win32_nt版本過低的問題。
2、mfc應用程式呼叫ace庫,不進行任何操作還存在記憶體洩露的問題;
3、mfc程式載入的動態鏈結庫隱含呼叫ace方法導致的記憶體洩露;
4、解決寬字符集和窄字符集的編譯器自動相容問題;
下面逐一解決:
1、解決visual studio 2008 編譯5.6版本的ace使用 ace_has_mfc 後提示win32_winnt版本過低的問題。
原因在config-win32-common的這一句:
#if !defined (_win32_winnt)
# define _win32_winnt 0x0400
#endif
改為#if !defined (_win32_winnt)
# define _win32_winnt 0x0600
#endif
即可2、mfc應用程式呼叫ace庫,不進行任何操作還存在記憶體洩露的問題;
這種情況需要解決兩個問題:
3、mfc程式載入的動態鏈結庫隱含呼叫ace方法導致的記憶體洩露;
4、解決寬字符集和窄字符集的相容問題;
自從visual studio 2005後,編譯器預設字符集就是寬字元。包括cstring在內的多數物件均採用unicode字符集。一般為了在寬字符集和窄字符集中切換,程式設計師會使用一系列的模版方法,比如_tcscpy()與tchar混用來克服一致性的問題,使得在編譯時切換字符集不必重寫**。
如果沒有在ace編譯時指定ace_uses_wchar,ace所有函式入口都是窄字元的,將增加程式設計的複雜性。比如,我定義了乙個ace記憶體對映物件,需要初始化當前檔案的名字,為了相容unicode字符集和窄字元可能這樣寫:
class cmyclass
void cmyclass::myfun1()
#else
--> if (m_memmap.map(strdiskfilename,nsize,o_rdwr | o_creat)==-1)
#endif
...}
這段**使用了mfc的cw2a類,如果程式中多次出現類似cw2a的轉換,當突然需要改為窄字元時,就需要大改**。何況,win32api沒有提供cw2a類,取而代之的是系統方法呼叫。還接著上乙個例子,如果想在非mfcdll中取得頁面檔案的名字並儲存,**變得十分可怕:
class cmyclass
void cmyclass::myfun2()
#else
_tcscpy(m_strfilename,pcstrfilename);
#endif
...}
為了避免這種麻煩,採用如下手段:
首先,修改工程檔案,除了debug和release外建立unicodedebug,unicoderelease編譯方案,為他們設定"use unicode character set"字符集選項;輸出檔案為unicoderelease:aceu.dll,aceu.lib,unicodedebug:aceud.dll,aceud.lib,存放到固定的資料夾中。
而後,重寫config.h,基本如下:
#ifdef _unicode
#ifndef ace_uses_wchar
#define ace_uses_wchar
#endif
#endif
#ifndef ace_has_mfc
#define ace_has_mfc 1
#endif
#include "ace/config-win32.h"
重新編譯,將編譯生成四組庫,ace/aced/aceu/aceud,可以同樣修改qos及其他工程。注意,qos鏈結選項中的acedll要配合字符集選項設定。接著,建立$(acedir)/acepreinclude.h,如下:
//本檔案提供對ace的智慧型引用,鏈結對應的庫
#ifdef _unicode
#define ace_uses_wchar
#ifdef _debug
#pragma comment( lib, "aceud.lib")
#else
#pragma comment( lib, "aceu.lib")
#endif
#else
#ifdef _debug
#pragma comment( lib, "aced.lib")
#else
#pragma comment( lib, "ace.lib")
#endif
#endif
最後,在要使用ace庫的專案中,stdafx.h加入:
#include "acepreinclude.h"
即可。編譯器將自動根據字符集選項選擇相應的庫進行連線。寫好後,上述範例**變為:
class cmyclass
void cmyclass::myfun2()
簡單多了哦!
ACE編譯問題
如果定義了巨集ace doesnt instantiate nonstatic object manager,就表明選擇了應用程式自己選擇初始化object manager物件,那麼只能為non static object manager了,需要在應用程式中手動呼叫ace init 和ace fin...
ACE程式設計遇到的問題
1。配置,在專案的屬性頁裡,新增附加包含目錄 附加目錄庫和附加依賴項。不然容易報缺失標頭檔案的錯誤。1 2 3 2.專案 error prj0002 錯誤的結果 31 從 c program files microsoftsdks windows v6.0a bin mt.exe 返回 在網上沒找到...
ACE中UUID的問題
最近用到了ace的uuid,使用方法是網上找的,如下 tstring suuid ace utils uuid generator instance init ace utils uuid uuid ace utils uuid generator instance generateuuid uui...