D言語による DLL (ダイナミックリンクライブラリ) のビルド

D言語でも簡単に複数の関数から .dll ファイルをビルドすることができます。ビルドした .dll ファイルは、C言語、D言語どちらのプログラムからでも呼び出すことができます。

まずは、呼び出される側のプログラムです。dll.d、callee.d、callee.def の3つのファイルを用意します。

dll.d
import core.sys.windows.dll;
import std.c.windows.windows;

extern(Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved) {
  switch (ulReason) {
    case DLL_PROCESS_ATTACH:
      dll_process_attach(hInstance, true);
      break;

    case DLL_PROCESS_DETACH:
      dll_process_detach(hInstance, true);
      break;

    case DLL_THREAD_ATTACH:
      dll_thread_attach(true, true);
      break;

    case DLL_THREAD_DETACH:
      dll_thread_detach(true, true);
      break;

    default:
      break;
  }
  return true;
}

callee.d
extern (C) int add(int i, int j) {
  return i + j;
}

extern (C) int multiply(int i, int j) {
  return i * j;
}

callee.def
LIBRARY callee.dll
EXETYPE NT
CODE SHARED EXECUTE
DATA WRITE
EXPORTS
  add
  multiply

以上のファイルを使って、次のようにすると、callee.dll がビルドされます。

> dmd -shared dll.d callee.d callee.def -ofcallee.dll

続いて、呼び出す側のプログラムです。
まずは、C言語の場合です。

caller.c
#include <stdio.h>
#include <windows.h>

int main(void) {
  HINSTANCE dll = LoadLibrary("callee.dll");
  int (*add)(int, int) = (int (*)(int, int))GetProcAddress(dll, "add");
  int (*multiply)(int, int) = (int (*)(int, int))GetProcAddress(dll, "multiply");
  printf("%d\n", add(1, 1));
  printf("%d\n", multiply(1, 1));
  FreeLibrary(dll);
  return 0;
}
> gcc caller.c -o caller.exe

次に、D言語の場合です。

caller.d
import std.stdio;

extern (Windows) void* LoadLibraryA(in char*);
extern (Windows) void* GetProcAddress(void*, in char*);
extern (Windows) int FreeLibrary(void*);

alias extern (C) int function(int, int) typeOfFunction;

void main() {
  auto dll = LoadLibraryA("callee.dll");
  auto add = cast(typeOfFunction)GetProcAddress(dll, "add");
  auto multiply = cast(typeOfFunction)GetProcAddress(dll, "multiply");
  writeln(add(1, 1));
  writeln(multiply(1, 1));
  FreeLibrary(dll);
}
> dmd caller.d -ofcaller.exe

後は、.exe ファイルと同じフォルダに .dll ファイルを入れるか、.dll ファイルのある場所にパスを通しておけば実行できます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中