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

ナビゲーションに移動 検索に移動
776行目: 776行目:


== 文字列のマーシャリング (2) ==
== 文字列のマーシャリング (2) ==
C++ DLLの作成方法は[[ライブラリの基礎 - DLLの作成(C/C++/MFC)|ライブラリの基礎 - DLLの作成(C/C++/MFC)]]を参照する。<br>
==== Linux ====
Linux向けC++ライブラリを記述する。<br>
<syntaxhighlight lang="c++">
// SampleLib.cpp
#include <cstdio>
extern "C" double __attribute__((visibility("default"))) SampleFunc01(int a)
{
    printf("--<SampleDll:SampleFunc01>--\r\n");
    printf("a = %d\r\n", a);
    printf("---------------------------\r\n");
    return 3.14;
}
extern "C" void __attribute__((visibility("default"))) SampleFunc02(int a, char *pstr)
{
    printf("--<SampleDll:SampleFunc02>--\r\n");
    printf("[%d] %s\r\n", a, pstr);
    printf("-----------------------------\r\n");
}
extern "C" void __attribute__((visibility("default"))) SampleFunc03(int a, char *pstr)
{
    printf("--<SampleDll:SampleFunc03>--\r\n");
    printf("[%d] %s\r\n", a, pstr);
 
    sprintf(pstr, u8"C++ DLL側から文字列を返す場合は、StringBuilderクラスを使用する");
    printf("------------------------\r\n");
}
</syntaxhighlight>
<br>
==== Windows ====
Windows向けC++ DLLの作成方法は[[ライブラリの基礎 - DLLの作成(C/C++/MFC)|ライブラリの基礎 - DLLの作成(C/C++/MFC)]]を参照する。<br>
<br>
<br>
下記にもC++ DLLを記述する。<br>
下記に、C++ DLLを記述する。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // SampleDLL.h
  // SampleDLL.h
851行目: 885行目:
       /// <param name="a">4 バイト符号付き整数を指定します。</param>
       /// <param name="a">4 バイト符号付き整数を指定します。</param>
       /// <returns>倍精度浮動小数を返します。</returns>
       /// <returns>倍精度浮動小数を返します。</returns>
       [DllImport("SampleDLL.dll")]
       [DllImport("SampleDLL.dll")] // Windows
      [DllImport("SampleLib.so")]  // Linux
       private static extern double SampleFunc01(int a);
       private static extern double SampleFunc01(int a);
   
   
       [DllImport("SampleDLL.dll", CharSet = CharSet.Unicode)]
       [DllImport("SampleDLL.dll", CharSet = CharSet.Unicode)] // Windows
      [DllImport("SampleLib.so", CharSet = CharSet.Auto)]      // Linux
       // C++ DLL側の文字コードがUnicodeの場合は"CharSet = CharSet.Unicode"と明示的に指定する
       // C++ DLL側の文字コードがUnicodeの場合は"CharSet = CharSet.Unicode"と明示的に指定する
       private static extern void SampleFunc02(int a, string str);
       private static extern void SampleFunc02(int a, string str);
   
   
       [DllImport("SampleDLL.dll", CharSet = CharSet.Unicode)]
       [DllImport("SampleDLL.dll", CharSet = CharSet.Unicode)] // Windows
      [DllImport("SampleLib.so", CharSet = CharSet.Auto)]      // Linux
       // 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);

案内メニュー