2011-11-12 8 views
2

イムは、Visual Studioで2010.NETおよびアンマネージドDLLは - >メモリの問題

をアンマネージドDLLを作成し、私のDLLをテストするために、私は、Visual Basicで別のプロジェクトを作成していると私は解決策にそれを添付しました。

VBでは、VBでInstallHook関数を呼び出し、VBでコールバック関数のデリゲートを渡します。次に、DLLがフックを作成し、キーが押されるたびにVBコールバックが呼び出され、キーと他のいくつかのパラメータが引数として受け取られます。

問題は、一部のキーを押してVBコールバックのバッファが特定のサイズに達した後にプログラムがクラッシュすることです。具体的には、コールバックが最後に呼び出され、VBでバッファに書き込まれるとき、次回コールバックがDLLで呼び出されるため、プログラムのクラッシュが到達せずにどこかで重複しているようですコールバック(DLL内のポインタは問題ありません)

.NETのアーキテクチャはよくわかりませんが、何が間違っているのか正確にはわかりませんが、私がやったコードには非常に自信があります。 .Netのメモリ管理技術。

編集:私は、VBコード内からコールバックを呼び出すと、それはうまく動作すると言って忘れてしまった。コールバックは通常、同じウィンドウにインストールされたWndProcから呼び出されます。

おかげで....

答えて

3

DLL内のポインタが、私はこれが問題である疑いがある

結構です。ネイティブルーチンにアドレスを渡して、単一のメソッド呼び出しの範囲を超えて使用すると、いくつかのリスクが発生します。

問題は、.NETが圧縮ガベージコレクタを使用していることです。これは、ランタイムがメソッド呼び出しの間に完全に異なる場所にバッファを「移動」させる可能性があることを意味します。したがって、ある時点で、あなたがそれに書き込むとき、それはまったく別の場所にある可能性があります。

Marshalクラスを使用して、自分でメモリを割り当てて管理することで対処できます。また、GCHandle class to pin the memory and prevent it from being movedを使用することもできます。

+0

問題が解決しました。これは、コールバックポインタを設定したDLLのInstallHookと同じサブディレクトリにデリゲートをローカルで宣言していたために発生しました。デリゲートのスコープとDLLのクラッシュが発生します。 デリゲートをVBコードのグローバルセクションに移動するだけで問題が解決しました... ありがとうReed Copsey :) – lqbweb

関連する問題