single.php

VC++からマネージコードで生成したDLL内の関数を呼び出す

先回までに、ハッシュ暗号化を取り扱うマネージドクラスを使ったDLLの作成を紹介してきました。今回は、作成したDLLをVC++から呼び出す手順について紹介します。

マネージドクラス

詳細は手順は、先回の「VC++で.NETの SHA256Managed クラスを利用する(ハッシュ関数の実装)」で紹介していますが、VC++で作成したプロジェクトでも、C#のようにマネージドクラス(.NET Framework で提供されるクラス)を利用することが可能です。

VC++で作成するアプリケーションは、アンマネージドなプログラムであることが多いので、マネージドクラスを使う場合にはDLL化して本体プログラムと分離して、必要な場合に、呼び出す方が本体プログラムが受ける影響から解放されます。

また、ビルド時や他のライブラリとの互換性などを考慮に入れても、マネージドとアンマネージドのプログラムが共存させるよりは、開発が効率的になります。

通常のDLL呼び出しの手続き

先回の「VC++で.NETの SHA256Managed クラスを利用する(ハッシュ関数の実装)」で紹介したDLLを呼び出すには、次のような手順で行います。

LoadLibraryで引数にしている”MFCLibrary1.dll”は、DLLが保存されている場所に適宜変更してください。

CString Hash(CString sSource)
{
  CString sResult = _T("");
  HINSTANCE hInst = LoadLibrary(_T("MFCLibrary1.dll"));
  if (hInst != NULL)
  {
    typedef long(*HASHSHA256)(CHAR*, CHAR*);
    HASHSHA256 hashsha256;
    hashsha256 = (HASHSHA256)(::GetProcAddress(hInst, "hashsha256"));

    int nSize = sSource.GetLength();

    char* pSource = new char[nSize + 1];
    memset(pSource, 0x00, nSize + 1);
    memcpy(pSource, sSource.GetBuffer(), nSize);
    sSource.ReleaseBuffer();

    nSize = hashsha256(pSource, NULL);
    if (nSize > 0)
    {
      char* pHash = new char[nSize + 1];
      memset(pHash, 0x00, nSize + 1);
      nSize = hashsha256(pSource, pHash);
      if (nSize > 0)
      {
        sResult = CString(pHash);
      }

      delete[] pHash;
      pHash = NULL;
    }

    delete[] pSource;
    pSource = NULL;

    FreeLibrary(hInst);
  }

  return sResult;
}

マネージドでもアンマネージでも、DLLの呼び出し手続きに変更はありません。

日本語の文字列を引数などで利用する場合には文字コードの部分で工夫が必要になるケースもありますが、数値などのデータの場合には特に気にすることなくDLLの関数に値を引き渡すことができます。

こんな感じで、外部DLLを利用することでアンマネージのプログラムから、.NET Frameworkを利用した外部ライブラリを利用することが可能になります。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です