CWndを使うDLL

このQ&Aのポイント
  • CWndのサブクラスを作成するDLLの選択と条件について
  • MFCになった場合のライブラリの動的リンクと静的リンクについて
  • 静的リンクになった場合の制限事項について
回答を見る
  • ベストアンサー

CWndを使うDLL

質問1 CWndのサブクラスを作りたいDLLは、以下のどのDLLとして作成すれば良いでしょうか? ・Win32 DLL ・MFC共有DLL ・MFC拡張DLL ちなみに、このDLLは、必ずしもMFCで作成されたアプリケーションでロードされるとは限りません。 質問2 上記選択でMFCになった場合、MFCのライブラリは動的リンクと静的リンクのどちらになるのでしょうか? 自分で選択できるのであれば、その方法を教えてください。 質問3 上記選択で静的リンクになった場合。 MSDNのページで調べると以下のような制限があるとのことですが、具体的には、こういうことでしょうか? ・DLL内で確保したメモリのポインタを上位からもらってもいけないし、上位へ返してもいけない。 ・MFC オブジェクト(CWndサブクラスへのポインタなど)を上位からもらってもいけないし、返してもいけない。 --- MSDN引用ここから 「レギュラー DLL 内のメモリ割り当てはすべて、DLL の範囲内に収める必要があります。 したがって、以下のポインタを呼び出し側の実行可能ファイルとやり取りすることはできません。 ・MFC オブジェクトへのポインタ ・MFC によって割り当てられたメモリへのポインタ --- MSDN引用ここまで よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

CWndクラスの派生クラスを使いたいのであれば Win32DLLではダメですね このDLLの呼び出し元が MFC/非MFCなのであれば『MFC共有DLL』になるでしょう MFCのリンクは静的/動的どちらでも良いようです 動的リンクならDLL自体は小さく出来ますが MFCのDLL(MFC4x.DLLやMSVCRT.DLLなど)配布と個々のエクスポートする関数に細工が必要なようです 静的リンクですとDLL自体が大きくなってしまいますが個々の関数への細工は不要なようです CWndなどMFCオブジェクトを直接やり取りしたいなら呼び出し元もMFC実行形式に限定して『MFC拡張DLL』でということになるでしょう 実際のDLLからエクスポート出来る関数は必要なデータを構造体にまとめてやり取りするような具合になると思います DLL側 HWND FAR PASCAL EXPORT myCWndCreate( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, HWND hParentWnd); などの宣言で行うように思います 直接 CWndやその派生クラスのポインタを返すのは無理なようです 非MFCではそのポインタを理解できないため ・・・ MFCのサンプルの『DLLTRACE』あたりを参照してみましょう MFC/非MFC双方からアクセスするのであればMFCの静的リンクのほうが良いかもしれません MFCの動的リンクの場合 呼び出し元とDLL側のMFCグローバルモジュールの切り替えようのコードをエクスポートする個々の関数に記述する必要があるようです 詳細は『DLLTRACE』の要約を参照してください

