- ベストアンサー
VC++2010でdllファイルの作成について
プログラミングを始めたばかりです。 詳しく教えて下さい。 Microsoft Visual C++ 2010 Expressにて コンソールアプリを作ってdllファイルから「Test」とprintfで表示するプログラムを作ろうとしていますが、 ネットで探してもこれだ!と言うものがヒットしません。 どなたかご教授お願いします。 dllの作成方法と、dllの読み込み方法をあわせて教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
DLLを作る時はWin32プロジェクトでDLLを選択。ここまではいいですよね。 その後は確かにVisualStudioも不親切だと思います。(アレ、2005あたりまではもうちょっと親切だった気がするんですが) プロジェクト名をTestDllにして作ったとします。 ここでひな形にTestDll.cppが出来てますから、その中に自分が追加する関数を記述します。 #include <Tchar.h> #include "TestDll.h" void TestFunc() { _tprintf(_T("Test\n")); } 次にヘッダーファイルを自分で追加します。ヘッダーファイルを右クリックして、追加(D) - 新しい項目(W)...ですね。 ファイル名はなんでもいいんですが、ここはTestDll.hにしておきましょう。 追加したら先ほどの関数のプロトタイプを一行記述します。 void TestFunc(); このヘッダファイルはdllを読み込む側が使うヘッダファイルです。 これでビルドは通りますが、DLLとして追加した関数を使えるようにするためには関数をエクスポートする必要があります。(ここが不親切) ソースファイルに自分で追加します。ソースファイルを右クリックして、追加(D) - 新しい項目(W)...です。ファイル名はプロジェクト名.def (TestDll.def) で作成。 中身は以下のように記述します。 LIBRARY EXPORTS TestFunc @1 ここで記述された関数が他のアプリから呼べる関数になります。@1は関数が複数ある場合に@1,@2,@3と連番をつけてあげます。 以上でビルドすれば..\Debugに TestDll.dll と TestDll.lib が作成されます。 他のアプリにリンクする場合は、自分で作ったTestDll.h を含めてこの3ファイルが必要になります。 もちろん実行時はTestDll.dllだけexeと一緒になってればよいです。 次にアプリケーション側から使う場合です。 Win32のコンソールアプリを作ってください。 プロジェクトのプロパティを開いて、VC++ディレクトリを選択して以下を行います。 ・インクルードディレクトリにTestDll.hが存在するディレクトリを追加 ・ライブラリディレクトリにTestDll.libが存在するディレクトリを追加 次にリンカーの入力を選択して追加の依存ファイルにTestDll.libを追加します。 以上です。あとはアプリで普通にDLLの関数が呼べます。 #include "stdafx.h" #include "TestDll.h" int _tmain(int argc, _TCHAR* argv[]) { TestFunc(); return 0; } 実行するときにdllをexeと同じディレクトリに置くのを忘れないでください。 自前でDLLを作る場合は*.hと*.libと*.dllを1セットにするのが通常です。市販されているようなものもこの形式で提供されています。 この方法とは別にdllファイルしかない場合のリンク方法とか、動的にロードしたいとか、使う方法は複数ありますがとりあえず一番簡単な方法は上記の方法ですよ。
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
"シンボルのエクスポート"にチェック入れておけば「ひな形」吐いてくれますよ?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> それはわかっています なにがわからんですか? #ifndef DLL_SAMPLE_H__ #define DLL_SAMPLE_H__ #ifdef DLL_SAMPLE_EXPORTS #define ABC_EXPFUNC __declspec(dllexport) #else #define ABC_EXPFUNC __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif ABC_EXPFUNC void __stdcall TestFunc(); #ifdef __cplusplus } #endif #endif ...などなど。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
補足
それはわかっています