2013年6月29日土曜日

Windows メモ ~ Dllの作り方 ~


はじめに


Visual StudioにてDllを作成する方法は2つある。
  1. declspec(dllexport)を使う方法
  2. declspec(dllexport)を使わない方法
以下これらについてまとめる。作業環境はVisual Studio 2010 Expressである。

declspec(dllexport)を使う方法

  1. Win32コンソールアプリケーションを選択。
  2. アプリケーションの設定で、「DLL」と「空のプロジェクト」を選択。
  3. mydll.hを作成し、以下を記述する。 マクロはプロパティに記述されているものを使うと便利である。ここではDLLWITHEXPORT_EXPORTSを用いた。
    そうでない場合は、下記の.cppの一番先頭(#include "mydll.h"の前)にそのマクロを#defineすること。 Dllをビルドする場合は__declspec(dllexport)が使われ、ヘッダとして公開される場合は__declspec(dllimport)が使われる。
  4. mydll.cppを作成し、以下を記述する。
  5. ビルドする。DebugあるいはReleaseフォルダ内にプロジェクト名と同じ名前の.lib/.dllファイルが作成される。
  6. できあがったDllを使うため、通常のコンソールアプリを作る。
    main.cppを作り、以下を記述する。 「追加のインクルードディレクトリ」にmydll.hへのパス、「追加のライブラリディレクトリ」にDllWithExport.libへのパスを記述する。「追加の依存ファイル」にDllWithExport.libを記述する。DllWithExport.dllを実行ファイルと同じフォルダにコピーするか、VSの検索パスに登録しておく(たとえば環境変数に、dllを含むフォルダへのパスを記入する)。
  7. 実行する。

declspec(dllexport)を使わない方法

  1. 先と同じようにDll用のプロジェクトを作る。
  2. mydll.hを作成し、以下を記述する。__declspec(dllexport)がないことに注意。
  3. cppと同じフォルダ内にmydll.defを作成し、以下を記述する。 LIBRARYと同じ行にdll名(プロジェクト名と同じ名前のdll)を、EXPORTSの下に一行ずつexportする関数名を書く。これがdllexportの役割を果たす。
  4. プロパティの「モジュール定義ファイル」にmydll.defを記述する。
  5. ビルドする。

C#からの呼び出し

  1. 空のプロジェクトを作る。
  2. DllTest.csファイルを作り以下を記述する。 8,9行目でdllから関数addを取り出し、Addという名前の関数を定義している。 同じ名前のまま使用するなら、EntryPointの記述は必要ない。
  3. 実行すると失敗する。 「DLL 'DllWithExport.dll'の'add'というエントリポイントが見つかりません」
  4. dllを作成する際、以下を記述した。 このとき、C++のコンパイラは関数の名前を装飾する。したがって、dllから明示的に関数を取り出す場合、その装飾された名前を指定しなければならない。これを避けるには、Dllを作るとき名前装飾が起こらないようにすればよい。 以下のようにする。 つまり、Cの規約にしたがって関数名を作成する。
  5. これで実行できる。
  6. C++のdoubleとC#のdoubleは自動的に対応付けられる。明示的に対応付けが必要な場合はMarshallingなる機能を使う。

0 件のコメント:

コメントを投稿