ACE菜鳥的問題

2021-04-15 04:22:39 字數 2567 閱讀 5344

我是個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...