none
新規作成でGdiplusを外すには? RRS feed

  • 質問

  • VisualStudio 2008を使って、ちょっとしたAPIの動作確認等でMFCでダイアログベースのプログラムを作成することが良くあります。 

    2008だとGdiPlus.dll を標準で利用する仕様のため、Windows2000で起動できません。 もちろんdll を一緒に同一フォルダへコピーをすれば起動するのですが面倒です。2005のときはそのようなことはなかったのですが、プロジェクト設定等でOFFにする方法はないのでしょうか?自分でもプロジェクトのプロパティで設定項目をあれこれ探してみたのですが、これといった設定が見つけられませんでした。

    もしかするとWindows2000は、VS2008で対象ではないのかもしれませんが・・・・

    Gdiplus.dllへのリンクをOFFする方法をご存知でしたら教えてください。


    kata.
    2010年7月14日 2:41

回答

  • MFCのSTATICリンクを指定した場合にのみ GdiPlus.dllへのEXPORTが生成されます。
    これらから考えて、VS2008のバグじゃないかと思えてきました。

    手元の環境でもスタティックリンクの場合に gdiplus.dll が読み込まれていることは確認しました。
    ただし、これが Visual Studio 2008 の不具合かどうかは何ともいいかねます。
    (「設計による」として仕様の判断がされる可能性もあるためです)

    MFCをSTATICリンクする場合のStartupかStubの中にGdiPlusへの呼び出しが固定で入っているものと想像できます。

    Visual Studio には MFC のソースがついていますが、裏付けをとる動きはしていません。
    (時間がかかりそうなので敬遠)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク kata._ 2010年7月15日 0:40
    2010年7月14日 15:18
    モデレータ
  • ちょっと見てみると、uafxcw.lib(afxtoolbarimages.obj)、つまり CMFCToolBar の実装のようですね。
    このクラスは MFC Feature Pack のものなので、Visual Studio 2008 の SP なしバージョン(RTM)だと再現しないかもしれませんね。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク kata._ 2010年7月15日 0:39
    2010年7月14日 15:31
    モデレータ

すべての返信

  • http://www.microsoft.com/japan/msdn/vstudio/support/tools.aspx

    によるとWindows2000はだめっぽいですね。

    2010年7月14日 10:36
  • そう思ったんですが、サポートされるプラットフォーム (Visual C++) によるとOKなんですよね。

    単に

    #define _WIN32_WINNT 0x0500

    ではダメなのかなぁ?

    2010年7月14日 10:44
  • 仲澤さん、コメントありがとうございます。

    URLを見ましたが、以下の注意文言がありました。

    >この一覧は全て開発ツール自体の動作に関する情報であり、以下の開発ツールを

    >使用してお客様が開発されたアプリケーションの対応に関するものではありません。

    なのでVS2008をWin2000上で動かそうというのではないのです。

    現在、Win32ピュアなプログラムをVS2008で開発していますが

    Win2000~Win7で動作するアプリ開発を問題なく行えています。

     


    kata.
    2010年7月14日 10:48
  • 佐祐理さん、コメントありがとうございます。

    早速やってみました。

    targetver.h というファイルがあり、そこで指定するようなので

    #define WINVER 0x0500           // これを Windows の他のバージョン向けに適切な値

    #define _WIN32_WINNT 0x0500     // これを Windows の他のバージョン向けに適切な値

    #define _WIN32_IE 0x0500        // これを IE の他のバージョン向けに適切な値に変

    に直してみましたが変化なしでした (T_T


    kata.
    2010年7月14日 11:01
  • ソースを見る限り、MFC自体には明示的にgdiplus.dllへの参照はついていないみたいです。

    ビルドオプションで、リンカに対してgdiplus.libを渡してませんか?


    jzkey
    2010年7月14日 13:33
  • Windows 7 + Visual Studio 2008 SP1 の環境で、MFC ダイアログベースアプリケーションをビルドし、デバッグ実行しました。
    ダイアログが表示された後にブレイクさせ、デバッグメニューのウィンドウ、モジュールと選択し、読み込まれているモジュールや出力ペインを確認しました。
    この結果、gdiplus.dll は読み込まれていませんでした。

    新規に作成されたプロジェクトで本当に gdiplus.dll を必要とするのかご確認ください。
    (知っている事例:CImage クラスを使うと、gdiplus.dll が読み込まれます)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年7月14日 14:27
    モデレータ
  • jzkeyさん、Azuleanさん、コメントありがとうございます。

    情報が足りなくて申し訳ありません。MFCをSTATICリンクした場合にのみ発生する問題でした。

    あれから少し確認したのですが、MFCがデフォルトで利用しているのか?

    とも思って、デフォルトのMFCをDLLとしてのビルドした場合はどうか?

    EXPORTするMFCのDLLからGdiPlusを使っているのか?などを想像して

    デフォルトのMFCをDLLとして利用するビルドでは GdiPlus.dll のEXPORTは生成されませんでした。

    もちろんMFCのDLLからもGdiPlusへのEXPORTはありませんでした。

    ただMFCをDLLとしてビルドするとWin2000環境へもっていく際にDLLも必要なのでNGです。

    MFCのSTATICリンクを指定した場合にのみ GdiPlus.dllへのEXPORTが生成されます。

    これらから考えて、VS2008のバグじゃないかと思えてきました。

    MFCをSTATICリンクする場合のStartupかStubの中にGdiPlusへの呼び出しが固定で入っているものと

    想像できます。

     


    kata.
    2010年7月14日 14:47
  • >ビルドオプションで、リンカに対してgdiplus.libを渡してませんか?

    念のため、コメントしておきます。

    新規作成のMFCでダイアログベースで。MFCをSTATICリンクした際のEXEで

    自前のソースを加えたり、プロパティ設定などは一切変更せずのビルドです。

     


    kata.
    2010年7月14日 14:52
  • MFCのSTATICリンクを指定した場合にのみ GdiPlus.dllへのEXPORTが生成されます。
    これらから考えて、VS2008のバグじゃないかと思えてきました。

    手元の環境でもスタティックリンクの場合に gdiplus.dll が読み込まれていることは確認しました。
    ただし、これが Visual Studio 2008 の不具合かどうかは何ともいいかねます。
    (「設計による」として仕様の判断がされる可能性もあるためです)

    MFCをSTATICリンクする場合のStartupかStubの中にGdiPlusへの呼び出しが固定で入っているものと想像できます。

    Visual Studio には MFC のソースがついていますが、裏付けをとる動きはしていません。
    (時間がかかりそうなので敬遠)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク kata._ 2010年7月15日 0:40
    2010年7月14日 15:18
    モデレータ
  • ちょっと見てみると、uafxcw.lib(afxtoolbarimages.obj)、つまり CMFCToolBar の実装のようですね。
    このクラスは MFC Feature Pack のものなので、Visual Studio 2008 の SP なしバージョン(RTM)だと再現しないかもしれませんね。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク kata._ 2010年7月15日 0:39
    2010年7月14日 15:31
    モデレータ
  • Azuleanさん、コメントありがとうございます。

    とりあえず仕様として理解しておきます。

    一応時間があれば Microsoft Connect で VS2008開発チームへ連絡しておくようにします。

    以前も何度か不具合報告したら「 VS2010で修正しました」って返事がきたから、

    2008での修正は全然期待できないと思いますが(^_^;


    kata.
    2010年7月15日 0:43