--------(--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2011-08-16(Tue)

《VC++》DLLの作成・利用

VC++(2008 ExpressEdition)でDLLを作成・利用する方法を紹介します。
今回紹介するのはDLLを動的リンクする方法です。

ExpressEditionにはDLL作成用のテンプレートがありませんが、"空のプロジェクト"から作成することができます。
DLL作成用のソリューションを以下のように構築します。

DLLプロジェクト

・DllCall・・・作成したDLLの呼び出しを行うプロジェクトです。
・DlllTest・・・DLL作成用のプロジェクトです。こちらのプロジェクトはプロパティの構成をDLLに設定します。
DLLビルド


では、まずDLLのコードは以下のようになります。
[DllTest.cpp]
 1:#include <windows.h>
 2:extern "C" __declspec(dllexport)
 3:int __stdcall AddNumber(int argNumber)
 4:{
 5:  return argNumber + 1;
 6:}


2行目の[__declspec(dllexport)]はexeで利用するための宣言です。
(exeにエクスポートするという宣言)

また、[extern "C"]の宣言が無い場合、ビルド時に名前装飾が起こり、関数名が変化します。
(例:AddNumber→?AddNumber@@YGHH@Z)
このような場合、DLLのリンク時に装飾された関数名を指定しなければならなくなりますが、通常装飾関数名をexe側から得ることはできません。
(厳密に言えば、Dependency Walkerというソフトを使えばDLLの関数を知ることは可能です。)
このような名前装飾を行わないようにするため、[extern "C"]を宣言します。
ただし、この宣言を行ってもビルド後の関数名には"_"がつきます。(例:_AddNumber)
※また、ExpressEditionの場合、関数名のあとに@+引数のバイト数がつきます。(例:_AddNumber@4)

上記コードをビルドすると、libとdllファイルが生成されます。これらのファイルを用いて今回作成した関数を利用します。
(libファイルにはdllがエクスポートした関数が記録されています。)

次に呼び出し側のコードは以下のようになります。
[DllCall.cpp]
 1:#include <windows.h>
 2:#include <stdio.h>
 3:typedef int (__stdcall *FUNC_AddNumber)(int argNumber);
 4:int main(int argc, char* argv[])
 5:{
 6:  HMODULE hDll = LoadLibrary("DllTest.dll");
 7: if(hDll == NULL){
 8:  return -1;
 9: }
10:  FUNC_AddNumber AddNumber = (FUNC_AddNumber)GetProcAddress(hDll, "_AddNumber@4");
11: if(AddNumber == NULL)
12:  return -2;
13: }
14: int result = AddNumber(1);
15: printf("%d\n",result);
16:  if(!FreeLibrary(hDll)) {
17:  return -3;
18: }
19: return 0;
20:}


処理内容としては、6行目でdllをロードします。
10行目で呼び出したい関数アドレスのポインタを設定します。
14行目で実際に関数を利用し、16行目で解放しています。
10行目で関数名を指定してポインタを設定する場合、上記のDLL作成時における関数名命名則に注意して指定してください。

lib・dllファイルを先にビルドしてから呼び出し側をビルドして実行し、動作を確認します。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

カテゴリ
検索フォーム
RSSリンクの表示
リンク
お問い合わせ

名前:
メール:
件名:
本文:

ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。