他人が作った関数を使うとは?DLL編

exeファイルの中にすべての関数の処理をバイナリで持たなくてもいい方法がある。WindowsではDLLファイルがC:\WINDOWSやC:\Windows\system32のフォルダに沢山あります。exeファイルは実行時にDLLファイルを自分のプロセス内のメモリに呼び込み(ほぼfopen関数状態)使う関数のアドレスを探し(PATH環境変数のフォルダにあるDLLファイルを自分で探す。exeファイルが置いてあるフォルダも探す)、実行できる状態になる。これは、コンパイル時のコマンドラインで渡すlibファイルなどのファイルの内容でDLLファイルを使うかどうかが決まる。関数の中身がコンパイルしたexeファイルに無いためexeファイルは小さくなる。
 exeファイルとDLLファイルはどちらも実行可能なファイルだ。しかし、エクスプローラやcmd.exe(コマンドプロンプト)は拡張子を見て単独で実行可能かどうか判断するので拡張子がDLLの場合は単独では実行できない。

mylib.cpp-----------------------------------------------------
__declspec(dllexport) int add(int a)
{
return (a+1);
}

mylib.h-------------------------------------------------------
__declspec(dllimport) int add(int);

main.cpp------------------------------------------------------
#include<stdio.h>
#include"mylib.h"

int main(void){
	int i;

	i=1;
	i=add(5);
	printf("%d\n",i);
	return 0;
}

DLLファイルを作る。
C:\usr\opencv\C_C++の練習\dll>cl /LD mylib.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

mylib.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:mylib.dll
/dll
/implib:mylib.lib
mylib.obj
ライブラリ mylib.lib とオブジェクト mylib.exp を作成中

libファイルも作られています。ファイルができていることを確認します。
C:\usr\opencv\C_C++の練習\dll>dir mylib.dll mylib.lib
 ドライブ C のボリューム ラベルがありません。
  ボリューム シリアル番号は 8808-D6F4 です

  C:\usr\opencv\C_C++の練習\dll のディレクトリ

2010/02/14 10:04 40,960 mylib.dll

  C:\usr\opencv\C_C++の練習\dll のディレクトリ

2010/02/14 10:04 1,690 mylib.lib
  2 個のファイル 42,650 バイト
  0 個のディレクトリ 8,197,521,408 バイトの空き領域

dllファイルを使ったmain.cppをコンパイルして実行ファイルを作る。
C:\usr\opencv\C_C++の練習\dll>cl main.cpp mylib.lib
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

main.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:main.exe
main.obj
mylib.lib

実行します。
C:\usr\opencv\C_C++の練習\dll>main
6

C:\usr\opencv\C_C++の練習\dll>

本当に実行時にdllファイルを呼び込んでいるのか?

dllファイルを変更してmain.exeを実行してみます。
returnの計算をa+1からa+100に変更します。
mylib.cpp------------------------------------------
__declspec(dllexport) int add(int a)
{
       return (a+100);
}

C:\usr\opencv\C_C++の練習\dll>cl /LD mylib.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

mylib.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:mylib.dll
/dll
/implib:mylib.lib
mylib.obj
  ライブラリ mylib.lib とオブジェクト mylib.exp を作成中

C:\usr\opencv\C_C++の練習\dll>main
105
注意!。main.exeはコンパイルしてません。そのままです。
「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
名前:
コメント:
最終更新:2010年02月14日 10:34
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。