VB6+DirectX7のPGをDirectX7+VB.NETに移行するには?(.NETの問題?)

解決


神流美咲  2003-09-12 21:53:16  No: 79403  IP: [192.*.*.*]

お世話になっています。
現在VB6で制作してきたプログラムをVB.NET 2003に移行しているのですが。仕様変更によってAny型が無くなっています。
それによりDirectX7の一部関数の引数が任意の構造体からIntPtr構造体に変更されていました。
ネット調べてみると一度Allocでハンドルを取得してそのハンドルからIntPtrを取得すればよいと分かったのですがうまくいきませんでした。
それとDirectInputDeviceのSetProperty等のguid引数のStringのパラメータが防いだと言われてしまいます。
私が間違っているのかDirectX7+VB.NETの組み合わせに無理があるのか・・・。
ご教授お願いします。

編集 削除
岡田 之仁  2003-09-13 22:56:50  No: 79404  IP: [192.*.*.*]

私はDirectX使っていませんが・・・
VB.NETにネイティブ?に対応して動作可能なのは、DirectX9 からでは
無かったでしょうか。
マイクロソフトの検索エンジンでサーチしてみて下さい。
以上。

編集 削除
神流美咲  2003-09-14 23:12:29  No: 79405  IP: [192.*.*.*]

いえ、従来のDirectX7および8もVB.NET側が使用できるように変更をかけてCOM扱いで使用できるんですよ
実際ににDirectDraw7については動作してるので・・・。
ただそのVB.NETの中で変更をかけてる際にAny型がIntPtrになってしまっていて・・・。

編集 削除
魔界の仮面弁士  2003-09-15 00:34:26  No: 79406  IP: [192.*.*.*]

# 回答ではありません。

> 仕様変更によってAny型が無くなっています。
VB.NETではオーバーロードが可能になったので、Anyを使う意味は無くなりましたね。

> DirectX7+VB.NETの組み合わせに無理があるのか
使えない事は無いと思いますが、.NETからのCOM Interopは実行コストが高いので、
素直に、.NET NativeなDirectX9を使った方が良いような気もします。

もし、タイプライブラリのインポート時に自動生成されたDLLに問題が
あるならば、生成されたDLLのIldasm.exeを実行して中間言語ファイルを生成し、
そのメソッドシグネチャを修正してマーシャリングを変更する必要が
あるかもしれません。

編集 削除
神流美咲  2003-09-15 18:05:09  No: 79407  IP: [192.*.*.*]

ではすこし的を変えて質問なのですが
AnyからIntPtrに変更されていた引数に構造体配列を渡すために以下の処理を行っていたのですが間違っているでしょうか?

' d3vVertex(4 - 1) を引数に渡したい場合

        Dim iPtr As IntPtr
        Dim Handle As GCHandle = GCHandle.Alloc(d3vVertex)
        iPtr = GCHandle.op_Explicit(Handle)
        D3dDevice.DrawPrimitive(DxVBLib.CONST_D3DPRIMITIVETYPE.D3DPT_TRIANGLESTRIP, DxVBLib.CONST_D3DFVFFLAGS.D3DFVF_VERTEX, iPtr, 4, DxVBLib.CONST_D3DDPFLAGS.D3DDP_DEFAULT)
        Handle.Free()

編集 削除
魔界の仮面弁士  2003-09-15 23:11:55  No: 79408  IP: [192.*.*.*]

# 回答ではありません。DirectXには詳しく無いので…。

> 以下の処理を行っていたのですが間違っているでしょうか?

Normalハンドルではなく、Pinnedハンドルにして、
  Handle = GCHandle.Alloc(d3vVertex, GCHandleType.Pinned)
  iPtr = handle.AddrOfPinnedObject()
のようにしてみては如何でしょう。(未検証)

編集 削除
神流美咲  2003-09-16 21:14:23  No: 79409  IP: [192.*.*.*]

ありがとうございます
PinnedにするとVB6の時と同じ動作をしました。
この関数は構造体配列の最初の要素のアドレスを渡すのですがそれがうまくいっていなかったようです。

編集 削除