HIDARI日記(右)

そのときどき興味ある技術を中心にだらだら書いてます。内容は個人の見解であり、所属する企業を代表するものではありません。

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.dllC:\develop\Win32DllClient\Debug にコピーします.

で,改めて実行.

(゚д゚)ウマー

おわりに

@Posaune さん,@datsuns さん,@HappyLuckyAkira さんに感謝を!