13,007
回編集
(→Linux) |
|||
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> | |||
<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); |