2

VB6から使用することを目的としたサードパーティのCOM+DLLに問題があり、ハードウェアイベントのコールバックを設定する機能があります。ただし、私はVB.NETを使用しており、AddressOfは整数型ではなく参照型を返すようになりました。これは、COM+DLLのsetCallback関数を使用できないことを意味します。

この問題を回避する方法はありますか(ある種のラッパーを開発するために利用できるVB6がありません)、またはこれを機能させるために別のサードパーティのDLLを見つける必要がありますか?参考までに、Logitech G15(v2)キーボードのLCDにアクセスしようとしています。

参考までに、setCallback関数とコールバックのプロトタイプ自体を次に示します。

Public Sub setCallback(funcAddr As Integer)
Public Sub LCDbuttonPress(ByVal butStates As Integer)
4

1 に答える 1

3

setCallback関数を次のように宣言すると思います。

Public Sub setCallback([MarshalAs(UnmanagedType.FunctionPtr)]funcAddr as function)

私はVBの人ではないので、正確な構文はわかりません。ただし、ここでの基本的な考え方は、VB.Netでは、正しいタイプのデリゲートであっても、プロトタイプをデリゲートとして宣言することです。ただし、MarshalAs属性を使用して、マーシャリングコードに、反対側の関数ポインター(実際には整数)として扱うように指示します。これをC#で実行して、コールバックをC ++コードに渡しますが、問題なく機能します。

たとえば、これはC#で

public delegate int MyProgress(double dPercentComplete);
...
int WaitWithProgress([MarshalAs(UnmanagedType.FunctionPtr)]MyProgress pfn);

このように家のC++側に表示されます

HRESULT __stdcall WaitWithProgress (long pfn, int * pRetVal);

コメントに注意してください。この問題の実際の解決策は次のようになりMarshal.GetFunctionPointerForDelegate() ました。これに関するドキュメントを注意深く読んでください。この方法を使用する場合、代理人があなたの前にガベージコレクションされていないことを確認するのはあなたの責任になりますsetCallback(NULL)

于 2009-12-21T02:06:56.060 に答える