タイトル : Re^5: Declareステートメントで定義されたアンマネージdll関数呼出について 投稿日 : 2010/12/29(Wed) 19:37 投稿者 : YuO
> 今までで試した内容は、アンマネージdllをVBクラスライブラリに組み込んで(つまりはラッパーdllを組み立てようとしたワケですが)、 > アプリケーション側からSystem.Reflection.Assembly.LoadFrom(ラッパーdll名)でロードした後、.CreateInsance(クラス名)でインスタンスを生成してハンドルし、 > GetType.GetMeThod(クラスメンバ名)で関数を保持して、Invoke(インスタンスハンドラ,引数)メソッドで呼び出す方法をとっていました。 根本的に,そのアンマネージDLLは複数の状態を持てるのですか? 例えば, static int value = 0; __declspec(dllexport) int WINAPI GetValue () { return ++value; } というアンマネージCコードをDLLに仕立て上げて,ひとつのプロセスから複数回DllImport/Declare/LoadLibrary(Ex) APIによる呼び出しを行ったところで, 毎回アンロード (LoadLibrary(Ex)使った場合のみFreeLibraryで可能) しない限り,GetValueの戻り値は増え続けます。 DLL自体が, __declspec(dllexport) HANDLE WINAPI CreateValueHandle () { int * result = new int (); *result = 0; return (HANDLE)result; } __declspec(dllexport) int WINAPI GetValue (HANDLE handle) { int * pointer_to_value = (int *)handle; return ++*pointer_to_value; } __declspec(dllexport) void WINAPI CloseValueHandle (HANDLE handle) { int * pointer_to_value = (int *)handle; delete pointer_to_value; } のように複数の状態を持てる実装になっていない限り,いくらラッパー側で頑張っても単一状態しか持てないことにはかわりないですよ。 # アンマネージ側が状態をSave/Restoreできるなら,それをハンドルとして使えますが。 |