DLLの検証のためのプログラム

本日学んだこと。

DLLを使ってテストができるようにした。

DLL とは何ぞや。昔の自分に向けて。

DLLとはwindowsにおける共有ライブラリである。 共有ライブラリは、関数などの機能をまとめたものである。 ライブラリから機能を取り出して、自分のプログラムで利用することができる。 取り出し方には

  • 静的ロード
  • 動的ロード

の二つが存在する。

静的ロードは、コンパイル時にライブラリの機能を実行ファイルに取り込む方法で、 動的ロードは、実行ファイルの実行時にライブラリから機能を取り出して使用する方法である。

静的ロードは、コンパイル時に実行ファイルの中身が決定するため、 実行速度が速いという利点と、また、共有ライブラリの中身が変わったとしてもその影響は受けないという利点を持っている 一方で動的ロードはコンパイル時にはライブラリが取り込まれないため、 静的ロードに比べて、実行ファイルのメモリは少なく済む また、共有ライブラリを変更したとしても、改めてコンパイルをしなくてもよいという利点もあります。

本日行ったこと。

自分が開発しているプロジェクトでは DLLを使っている。 しかし製品を動かそうとするのは少し手間があるため、 一部の機能のみを動かして検証ができるようになると便利である。 そこで DLL のみを検証するプログラムを作成した。

ソースコードは以下の通り。

#include <windows.h>
#include <iostream>

typedef  BOOL(*FUNC1)(const char*);

int main() {
  HMODULE hmod = LoadLibrary("test.dll");
  if (hmod == NULL) {
     printf("Fail to load library : Error[%d]", GetErrorCode()); 
     return 0;
  }

  FUNC1 func = GetProcAddress(hmod, "FuncInDLLTest");

  func("test start!!!");

  return 0;
}

このファイルを次のようにコンパイルする。

g++ -m32 main.cc -o main

メモ書き

dllは32bit

自分の作成したdllは 悲しきかな 32bit らしい。 なので、コンパイルオプションに -m32 をつける必要があった。 ほんとはもっと簡単にpythonでdllを検証する方法もあったが、 仕方なしにc++から作ることにした。

参考