CImage imgPic;//例外陳述句
//AfxMessageBox(to_string(3).c_str());
imgPic.Create(PicWidth, PicHeight, 24);
在對atlimage.h檔案進行跟蹤除錯發現,建構式中會呼叫以下這條陳述句,代碼在441行
static CInitGDIPlus* GetInitGDIPlusInstance()
{
static CInitGDIPlus gdiPlus;
return &gdiPlus;
}
其中,static CInitGDIPlus gidPlus;陳述句例外,都沒能進CInitGDIPlus的建構式;以下是CInitGDIPlus的函式,CImage類中的,第100行
class CInitGDIPlus
{
public:
CInitGDIPlus() throw();
~CInitGDIPlus() throw();
bool Init() throw();
void ReleaseGDIPlus() throw();
void IncreaseCImageCount() throw();
void DecreaseCImageCount() throw();
private:
ULONG_PTR m_dwToken;
CRITICAL_SECTION m_sect;
LONG m_nCImageObjects;
DWORD m_dwLastError;
};
我試著把靜態的gdiPlus改成非靜態的CInitGDIPlus gdiPlus,沒問題;使用static int i;測驗,也沒問題
但是靜態的地方用的比較多,鑒于我的實力問題,不太放心改
想咨詢廣大猿老,有什么解決方法嗎?
附加:這種dll,在OCX呼叫,然后IE呼叫OCX,CImage也會出現這個問題。重點只有XP (SP2/3)系統,其他系統都好用
uj5u.com熱心網友回復:
是否XP系統的 GDIPlus.dll 缺失或版本不匹配?uj5u.com熱心網友回復:
不太可能,我試過MFC寫個測驗用例呼叫DLL,在XP系統是可以的,只是說C#呼叫或者網頁呼叫OCX封裝過的會產生問題;而且我把static去掉是能正常走建構式和解構式的;我懷疑過是呼叫環境導致的,但是拷貝到system32等檔案夾里還是同樣的情況uj5u.com熱心網友回復:
那GDI+沒有初始化的可能性比較大, 自己加一個初始化的操作
#include <atlimage.h>
//全域變數
struct _tagGdiplsInit_t
{
ULONG_PTR m_dwToken;
_tagGdiplsInit_t()
{
Gdiplus::GdiplusStartupInput input;
Gdiplus::GdiplusStartupOutput output;
VERIFY(S_OK == Gdiplus::GdiplusStartup(&m_dwToken, &input, &output));
}
~_tagGdiplsInit_t()
{
Gdiplus::GdiplusShutdown( m_dwToken );
}
}m_GdipInit;
uj5u.com熱心網友回復:
這個我抽空去加個試試。
但是呢,根據我看的這個文章https://blog.csdn.net/sha276793422/article/details/40302993,和實際中我跟蹤的情況,GDI+初始化他是在函式bool Init() throw();中,并沒有放到建構式中初始化;而且確實是在load或save的時候進行初始化GDI+的.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/186557.html
標籤:基礎類
下一篇:一串代碼求解
