タイトル : Re^4: Declareステートメントで定義されたアンマネージdll関数呼出について 投稿日 : 2010/12/29(Wed) 02:13 投稿者 : テイラー
早速のアドバイスをありがとうございます。 > アンマネージDLLでCOMを使わずにクラスのようなことがやりたいなら,ハンドルという形にする必要があります。 > Create系の関数を用意して内部的には何らかのクラスなり構造体なりをnew等し,それを「ハンドル」という形で返すような実装にしておきます。 > 他のDLLの関数群は第一引数にハンドルを受け取って,それを元のクラスなり構造体なりにキャストして使う,という形になります。 > > Win32 APIのGDIなどのAPIを見て,複数のインスタンスを扱うにはどうすればよいのかの手本にすると良いでしょう。 今までで試した内容は、アンマネージdllをVBクラスライブラリに組み込んで(つまりはラッパーdllを組み立てようとしたワケですが)、 アプリケーション側からSystem.Reflection.Assembly.LoadFrom(ラッパーdll名)でロードした後、.CreateInsance(クラス名)でインスタンスを生成してハンドルし、 GetType.GetMeThod(クラスメンバ名)で関数を保持して、Invoke(インスタンスハンドラ,引数)メソッドで呼び出す方法をとっていました。 しかし、これは、ライブラリインスタンスは新しいものの、アンマネージdll関数をラップした肝心のメンバ関数は、 同じオブジェクトをハンドルしているようです。(オブジェクト比較関数から解った事ですが) つまりは、アンマネージdll関数は動的に呼び出しても静的にリンクされているらしい事が見えてきたワケです。 アンマネージdllをラップしているクラスライブラリのインスタンスを生成したら、 この中でDeclareステートメントで宣言したアンマネージdll関数も何らかの方法で、インスタンスを生成しなくてはならないかもしれない事がわかりました。 (この方向で合ってればという話ですが) 次はDeclareステートメントの問題かも知れませんが、この付近についてVBから解決する可能性について見当がつきましたら、アドバイス頂ければと思います。 一方では、アンマネージ関数の内部的な解決を模索して行きたいとも思います。 とてつもなく面倒な事をしているかも知れませんが、ここまでに試した事以外にも、良い方法がありましたらアドバイス頂ければと思います。 よろしくお願い申し上げます。 |