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