2015年7月17日金曜日

DLLの作成

DLLを作成し,DLLを読み込んで動作するプログラムを作成する。

今回は,Qtで使用することを前提としています。したがって,"*.libファイル"は同梱できません。したがって,今回は明示的なリンクを採用する。

作成時の注意
"dllファイル"内で外に公開したい関数は,定義の前に"__declspec(dllexport)"を付ける。もしくは,"*.def"ファイルを作成してコンパイル時にコンパイラにわたすようにする。

使用時の注意
"*.dllファイル"の使用方法は,明示的なリンクと暗黙的なリンクがある。このうち,"*.dllファイル"のみで作成可能なものが明示的なリンクである。

Visual Studio 2013 Expressでの開発を前提に説明します。

「新しいプロジェクト -> Visual C++ -> Win32 コンソール アプリケーション」を選択し,任意のプロジェクト名を入力し,次へ。
「アプリケーションの選択 -> アプリケーションの種類」で,"DLL"を選択して完了をクリック。

今回はプロジェクト名を"HelloWorld_Dll"にしました。

"HelloWorld_Dll.cpp"を開き,ココに関数を記述していきます。
#include "stdafx.h"
#include "iostream"

using namespace std;

void HelloWorld()
{
 cout << "Hello World!" << endl;
}

「ソースファイル -> 追加 -> 新しい項目 -> c++ファイル」で名前を"HelloWorld.def"とし,作成する。ここで,名前は任意のものでよいが,拡張子は必ず"*.def"にすること。

ソリューション"HelloWorld_Dll"のプロパティを開き,「構成プロパティ -> リンカ- -> 入力 -> モジュール定義ファイル」を選択し,編集で"HelloWorld.def"と入力し,適用する。

defファイルに記述する内容は以下のとおり。
LIBRARY HelloWorld_Dll

EXPORTS
 HelloWorld @1

"LIBRARY"はプロジェクト名と合わせます。今回,"EXPORTS"はdllファイル内で今回利用する関数を指定します。"HelloWorld"関数を呼び出し可能にし,また,序数(ordinal)を1に設定し,序数エクスポートを可能にしています。

さて,以上でdllファイルが作成されました。つぎに作成したdllファイルを利用するプログラムを作成します。

今回作成したプロジェクト⇒

--
参考にしたサイト

チュートリアル: ダイナミック リンク ライブラリの作成と使用 (C++)
https://msdn.microsoft.com/ja-jp/library/ms235636.aspx

モジュール定義 (.def) ファイル
https://msdn.microsoft.com/ja-jp/library/28d6s79h.aspx

DEF ファイルを使った DLL からのエクスポート
https://msdn.microsoft.com/ja-jp/library/d91k01sh.aspx

EternalWindows
http://eternalwindows.jp/windevelop/dll/dll09.html

人生をかるくする秘密のバックヤード
http://exlight.net/devel/windows/dll/windll.html

Let's Discover Second Edition!!
http://www2s.biglobe.ne.jp/~ragnarok/program/win32/class_of_cpp_in_dll.htm

Riri-Soft
http://hp.vector.co.jp/authors/VA019517/howtodll.html

-- [明示的なリンク] --

小さい頃はエラ呼吸
http://replication.hatenablog.com/entry/2014/05/02/101020

-- [暗黙的なリンク] --

Gobble up pudding
http://fa11enprince.hatenablog.com/entry/2014/06/20/015808

0 件のコメント:

コメントを投稿