Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

手順

プロジェクトの作成

エクスポート関数の実装

以下、2つのメソッドをエクスポートしている。

ヘッダ・ファイル、ソース・ファイル、モジュール定義ファイルを作成して関数をエクスポートする方式

明示的ロードが必要だが、関数のエクスポートが簡単な方式

簡単な方式では明示的ロードでVC、DOTNETから使用するので、
ヘッダ・ファイル、モジュール定義ファイルなどのモジュールが不要。

DLLの呼び出し方法

暗黙のうちにリンク

∗.libファイルを使用する。

リンカが*.libファイルを使ってインポートされている
関数/変数の参照を解決しながら*.objモジュールを結合し、
∗.exeファイル(必要なDLLとインポートされているシンボルの
リストであるインポートテーブルを格納している)を生成する。

明示的にリンク

明示的なリンクでは、*.libファイルを使用せず
(従って、*.exeファイルはインポートテーブルを持たない)、
Win32APIのLoadLibrary?を使用してDLLをロードする。

DLL呼び出し側コード例

VC++

// VC_Client1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <windows.h>
#include "../../VC_DLL/MYLIBAPI.h"

int _tmain(int argc, _TCHAR* argv[])
{
  // 通常のLibを使用したDLL関数の呼び出し方法。
  Test_MYLIBAPI(L"text", L"caption");

  return 0;
}

C#

.NETからのDLL呼び出し(P/Invoke)では、 明示的なリンクを使用している。

/// <summary>VC_DLL.TestArrayMethod</summary>
[DllImport("VC_DLL.dll")]
private extern static int TestArrayMethod(A a, ref A pa, int len, [In, Out] A[] aa);
// 第4引数(構造体配列)を、結果受け取り用で宣言する場合は 
// "ref" では不可、"[Out]" 属性を設定する必要がある

/// <summary>DLL呼び出し</summary>
private void Button1_Click(object sender, RoutedEventArgs e)
{
  try
  {
    A a1 = new A();
    A a2 = new A();
    A[] a3 = new A[3];

    a1.m1 = 8;
    a1.m2_in = "{入力値側}";

    // 正常系: 第3引数(配列サイズ)を正しく指定
    int ret1 = TestArrayMethod(a1, ref a2, a3.Length, a3);
  }
  catch (SEHException ex)
  {
    //MessageBox
    MessageBox.Show(
      "Err.Number:" + ex.ErrorCode + "\r\n" +
      "Err.Description:" + ex.Message,
      "例外", MessageBoxButton.OK);
  }
}

補足

参考

DLLの作成

P/Invoke


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS