3

HWNDを受け入れるdllがあります(dllのコード)。

void VideoCapture::SetVideoWindow(HWND VidWind)
{
    VideoWindow = VidWind;
}

参照にdllを追加して、サンプルのc#.netアプリケーションで上記のdllを呼び出しています。c#.netにPanelのフォームがありますが、そのパネルをdllに渡すことはできますか?私はc#で以下のようなコードを与えました

VidCapWrapper.ManagedVideoCapture cc = new VidCapWrapper.ManagedVideoCapture();

cc.SetVideoWindow( panel1);

次のようなエラーが発生します:'エラー2'VidCapWrapper.ManagedVideoCapture.SetVideoWindow(HWND__ )'に最適なオーバーロードされたメソッドには、無効な引数がいくつかありますD:\ DirectShow_Capture_GUI \ DirectShow_Capture_GUI \ Form1.cs 44 13 DirectShow_Capture_GUIエラー3引数1:変換できません'System.Windows.Forms.Panel'から'HWND__ 'へD:\ DirectShow_Capture_GUI \ DirectShow_Capture_GUI \ Form1.cs 44 32 DirectShow_Capture_GUI`

パネルをdllに渡す方法を教えてもらえますか(どの例でもよいでしょう)。(申し訳ありませんが、私は.netを初めて使用しますが、統合されたWebカメラなどの利用可能なデバイスを表示するサンプルアプリを作成しようとしています...その後、c#.netフォームパネルにプレビューを表示します)

編集:@Blachshmaと@Hans Passantの両方に感謝します。これで、c#Windowsフォームのパネルをc++dllに渡すことができます。

dllの関数を次のように変更しました

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

そしてc#ではそれをcc.SetVideoWindow(panel1.Handle);と呼んでいます。

4

2 に答える 2

5

HWND のような基本的に管理されていない型を C# コードに公開しないように注意する必要があります。C# コンパイラでは、このような型の値を渡すことはできません。ここでの適切な相互運用型は IntPtr で、ハンドル値を格納できます。したがって、C++/CLI メソッドを次のようにします。

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

これで、同じく IntPtr 型の panel1.Handle をメソッドに渡すことができます。

于 2012-12-11T14:47:49.057 に答える
1

パネルには、Handle使用できるプロパティがあります。

Panel p = new Panel();
IntPtr handle = p.Handle;

SetVideoWindow署名を許可するようIntPtrに設定した場合、これで十分です。

void VideoCapture::SetVideoWindow(IntPtr VidWind)

HWND を使用する必要がある場合は、安全でないコンテキストを使用して、次のようにキャストする必要があります。

HWND hwnd=(HWND)this.Handle.ToPointer();

ここに詳細情報へのリンクがあります

于 2012-12-11T13:53:23.017 に答える