お世話になっています。
現在VB6で制作してきたプログラムをVB.NET 2003に移行しているのですが。仕様変更によってAny型が無くなっています。
それによりDirectX7の一部関数の引数が任意の構造体からIntPtr構造体に変更されていました。
ネット調べてみると一度Allocでハンドルを取得してそのハンドルからIntPtrを取得すればよいと分かったのですがうまくいきませんでした。
それとDirectInputDeviceのSetProperty等のguid引数のStringのパラメータが防いだと言われてしまいます。
私が間違っているのかDirectX7+VB.NETの組み合わせに無理があるのか・・・。
ご教授お願いします。
私はDirectX使っていませんが・・・
VB.NETにネイティブ?に対応して動作可能なのは、DirectX9 からでは
無かったでしょうか。
マイクロソフトの検索エンジンでサーチしてみて下さい。
以上。
いえ、従来のDirectX7および8もVB.NET側が使用できるように変更をかけてCOM扱いで使用できるんですよ
実際ににDirectDraw7については動作してるので・・・。
ただそのVB.NETの中で変更をかけてる際にAny型がIntPtrになってしまっていて・・・。
# 回答ではありません。
> 仕様変更によってAny型が無くなっています。
VB.NETではオーバーロードが可能になったので、Anyを使う意味は無くなりましたね。
> DirectX7+VB.NETの組み合わせに無理があるのか
使えない事は無いと思いますが、.NETからのCOM Interopは実行コストが高いので、
素直に、.NET NativeなDirectX9を使った方が良いような気もします。
もし、タイプライブラリのインポート時に自動生成されたDLLに問題が
あるならば、生成されたDLLのIldasm.exeを実行して中間言語ファイルを生成し、
そのメソッドシグネチャを修正してマーシャリングを変更する必要が
あるかもしれません。
ではすこし的を変えて質問なのですが
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()
# 回答ではありません。DirectXには詳しく無いので…。
> 以下の処理を行っていたのですが間違っているでしょうか?
Normalハンドルではなく、Pinnedハンドルにして、
Handle = GCHandle.Alloc(d3vVertex, GCHandleType.Pinned)
iPtr = handle.AddrOfPinnedObject()
のようにしてみては如何でしょう。(未検証)
ありがとうございます
PinnedにするとVB6の時と同じ動作をしました。
この関数は構造体配列の最初の要素のアドレスを渡すのですがそれがうまくいっていなかったようです。
ツイート | ![]() |