- 締切済み
ダイアログベースアプリのDLL化の方法について
ダイアログベースで作成してあるアプリexeを DLL化するのですが、その方法が分かりません。 ダイアログの使用はやめるつもりです。 これまでやってみたことは、 プロジェクトのプロパティで、EXEファイルからDLLに設定を 変更しました。 http://hp.vector.co.jp/authors/VA019517/howtodll.html サンプルを見て、既存のソースに__stdcallなどを記載したいのですが DLLが作成されませんでした。 新規にプロジェクトを作成して、サンプル通りにやった場合は DLLが作成されました。 呼び出したい関数は、別々のファイルですが、 1つのファイルにまとめる必要がありますか? ダイアログベースはやめます。 この2つの関数は、同じDLLにします。 ↓DLL化するソース。ここを外部EXEから呼び出したい。 Test_aa_App.cpp --------------------------------------- CTest_aa_App::InitInctance(){ //初期化処理 } ↓呼び出し対象DLL Test_bb_Dlg.cpp -------------------------------- CTest_bb_Dlg::Test() { // 処理 } 初歩的なことだと思いますが、まず、どのように ソースを変更すれば良いか教えてください。 VS2003 C++6.0 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Yanch
- ベストアンサー率50% (114/225)
誰か回答を投稿しないと、質問兄さんからの状況も伺えないような気がしてきました。 その後、どうなりましたか? 手前で使用しているDLLのヘッダファイルです。参考になるかもしれません。 ---------------------------------------------------------------------- // ExportsFunctions.h /** * Requirements * Header : objbase.h olectl.h * Library: ole32.lib */ #ifndef EXPORTSFUNCTIONS_H__ #define EXPORTSFUNCTIONS_H__ #include <objbase.h> #include <olectl.h> #ifdef __cplusplus extern "C" { #endif //DLL解放の問い合わせ(DllCanUnloadNow) HRESULT __stdcall DllCanUnloadNow(void); //クラスファクトリの提供(DllGetClassObject) HRESULT __stdcall DllGetClassObject(REFCLSID rclsid, REFIID riid , void** ppv); // Dll エントリーポイント BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); //自己登録 HRESULT __stdcall DllRegisterServer(void); //自己登録の解除 HRESULT __stdcall DllUnregisterServer(void); #ifdef __cplusplus } #endif #endif // EXPORTSFUNCTIONS_H__ ---------------------------------------------------------------------- コンパイルオプションや、リンカオプションは確認してないようですが、 手前の使用しているリンカオプションだと次の様な感じです。 ---------------------------------------------------------------------- $(LINK) /DLL /DEF:exports.def /OUT:$(TARGET) $(OBJS) 後に使用するライブラリなどが続く ---------------------------------------------------------------------- >C言語には、クラスが無いので、外部から呼び出される部分は、 >C言語のコードで記述すれば良いのでしょうか? インタフェイス部分は、Cで記述し、中のコードはC++でよいようですよ。 例えば、ヘッダファイルに ---------------------------------------------------------------------- /* * ExportsFunctions.h */ #include <objbase.h> #include <olectl.h> #ifdef __cplusplus extern "C" { #endif HRESULT __stdcall test(void); #ifdef __cplusplus } #endif ---------------------------------------------------------------------- としておいて、test()の実装は、 ---------------------------------------------------------------------- #include <objbase.h> #include <windows.h> #include "ExportsFunctions.h" #include "CTest_bb_Dlg.h" HRESULT __stdcall test(void) { CTest_bb_Dlg dlg = new CTest_bb_Dlg(); dlg.Test(); return 0; } ---------------------------------------------------------------------- のようなイメージだろうか。 たぶん、そのままでは、動かないです。あくまで、参考までに。
- redfox63
- ベストアンサー率71% (1325/1856)
EXEのプロジェクトを そのままDLLのプロジェクトへの変更は簡単には出来ませんよ DLL用のプロジェクトを作成して EXE用のプロジェクトからCPP/Hなどのファイルをインポートしましょう MFCでやるのであれば _declspec(dllexport)やDEFファイルにてエクスポート関数を指定しましょう
補足
ご回答ありがとうございます。 新規にDLLプロジェクトを作成して、既存のソースを インポートすれば良いでしょうか? _declspec(dllexport)でやる場合と、DEFファイルでやる場合で 何かメリットデメリットはあるのでしょうか?
- Yanch
- ベストアンサー率50% (114/225)
エラーがないのに、DLLが作成されていないのは、 コンパイルオプションか、リンクオプションが間違っているかもしれません。 確認してみてください。 「__stdcall」と言うのは、DLL呼び出しの時に用いる、呼び出しルールの1つです。 __stdcallで宣言されている関数は、__stdcallのルールに従って、外部から、 呼び出される事が出来ます。 DLLの呼び出し方法には、__stdcall以外にも、ありますが、ここでは触れません。 >CTest_aa_App::InitInctance() >CTest_bb_Dlg::Test() は、c言語の関数では、無いように見えます。 DLLのインターフェイスにC++を使用する事は、規格外の動作なので、通常、 この様にはしません。 DLL外部から、呼び出される関数の部分には、C言語のコードを使用しましょう。 DLLの内部における処理には、C++をしようしても問題はないです。 DEFファイルは、どのような内容の物を用意したのでしょう?
補足
ご回答ありがとうございます。 >CTest_aa_App::InitInctance() >CTest_bb_Dlg::Test() この部分は、現行のC++ソースです。 C言語には、クラスが無いので、外部から呼び出される部分は、 C言語のコードで記述すれば良いのでしょうか? DEFファイルは、以下のような内容の物を用意しました。 LIBRARY Test_bb EXPORTS Test
- Yanch
- ベストアンサー率50% (114/225)
どこで、問題になっているのかは、この質問内容からは、読み取れませんよ。 >DLLが作成されませんでした。 とありますが、どう言う問題が起きましたか? コンパイルエラーが出たのなら、エラーを記述すると良いと思います。 また、期待した動作をしなかったのなら、 実際にどう言う動作をしてしまったのかも、書くと良いでしょう。 >呼び出したい関数は、別々のファイルですが、 >1つのファイルにまとめる必要がありますか? ソースファイルを複数に分割してある場合でも、DLL化するのに問題にはならないですよ。 >この2つの関数は、同じDLLにします。 この2つの関数と言うのが、見当たりませんが、どこにありますか?
補足
ご回答ありがとうございます。 エラーは、特にでないんです。 Relaseフォルダを見ても、objファイルなどができているだけで、 DLLは生成されていません。 呼び出したいのは、 InitInctance()と、Test()です。 これらは、今 クラス名:関数という風になっていますが、 呼び出すには、以下のように__stdcallとする必要があるのですか? int __stdcall Test() { return 0; } 引き続きよろしくお願いします。
補足
ご回答ありがとうございます。 具体的なソースまであげていただいて参考になります。 試してみたいと思います。 現在の状況は、新しくDLLプロジェクトを作成し、 既存のソースを移しているところです。 freadのsize_tをintに変換しました。や m_pszProfileNameの定義が見つかりません。や DLLのリンクが正しくありません。 というようなエラーが出ています。