DLLの作り方と使い方がわからなかったから
いろいろ教えてもらいながら試した
ので,DLLを作成.APIをエクスポートして,別のプログラムでインポートして使うまでの簡単なまとめ.
DLLを作成
[新しいプロジェクト]→[Win32プロジェクト]を選択し名前を入力.簡単なサンプルとしてWin32DllというDLLプロジェクトを作ります.
「Win32アプリケーションウィザード」がでてくるので,以下の項目にチェックを入れます.
- DLL
- シンボルのエクスポート
- SDLチェック
そのままビルド→成功するはず.Win32Dll\Debug\の下にdllとlibができてればOK.
これだけでは芸がないので少しだけコードを追加します.
ヘッダーファイルはこんな感じ.
// これはClient側での宣言の手間を省くおまじない
#ifdef WIN32DLL_EXPORTS
#define WIN32DLL_API __declspec(dllexport)
#else
#define WIN32DLL_API __declspec(dllimport)
#endif
// このクラスは Win32Dll.dll からエクスポートされました。
class WIN32DLL_API CWin32Dll {
public:
CWin32Dll(void);
~CWin32Dll(void);
// このメンバ関数を追加
int AdditionPlusTwo(int x, int y);
};
// この extern は何?
extern WIN32DLL_API int nWin32Dll;
WIN32DLL_API int fnWin32Dll(void);
WIN32DLL_API int Addition(int x, int y);
んで定義のほうはこんなの.
#include "stdafx.h"
#include "Win32Dll.h"
// これは、エクスポートされた変数の例です。
WIN32DLL_API int nWin32Dll=0;
// これは、エクスポートされた関数の例です。
WIN32DLL_API int fnWin32Dll(void)
{
return 42;
}
// エクスポートされた関数Additionの定義
WIN32DLL_API int Addition(int x, int y)
{
return x + y;
}
// これは、エクスポートされたクラスのコンストラクターです。
// クラス定義に関しては Win32Dll.h を参照してください。
CWin32Dll::CWin32Dll()
{
return;
}
CWin32Dll::~CWin32Dll()
{
}
int CWin32Dll::AdditionPlusTwo(int x, int y)
{
return x + y + 2;
}
これでとりあえずはDLL作成.エクスポートされたのは
- 変数:int nWinDll
- 関数:int fnWin32Dll(void)
- 関数:int Addition(int x, int y)
- クラス:CWin32Dll
- メンバ関数:int AdditionPlusTwo(int x, int y)
の合計4つ.
次にClient(使う)側
クライアントなのでWin32DllClientという名前にしましょう.種類はコンソールアプリケーションで.
「Win32アプリケーションウィザード」では以下の項目にチェックを入れます.
- コンソールアプリケーション
- プリコンパイル済みヘッダー
- SDLチェック
次に各種の設定を行なっていきます.順番に行きましょう.
まずは[プロパティ]→[構成プロパティ]→[C/C++]→[全般]→[追加のインクルードディレクトリ] で
c:\develop\Win32Dll\Win32Dll
を追加.
一旦プロパティを閉じて先にWin32DllClient.cppを編集しましょう.以下を追加
#include "Win32Dll.h"`
次は [プロパティ]→[構成プロパティ]→[リンカー]→[全般]→[追加のライブラリディレクトリ]
に C:\develop\Win32Dll\Debug
を追加
最後に [プロパティ]→[構成プロパティ]→[リンカー]→[入力]→[追加の依存ファイル]
に Win32Dll.lib
を追加
で,main関数にcoutでも書いてエクスポートした変数,関数,クラスが実行されるようにしておきます.全体はこんな感じ.
#include "stdafx.h"
#include "Win32Dll.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// エクスポートされた変数
nWin32Dll = 12;
cout << nWin32Dll << endl;
// エクスポートされた関数
cout << fnWin32Dll() << endl;
cout << Addition(1,1) << endl;
// エクスポートされたクラスとそのメンバ関数
CWin32Dll a;
cout << a.AdditionPlusTwo(2,3) << endl;;
return 0;
}
これでビルドは通るはず.でも F5
で実行すると
コンピュータにWin32Dll.dllがないため,プログラムを開始出来ません.この問題を解決するには,プログラムを再インストールしてみてください.
とか言われる.つまり実行時にDLL探したけど,探した中にはそんなDLLなかったよって言われてるのです.
なので,用意します.
C:\develop\Win32Dll\Debug\Win32Dll.dll
を C:\develop\Win32DllClient\Debug
にコピーします.
で,改めて実行.
(゚д゚)ウマー
おわりに
@Posaune さん,@datsuns さん,@HappyLuckyAkira さんに感謝を!