仕事の防備録。

Windows(Visual Studio 2010)にUNIXプログラム(ANSI-C)を移植するお仕事をしています。
・追加機能としてDLLを別途作成することができる。このDLLはデフォルトでは存在しない。
 →LoadLibrary()で動的リンクすればOK
・DLL側からEXE側の関数を呼びたい。でも暗号解読関数とかあるのでインターフェースのみ公開したい。
 →DLLを分割する。呼ばせたい関数が少しなら、関数のポインタを引数として渡してしまうのも有り。
  →呼ばせたい関数の数が多いのでポインタ渡しは勘弁。
  →呼ばれる関数を切り出してDLL分割するには、いくつかのソースファイルを分割する必要があるが、それが上司に却下される。

どうしようかと困っていたら、もう1つやり方があった。
EXE側で呼ばせたい関数にdllエクスポートの指定をする。するとビルドしたときにlibファイルも作成されるので、それをDLLビルド時にリンクする。
とりあえずVS2010では動くっぽい。


// まずはEXE側のソース
#include <Windows.h>
#include <stdio.h>

// Proto Type
__declspec(dllexport) int EXE_FUNC(char*);

// DLL関数のポインタ
typedef int (*DLL_FUNC)(char *);

// struct
typedef struct {
  int  flg;
  char work[16];
} TEST_ARG;

int main(void)
{
  // DLLを動的リンクするための変数
  HMODULE hmod;
  DLL_FUNC dll_func;

  // DLLの関数に引き渡す変数
  TEST_ARG test_arg;
  memset(&test_arg, 0, sizeof(TEST_ARG));

  // DLL動的リンク start
  hmod = LoadLibrary("test.dll");
  if(hmod != NULL)
  {
    // DLLの関数を呼び出す
    dll_func = (DLL_FUNC)GetProcAddress(hmod, "DLL_FUNC");
    if(dll_func != NULL)
    {
      dll_func((char*)&test_arg);
    }
  }
  FreeLibrary(hmod);
  // DLL動的リンク end

  return 0;
}

// DLLから呼び出される関数
int EXE_FUNC(char *arg)
{
  // 引数を構造体にセット
  TEST_ARG *w_arg = NULL;
  w_arg = (TEST_ARG *)arg;

  // 値の変更
  memcpy(w_arg->work, "1", 1);
  w_arg->flg = 99;

  return 0;
}

--------------------
// ここからDLL側のソース
#include <Windows.h>

// EXEのlibファイルをリンク
#pragma comment(lib, "testexe.lib")

// Proto Type
__declspec(dllexport) int DLL_FUNC(char *);
extern int EXE_FUNC(char *);

// EXEから呼ばれる関数
int DLL_FUNC(char *test_arg)
{
  // EXEの関数を呼び出す
  EXE_FUNC(test_arg);

  return 0;
}

コメント

最新の日記 一覧

<<  2025年6月  >>
1234567
891011121314
15161718192021
22232425262728
293012345

お気に入り日記の更新

この日記について

日記内を検索