gdiplus.hをインクルードするとコンパイルできないとき
結論→先に、#include
IStreamが定義されていないとか、関数の戻り値の型が無いなどといわれます。
#include <windows.h> #include <gdiplus.h> INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) { return 0; }
上記のようなコードではコンパイルが通ります。
しかしVC++EEの空じゃないプロジェクト(元から色々書かれているやつ)では、
gdiplus.hをインクルードしただけで、GDI+関係のヘッダからかなりのエラーがでます。
調べてみたら海外の質問サイトに漂流。
http://social.msdn.microsoft.com/forums/en-US/Vsexpressvc/thread/55e02319-43b7-4ff1-b8c0-250e2e268c70/
#include <objbase.h> This header is included by a lot of stuff, such as the DirectX libs, and eventually includes the necessary stuff. This should be considered a bug I think. The <gdiplus.h> lib should include it itself.
(このヘッダは、DirectXとかいろんなのからインクルードされるし、結局は必要なもの。
これはよく検討すべき問題だと思う。gdiplus.hも自分でこれをインクルードするべきだ。)
#include <objbase.h> #include <gdiplus.h>
と書けば確かにコンパイルが通りました。
だけど空のプロジェクトではこんなものをインクルードする必要がなかったのにどうして、
と思ったら、空じゃないプロジェクトでも、stdafx.hの先頭で
#include <windows.h> #include <gdiplus.h>
と書けば、objbase.hをインクルードする必要は無いようです。
原因はおそらく、gdiplus.hよりも前にインクルードしたヘッダが変なマクロを定義したせいで、
gdiplus.hがobjbase.hをインクルードしなかった、
ということでしょうか。ちょっと調べただけじゃわかりそうにありません。
どうでもいいけど質問者返事してない・・・。
追記
上記の質問サイトの最後にも書いてありますが、無視してました。
stdafx.hに
// Windows ヘッダーから使用されていない部分を除外します。 #define WIN32_LEAN_AND_MEAN #include <windows.h>
と書かれていたのが問題のようです。
これがなければobjbase.hをわざわざインクルードする必要はありません。
また、これがあってもobjbase.hをインクルードすればコンパイルできます。
多分謎が解けました。