関連するQ&A

  • DLLの違いについて

    MFC AppWizard(dll)で作成したDLLとWin32 Dynamic-Link Libraryで作成したDLLの違いは何でしょうか?客先に「MFCで作ってないんですか?」と聞かれて何が違うのかなと思いまして。不慣れなものですみません。

  • dllの作り方

    環境 WIN98 VC++6.0 MFC にて 猫でも~において 161章でdllを作りましたが、xxx.dllファイルは作成されますが、xxx.libが作成されません。 162章では両方作られ問題ありません。 作り方は、 メニューから「ファイル」「新規作成」「プロジェクト」(タブ)を選択します。そこから「Win32 Dynamic-Link Library」を選びました。 どうすればxxx.libが作られるのか教えてください。 161章 http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm 162章 http://www.kumei.ne.jp/c_lang/sdk2/sdk_162.htm

  • DLL作成について

    DLL作成の機会がいろいろ調べているのですが、教えていただきたいことがあります。 1.インポートライブラリについて  Windowsで暗黙的リンクでDLLをリンクする場合、  インポートライブラリを利用するようですが、  これは、DLL内のポインタと関数名を紐付けるような  役割だと想定しています。  仮に関数等ヘッダーで公開されている部分以外で  DLLを更新した場合、インポートライブラリも  再リンクするような場面があるのでしょうか。  特に再リンクしなくてもDLLの更新が反映されたので・・ 2.DLLのクラスの継承について  DLL内に作成したクラスを継承することは不可能ですかね。  DLLが更新された場合、インスタンスのイメージが違うため  newやdeleteの処理で当初リンクしたインスタンスのイメージで  行いますよね。

  • 別のDLLのダイアログを・・・

    VC++.NETでMFCアプリを開発しています。 コマンド側から、別のDLLのダイアログをCreateし、ShowWindow()したところで例外が発生します。 コマンド側は通常のDLLで作成し、「staticライブラリでMFCを使用する」で使用し、 ダイアログ側は拡張DLLで作成し、「共有DLLでMFCを使用する」で使用しております。 Create()するところで、コマンドのポインタをダイアログに渡すと例外が発生します。 理由がわかりません。教えてくださいm(__)m 説明が足りなければ補足いたします。

  • DLLでダイアログ

    VC++6.0にてMFCを使うDLLを作成しています。 関連HPを参考になんとかDLLを作ることが出来ました。 そこで今度はDLL側でダイアログボックスを作成して表示させようとしたところうまくいきません。 エラーも無くスルーされてしまいます。 こういう使い方は出来ないのでしょうか。 ↓DLL関数のソースファイルです。 ---------------------------------------------- #include "StdAfx.h" #include "Defs.h" #include "Func.h" #include "resource.h" #include "testdlg.h" #include "dlg2.h" int WINAPI DllFunc( CString &p_rcStr, CWnd *p_pcWnd ) { TestDlg dlg; Cdlg2 dlg2; dlg.ps = p_rcStr; dlg2.DoModal();//なにも出ない AfxMessageBox(p_rcStr);//コレはOK dlg.DoModal();//何もでない return TRUE; } --------------------------------------------

  • .NET VC++ DLLの作成方法

    以前VC++6.0でDLLを作成しました。 このときに新規作成の項目からWin32 Dynamic Link Libraryを 選択して作成したのですが、 .NET2003で同様のものを作成したい場合 どのプロジェクトから作成するとできるのでしょうか? .NETになったことで仕様が変更されて同じようにDLLを作成することは できませんか? どなたかお教えください。よろしくおねがいします。

  • Delphi6 DLL内でのメモリ共有(?)

    こんにちは、honiyonです。  複数アプリケーションからそれぞれコールバック関数を登録してもらい、状況に応じてそれぞれのコールバック関数を呼び出す、というDLLを作成しています。  しかし現在、呼び出しアプリケーションごとにメモリ空間が独立してしまい、コールバック情報を同一空間内で管理出来ずに困っています。  旧VerのDelphiで16bit DLLなら、interface部に定義した変数、オブジェクトはDLL内で同一空間内で共有出来るようですが、これをDelphi6 32bitDLLで行う事は不可能でしょうか? もしくは、その他の方法で独立メモリ空間を作らないようにする方法はありますでしょうか?  不可能な場合、CreateFileMappingが次に有効な手段として候補に挙がると思います。CreateFileMappingで管理クラスのポインタを渡してクラス共有というのは現実的な手法でしょうか?  よろしくお願いいます(..

  • mfc42.dllファイルってなんですか?

    こんにちは。 最近、プログラムの勉強をしている物ですが、例えばVBであるシステムを開発して、SetUpを作った際に、色々なプラットフォームで検証するのですが、mfc42.dllというファイルが絡んだエラーが良く出ます。 そもそも「mfc42.dll」とは何でしょうか? OSインストール時に最初から入っているものなのでしょうか? dllファイルとはダイナミックリンクライブラリの事で、OSが色んな時に使用する共通の関数が詰まっている、VBでいう標準モジュールのようなものの事ですよね?(合ってますか(^^;)?) mfc42.dllがそうなら、どういうときに使用されるのでしょうか? また、Aというソフトをインストールした後で、Bというソフトをインストールして、互いのmfc42.dllの更新日時(バージョン?)が違う場合、Bをインストールする事によってAが動かなくなる・・・というのもありえるのでしょうか?? だとしたらとても怖い事ですよね!? でもSetUp作成ソフトやVB標準のディストリビュージョンでSetUp.exeをつくると勝手にmfc42.dllが紐付かれてしまう場合が多々あります。 これを回避する方法はあるのでしょうか? どなたかご教授下さい。

  • NET2005でDllが読み込めない

      質問に追記をしたいので新設してもう一度質問をしました。 プラットフォームはVS.NET2005でC++で記述しています。 OSはWindows XP SP3です。 自分で作成したDLLを読み込むためにLoadLibrary関数でDLLを読み込んだハズなんですがエラーになり、エラー値126で、指定したモジュールがありません と出ます。 たしかに指定したフォルダにDLLがあるはずなんですが。 DLLの方は実は.NET2003で作られたDLLです。 しかし2003でも2005でも関係なくDLLは読み込まないようです。 ただ、.NET2003からコンバートしたソリューションだと正常にdllファイルを読み込んでいます。 NET2005で新規作成でプロジェクトを作り、そこの.cppファイルからdllファイルを読み込ませようとすると失敗します。 一つ気になるのが、Microsoftのホームページの以下のアドレスでその事に関する対策が載っているようです http://support.microsoft.com/kb/891401/ja この問題を解決するには、最新バージョンの Windows スクリプト ホストを使用してコンピュータを更新します。これを行うには、次のマイクロソフト Web サイトを参照してください。 解決方法としてこのように載っていますが、リンク先がありません。 何かしらどこかにリンク先がないでしょうか? もしくはこの問題を解決できる方法はありませんか? 質問でもなんでもいいので解答ください。 m( )m どうかよろしくお願いいたします。

  • MFCのexeのプログラムを MFCのdllに書き換えたい

    VC++6.0を使用しています 新規作成 MFC AppWizard(exe) 新規 OK [ステップ1] ダイアログベース 次へ [ステップ2/4] 次へ [ステップ3/4] 次へ [ステップ4/4] 終了 で作られた、雛型のexeをそっくりMFCのDLLに書き換えたい と考えています exeで作られたアプリを他のユーザーがVB6.0からDLLとして呼び出したいので書き換えて欲しいと頼まれました MFCのDLLも雛型は簡単に出来上がるのですが 以下の関数を独立したオブジェクトにして、VB6.0からDLLの関数VBFUNC1として呼び出したいのですが、VBから呼び出すと AfxEnableControlContainer();でアサートで引っ掛かってしまいます ダイアログを使用したMFCのEXEをDLLとして使う場合の、コーディングについてご指南ください BOOL CAaaApp::VBFUNC1() //BOOL CAaaApp::InitInstance() {   AfxEnableControlContainer(); #ifdef _AFXDLL   Enable3dControls(); #else   Enable3dControlsStatic(); #endif   CAaaDlg dlg;   m_pMainWnd = &dlg;   int nResponse = dlg.DoModal();   if (nResponse == IDOK)   {   }   else if (nResponse == IDCANCEL)   {   }   return FALSE; }

専門家に質問してみよう