前回のように、ホスト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の変更に伴い、一部修正しました。
スポンサード リンク |