tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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できるなら,それをハンドルとして使えますが。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。