2011-11-13 8 views
4

これまではGCCでコーディングしていたので、MSVC++を初めて使用しています(それはエラーです)。私はGDI plusで最小限のWin Apiプログラムをコンパイルしました。コンパイルは正常ですが、起動するとすぐにランタイムエラーが発生します(ランタイムエラーはWM_PAINTメッセージが呼び出されたときに発生します)。ここに私が見るものがあります: What I SeeGdi +でMSVC++コンパイラが奇妙な "ネイティブグラフィックス"ランタイムエラーになる

私のコードは何も矩形を表示するだけのファンシーではありません。 (GDIでそれを行うとうまくいくが、GDI +ではうまくいきません)。

マイコード:デバッグすることで

HDC hdc = GetDC(hwnd); 

InvalidateRect(hwnd,NULL,FALSE); 

ULONG_PTR token; 
GdiplusStartupInput inp; 
GdiplusStartup(&token,&inp,0); 

Graphics g(hdc); 
g.Clear(Color(0,0,0)); 
g.DrawRectangle(new Pen(Color(0,0,0)),10,10,100,100); 

GdiplusShutdown(token); 
ValidateRect(hwnd,NULL); 

私は、ランタイムエラーがほぼ同時にGraphics g(hdc);コンストラクタが呼ばれるとして来ることがわかりました。私は完全に失われているなど私はGoogleなどで何かを見つけることができません。どんな助け?

+1

あなたのコードはアクセス違反で死にそうです、gccのsegfaultは話します。なぜ投稿されたコードから明らかにされていません。コードは根本的に間違っています。プログラムの起動時にはGDI +を初期化し、ペイントメッセージハンドラでは初期化しないといけません。関数の戻り値は無視しないでください。そして、常にBeginPaint()を呼び出してhdcを取得してください。 64ビットオペレーティングシステムで32ビットコードをデバッグする場合は注意し、Debug + Exceptionsを使用して例外時にデバッガを強制的に停止させます。 –

+0

@Hans Passant:GdiplusStartupとGdiplusShutdownは、プログラムの起動時にのみ呼び出すことはできません。 Microsoftのこのリンクを確認してください。備考:http://msdn.microsoft.com/en-us/library/ms534077%28v=vs.85%29.aspx引用:「GDI +呼び出しを行う各関数でGdiplusStartupとGdiplusShutdownを呼び出す」 - これはMicrosoftを可能なオプションの1つとして挙げています。 – truthseeker

+0

@truthseeker:アプリケーションライフタイム全体をガードするGdiplusStartupとGdiplusShutdownのグローバルペアが存在するという条件でのみ。それ以外の場合は、GDI + FontFamily関数のいずれかでトリガされるマルチスレッド競合状態のバグがあります。 GdiplusStartupとGdiplusShutdownは参照カウントと同じように機能します。起動して実行すると、追加の呼び出し対がオーバーヘッドになります。 – rwong

答えて

1

WinAPI関数は、常に途中で成功を示します。 GetDCが有効なハンドルを返したかどうかを確認する必要があります。 Return value section of GetDCを参照してください。出力内のアクセス違反は、無効なポインタを指しています。 DCが有効な場合は、他のすべてをチェックしてください。アドレスが必要な場所にポインタを渡すようにしてください。

0

hdcの値は何ですか?

ところで、GdiplusShutdownを呼び出す前にgを破壊する必要があります。

関連する問題