初心者向けプログラミング解説になります。
今回は、DLLの使い方についてになります。
C++でDLLを作成して、C++のEXEで実行する手順までまとめましたので、ご参考ください。
概要
DLL(でぃーえるえる)ファイルとは
ダイナミックリンクライブラリの略になります。
一言でいうと、中身が関数のみのファイルになります。
DLLの関数は、複数の実行ファイル(exe)などから呼べます。
例えば、ログ出力用の関数を作った場合、他でも使うことがあると思います。
そういったとき、毎回ログ出力関数をコピペしても良いのですが、DLL化しておけば、コピペしなくても使えるようになります。
メモリ管理は、呼んだ側それぞれで行います。なので、実行ファイル内に関数をコピペしたのと同じ動きになります。
LIB(りぶ)と、h(ヘッダー)ファイル
呼び出す側(exeファイルなど)が、DLLを使うときにコンパイルやビルドで必要になるファイルです。
対象となる呼び出す側(exeファイルなど)は、C++言語の環境のみです。
VB.NETやC#の開発環境では、使用しません。DLLのみあれば十分です。こちらは次回解説したいと思います。
hファイルは、コンパイル時に使います。
libファイルは、リンク時に使います。
- コンパイルとは文法に間違いないか自動で点検してくれる機能
- リンクとは今回のようにDLLなどの外のファイルとの連携の文法に間違いないか自動で点検してくれる機能
- コンパイルとリンクをまとめて行う事をビルドなんて呼んでたりします
もうひとつ、スタティックリンクライブラリなんてのもありますが、これはまた別の機会で。
実践
まぁ、文字でごにょごにょ説明するよりかは、実際に動きを見てみたほうが早い。
まず、プログラミング開発環境の作り方については、以下で解説してますのでご参考ください。
無料でセッティングできます。
dll(C++)の作成手順
呼び元の作成(DLL)手順になります。
- 新規プロジェクト作成 → ダイナミックリンクライブラリ(c++)
- プロジェクト名「cdll」とします。
- 「場所」は、お好みで。
- ヘッダーファイルの作成
- ヘッダーファイル名は、プロジェクト名と同じ「cdll.h」とします。
- 「cdll.h」を編集します。
#pragma once
#ifndef __CDLL_H
#define __CDLL_H
#ifdef CDLL_EXPORTS
#define CDLL_API __declspec(dllexport)
#else
#define CDLL_API __declspec(dllimport)
#endif
CDLL_API int WINAPI functest(void);
#endif
大文字で「CDLL」と記載されている部分は、プロジェクト名と同じ名前にするとよいと思います。
どういう意味かというと、
- DLL側は、エクスポート
- exeなど使う側は、インポート
で動作するという意味になります。
メールソフトとかのエクスポート・インポートと同じような意味です。
- アドレス帳とかの情報をファイルに落としたいときは、エクスポート。
(DLL関数を使わせたい場合はエクスポート) - ファイルに落としたものを取込みたいときは、インポート。
(DLL関数を使いたい場合はインポート)
- 「dllmain.cpp」を編集します。
#include "cdll.h"
CDLL_API int functest()
{
return 10;
}
- 「x86」を「x64」に変更します。
- メニュー「ビルド」-「ソリューションのビルド」を実行します。
ビルドが成功したら、libファイルとdllファイルが出来上がります。
dll側の作成は以上です。
(VB.NETを使用するときにエラー修正がありますが、これはまた次回にでも)
exe(C++)の作成手順
呼び側の作成(C++コンソール)になります。
- 新規プロジェクト作成→コンソールアプリケーション(C++)
- プロジェクト名「capp_cdll」とします。
- 上記DLLで作成した「cdll.h」と「cdll.lib」を、「capp_cdll」のローカルにコピーします。
(.cppファイルとかが置かれているところと同じフォルダ)
- 「capp_cdll.cpp」ファイルを編集します。
- インクルード定義。
「cdll.h」内で「WINAPI」使っているので、「cdll.h」の前に「windows.h」もインクルードします。
#include <windows.h> // WINAPI
#include "cdll.h"
- libファイル定義。
プロジェクトのプロパティで設定することも可能です。お好みで。
#pragma comment(lib, "cdll")
- DLLの関数を使用してみる。
int main()
{
int i = functest();
std::cout << i;
}
- 「x86」を「x64」に変更し、ビルドを実行します。
- ビルドに成功したら、上記DLLで作成した「cdll.dll」を、「exe」と同じ場所にコピーします。
実行すると、コンソール(黒い)画面に、「10」と表示されました。(functest()関数の戻り値「10」が返ってきました。)
実行結果の画像です。見にくいですが、左上にちょこっと「10」と表示されております。
最後に
以上で、C言語DLLを、C言語EXEで使用する方法になります。
次回は、EXEの方を別の言語(VB.NET)に変えて試した解説になりますのでこちらも是非チャレンジしてみてください。
DLLの作成は、めっちゃ出来の良い関数が作れたなーって思ったときにちょっと試してみるのも良いかもしれませんね。
あとは、どの言語でも使えますので便利です。
VB.NETやC#にコピペしていちいち翻訳する作業が省けますからね。
最後まで見てくれてありがとう。