none
DLL内でCDialogを継承したダイアログを使用する RRS feed

  • 質問

  •  

    お世話になります。

    suke326です。

     

    DLL内でCDialogを継承したダイアログを使用したいのですが、

    「warning C4251」の警告が出ます。

     

    --- h ---

    #include "DialogEx.h"

     

    class __declspec(dllexport) CHoge 
    {

    private:

     CDialogEx m_dialog;
    public:
     CDialog* GetDialog();
    };

     

    --- cpp ---

    #include "stdafx.h"
    #include "Hoge.h"

     

    CDialog* CHoge::GetDialog()
    {
     return &m_dialog;
    }

     

    そこで、

     

    --- h ---

    #include "DialogEx.h"

    static CDialogEx m_dialog;

    class __declspec(dllexport) CHoge 
    {

    public:
     CDialog* GetDialog();
    };

     

    としようかと思っています。

    こうすれば、Exportするヘッダーファイルが

     

    --- h ---

    #pragma comment(lib, "Hoge_Lib.lib")

    class __declspec(dllimport) CHoge 
    {

    public:
     CDialog* GetDialog();
    };

     

    で、動作確認できました。

     

    --- cpp(テストコード) ---

     CHoge hoge;
     hoge.GetDialog()->DoModal();

     

    この使用方法に何か問題はありますでしょうか?

    良い方法がほかにあるのであればであれば、

    「m_dialog」をクラスのメンバとして管理したいとも思っています。

    ※#pragma warning(disable:4251)で警告を消すのは最終手段として考えています。

     

    また、DLL内でCDialogを継承したダイアログを直接Exportする方法はあるのでしょうか?

    「warning C4251」の警告を無視して試してみましたが、メモリアクセス違反が出るようでした。

    ※リソースやIDの関係で無理なのでしょうか。

     

    --- cpp(テストコード) ---

     CDialogEx dlg;
     dlg.DoModal();

     

    以上、宜しくお願いします。

     

    環境:Windows XP Pro

    開発環境:Visual C++ V6.0

    2007年11月8日 7:55

回答

  • MFCの拡張DLLを使っているのならば、__declspec(dllexport), __declspec(dllimport) の代わりにAFX_EXT_CLASSを使っては?

     

    AFX_EXT_CLASSに関してはヘルプを見てください。

    2007年11月9日 10:20
  • MFC レギュラー DLLならば DLLの theAppをグローバルに参照できるようにします

    DLLの CWinAppクラスの宣言のあとに

    extern __declspec( dllExport ) CMyApp theApp;

     

    エクスポートする CDialogの派生クラスに 仮想関数DoModal()を追加します

     

    追加した 仮想関数で

    AfxSetResoceHandle( theApp.m_hINstance );

    CDialog:Big SmileoModal();

     

    と言った具合で 上手くいくともいます

     

    2007年11月11日 0:21
  •  

    調べ進める中でいくつか前提条件が必要なことを知りました。

     

    「DLL内でCDialogを継承したダイアログを使用する」ようなDLLを作成する場合、

     

    DLLは拡張DLLであることが好ましい。

    MFCのスタティックは、EXE、DLLともに設定不可。

     

    これは間違っていないでしょうか?

    2007年11月12日 11:59
  •  suke326 さんからの引用

    DLLは拡張DLLであることが好ましい。

    MFCのスタティックは、EXE、DLLともに設定不可。

     

    実際にやってみればわかることだと思うのですが、強引にスタティックリンクのMFCに設定するとリンクエラーが発生します。

    2007年11月13日 10:44
  •  

    __declspec(dllexport), __declspec(dllimport) の代わりにAFX_EXT_CLASSを使うことで問題が解消されました。

    ありがとうございました。

    2007年11月20日 12:01

すべての返信

  • MFCの拡張DLLを使っているのならば、__declspec(dllexport), __declspec(dllimport) の代わりにAFX_EXT_CLASSを使っては?

     

    AFX_EXT_CLASSに関してはヘルプを見てください。

    2007年11月9日 10:20
  • MFC レギュラー DLLならば DLLの theAppをグローバルに参照できるようにします

    DLLの CWinAppクラスの宣言のあとに

    extern __declspec( dllExport ) CMyApp theApp;

     

    エクスポートする CDialogの派生クラスに 仮想関数DoModal()を追加します

     

    追加した 仮想関数で

    AfxSetResoceHandle( theApp.m_hINstance );

    CDialog:Big SmileoModal();

     

    と言った具合で 上手くいくともいます

     

    2007年11月11日 0:21
  •  

    調べ進める中でいくつか前提条件が必要なことを知りました。

     

    「DLL内でCDialogを継承したダイアログを使用する」ようなDLLを作成する場合、

     

    DLLは拡張DLLであることが好ましい。

    MFCのスタティックは、EXE、DLLともに設定不可。

     

    これは間違っていないでしょうか?

    2007年11月12日 11:59
  •  suke326 さんからの引用

    DLLは拡張DLLであることが好ましい。

    MFCのスタティックは、EXE、DLLともに設定不可。

     

    実際にやってみればわかることだと思うのですが、強引にスタティックリンクのMFCに設定するとリンクエラーが発生します。

    2007年11月13日 10:44
  •  

    __declspec(dllexport), __declspec(dllimport) の代わりにAFX_EXT_CLASSを使うことで問題が解消されました。

    ありがとうございました。

    2007年11月20日 12:01