前回のように、ホストAPIを使って直接CLRを読み込むほかに、間接的に読み込む方法も色々あります。今回は、C++/CLIを使って、マネージとアンマネージの橋渡しをするDLLを作ります。

//td.cpp
#include <windows.h>
#pragma unmanaged
extern "C"
BOOL WINAPI DllMain(HINSTANCE, DWORD, void*)
{
	return TRUE;
}
#pragma managed
extern "C" __declspec(dllexport)
BSTR WINAPI DoubleToString(double d, char const* format)
{
	using System::Runtime::InteropServices::Marshal;
	System::String^ s = d.ToString(gcnew System::String(format));
	System::IntPtr ipBStr = Marshal::StringToBSTR(s)
	return static_cast<BSTR>(ipBStr.ToPointer());
}

関数DoubleToStringは、単にDouble.ToStringを呼ぶだけです。

さて、コンパイルは次のようにしました。DLLではマニフェストをリソースID2で埋め込まないと、Declare時ABコンパイラで読み込めません(一般的に言うとLoadLibaryに失敗します)。

cl /MD /clr td.cpp /link /DLL /out:td.dll
mt -manifest td.dll.manifest -outputresource:td.dll#2

これで、ABからは、Declare Function DoubleToString Lib "td" Alias "_DoubleToString@12" (d As Double, format As PCSTR) As BSTRとすればこのDLLの関数DoubleToStringを使えます。

さて、これでいったい何をしたかというと、それは次回に回します。


なお、今回はマネージコード入りのネイティブDLLはかなり注意が必要であるという話ではありません。そちらについては、KB814472ほかここここ(旧URL: http://konuma.txt-nifty.com/blog/2005/11/dll_b2b5.html)を参照してみてください。それはそれで重要な問題なので、いつか取り上げたいんですけどね。

2018年4月22日追記: リンクURLの変更に伴い、一部修正しました。

スポンサード リンク

この記事のカテゴリ

  • ⇒ ABから.NET Frameworkをかじる
  • ⇒ ABから.NET Frameworkをかじる
  • ⇒ ABから.NET Frameworkをかじる