none
サテライトDLLでMFC Color Button Controlを貼り付けると RRS feed

  • 質問

  • お世話になります。

    開発環境 VS2010(VC++)

    サテライトDLLを作成したのですが、ダイアログリソースに 「MFC ColorButton Control」貼り付けたものがあると
    落ちます。

    通常のButtonコントロールに変更すると問題ありませんでした。

    原因がわかりません。また対策があれば教えてください。

    2014年6月25日 8:37

回答

  • 追記(表示することができました)が・・・

    サテライトDLL側にて(dllmain.cpp)

    void LocalDoRegisterWindowClass(HMODULE hModule, LPCTSTR lpszClassName, LPCTSTR lpszBaseClassName)
    {
    	WNDCLASS wnd = {0};
     
    	HINSTANCE hInst = hModule;
    	if (!::GetClassInfo(hInst, lpszBaseClassName, &wnd))
    	{
    		wnd.style = CS_DBLCLKS;
    		wnd.hInstance = hInst;
    		wnd.lpfnWndProc = ::DefWindowProc;
    	}
     
    	wnd.lpszClassName = lpszClassName;
    	::RegisterClass(&wnd);
    }
     
    void LocalAfxRegisterMFCCtrlClasses(HMODULE hModule)
    {
    	LocalDoRegisterWindowClass(hModule, _T("MFCButton"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCColorButton"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCEditBrowse"), WC_EDIT);
    	LocalDoRegisterWindowClass(hModule, _T("MFCFontComboBox"), WC_COMBOBOX);
    	LocalDoRegisterWindowClass(hModule, _T("MFCLink"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCMaskedEdit"), WC_EDIT);
    	LocalDoRegisterWindowClass(hModule, _T("MFCMenuButton"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCPropertyGrid"), WC_STATIC);
    	LocalDoRegisterWindowClass(hModule, _T("MFCShellList"), WC_LISTVIEW);
    	LocalDoRegisterWindowClass(hModule, _T("MFCShellTree"), WC_TREEVIEW);
    	LocalDoRegisterWindowClass(hModule, _T("MFCVSListBox"), WC_STATIC);
    }
    

    を実装し、DllMainからコールすることで、表示することができました。

    但し、http://msdn.microsoft.com/ja-jp/library/24b2tcy0.aspx

    で、リソースのみのDLL作成では、「/NOENTRY リンカー オプションを指定します」

    と記述されているのですが、/NOENTRYにしない場合の影響がわかりません。

    教えていただけますようよろしくお願いします。



    • 編集済み Brillia 2014年6月26日 6:22
    • 回答としてマーク Brillia 2014年6月27日 7:20
    2014年6月26日 4:03

すべての返信

  • http://stackoverflow.com/questions/12324231/loading-a-special-mfc-control-from-a-satellite-dll

    上の様な情報がありました。
    ウインドウクラスを登録しなければならないという内容です。
    関係ありますでしょうか。

    2014年6月25日 9:32
  • ご返事ありがとうございます。

    m_mfcColorButton.RegisterWindowClass(AfxGetResourceHandle());

    RegisterWindowClass()がありませんでした。

    下記のURLを見つけたのですが、VS2012では対応されていることなのですが、

    VS2010での回避策がわかりませんでした。

    http://connect.microsoft.com/VisualStudio/feedback/details/686157

    ウィンドウクラスの登録をどこかでする必要があるとは思うのですが、よくわかりませんでした。

    なにか情報があれば教えてください。



    2014年6月26日 3:02
  • 追記(表示することができました)が・・・

    サテライトDLL側にて(dllmain.cpp)

    void LocalDoRegisterWindowClass(HMODULE hModule, LPCTSTR lpszClassName, LPCTSTR lpszBaseClassName)
    {
    	WNDCLASS wnd = {0};
     
    	HINSTANCE hInst = hModule;
    	if (!::GetClassInfo(hInst, lpszBaseClassName, &wnd))
    	{
    		wnd.style = CS_DBLCLKS;
    		wnd.hInstance = hInst;
    		wnd.lpfnWndProc = ::DefWindowProc;
    	}
     
    	wnd.lpszClassName = lpszClassName;
    	::RegisterClass(&wnd);
    }
     
    void LocalAfxRegisterMFCCtrlClasses(HMODULE hModule)
    {
    	LocalDoRegisterWindowClass(hModule, _T("MFCButton"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCColorButton"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCEditBrowse"), WC_EDIT);
    	LocalDoRegisterWindowClass(hModule, _T("MFCFontComboBox"), WC_COMBOBOX);
    	LocalDoRegisterWindowClass(hModule, _T("MFCLink"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCMaskedEdit"), WC_EDIT);
    	LocalDoRegisterWindowClass(hModule, _T("MFCMenuButton"), WC_BUTTON);
    	LocalDoRegisterWindowClass(hModule, _T("MFCPropertyGrid"), WC_STATIC);
    	LocalDoRegisterWindowClass(hModule, _T("MFCShellList"), WC_LISTVIEW);
    	LocalDoRegisterWindowClass(hModule, _T("MFCShellTree"), WC_TREEVIEW);
    	LocalDoRegisterWindowClass(hModule, _T("MFCVSListBox"), WC_STATIC);
    }
    

    を実装し、DllMainからコールすることで、表示することができました。

    但し、http://msdn.microsoft.com/ja-jp/library/24b2tcy0.aspx

    で、リソースのみのDLL作成では、「/NOENTRY リンカー オプションを指定します」

    と記述されているのですが、/NOENTRYにしない場合の影響がわかりません。

    教えていただけますようよろしくお願いします。



    • 編集済み Brillia 2014年6月26日 6:22
    • 回答としてマーク Brillia 2014年6月27日 7:20
    2014年6月26日 4:03
  • AfxEnableControlContainer() を呼ぶことで解決しませんか?

    2014年6月26日 4:06