「ライブラリの基礎 - C++DLL」の版間の差分

ナビゲーションに移動 検索に移動
77行目: 77行目:
== サンプルコード ==
== サンプルコード ==
C++ DLLの作成方法は[[DLLを作成する(MFC)|コチラを参照]]する。<br>
C++ DLLの作成方法は[[DLLを作成する(MFC)|コチラを参照]]する。<br>
念のため、下記にもC++ DLLを記述する。<br>
下記にもC++ DLLを記述する。<br>
  <source lang="c++">
  <source lang="c++">
  SampleDLL.h
  SampleDLL.h
91行目: 91行目:
  #include <string.h>
  #include <string.h>
  #include "SampleDll.h"
  #include "SampleDll.h"
typedef struct tagSampleStruct
{
    int index;
    char name[128];
    int data[50];
} SampleStruct, *pSampleStruct;
   
   
  double __stdcall SampleFunc01(int a)
  double __stdcall SampleFunc01(int a)
123行目: 130行目:
  EXPORTS
  EXPORTS
           ; 公開する関数名をリストアップ
           ; 公開する関数名をリストアップ
  SampleFunc01  @1
          SampleFunc01  @1
           SampleFunc02  @2
           SampleFunc02  @2
           SampleFunc03  @3
           SampleFunc03  @3
132行目: 139行目:
文字列をC++ DLL側から返す場合は、string型ではなくStringBuilderクラスを使用する必要がある。
文字列をC++ DLL側から返す場合は、string型ではなくStringBuilderクラスを使用する必要がある。
StringBuilderクラスは受け渡しの両方が可能なので、文字列はStringBuilderクラスを使用すべきである。
StringBuilderクラスは受け渡しの両方が可能なので、文字列はStringBuilderクラスを使用すべきである。
C++では構造体のサイズはコンパイル時に決定されるが、C#では実行時に決定される。
したがって、C#側で構造体のサイズを予め指定する必要がある。
この場合、構造体は固定長サイズとなるため、配列などを定義する場合は異なるサイズの配列を後からインスタンス化することができなくなる。
  <source lang="c#">
  <source lang="c#">
  using System;
  using System;
155行目: 166行目:
       // C++ DLL側の文字コードがUnicodeの場合は"CharSet = CharSet.Unicode"と明示的に指定する
       // C++ DLL側の文字コードがUnicodeの場合は"CharSet = CharSet.Unicode"と明示的に指定する
       private static extern void SampleFunc03(int a, StringBuilder str);
       private static extern void SampleFunc03(int a, StringBuilder str);
/// <summary>
        /// 構造体を引数に持つ関数のインポート例
        /// </summary>
        /// <param name="st">DLL 側に渡す構造体を指定します</param>
        [DllImport("Tips_Win32DLL.dll")]
        private static extern void Sample04(SampleStruct st);
        /// <summary>
        /// DLLとの取り合いのために定義する構造体
        /// LayoutKind.Sequentialを指定することで、C/C++同様、変数の宣言順通りにメモリに配置されるようになる
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        private struct SampleStruct
        {
          /// <summary>
          /// 4バイト符号付整数
          /// </summary>
          [MarshalAs(UnmanagedType.I4)]
          public int index;
          /// <summary>
          /// 固定長文字配列(SizeConstは配列のサイズを示す)
          /// </summary>
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
          public string name;
          /// <summary>
          /// 固定長配列(SizeConstは配列の要素数を示す)
          /// </summary>
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
          public int[] data;
        }
   
   
       static void Main(string[] args)
       static void Main(string[] args)
匿名利用者

案内メニュー