• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:win32api構造体引数の型指定について)

win32api構造体引数の型指定について

このQ&Aのポイント
  • 「win32api構造体引数の型指定について」というタイトルで、初めてwin32apiに挑戦し、構造体引数の渡し方が上手くいかない問題を質問しています。
  • 具体的には、利用したいAPIである「midiOutGetDevCaps」で発生するエラーについて説明しており、エラーの詳細な内容として「型 'UInt32' のフィールド '_vDriverVersion' を持つ構造体のファイル入出力 (I/O) は無効です。」というメッセージが表示されると述べています。
  • さらに、実際のAPI呼び出しのソースコードをVBで示し、エラーが発生する箇所を指定しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

VB.netは使ったことはありませんし、エラーの原因になる理由もわかりませんが… 気になったところを。 ><MarshalAs(UnmanagedType.LPTStr)> Dim szPname As String コレで、MAXPNAMELENバイトの領域になりますか? この場合、APIから値を返されるコトになりますので、 http://akademeia.info/index.php?VB.NET%2F%A5%C6%A5%AF%A5%CB%A5%C3%A5%AF%2FWin32API%A4%CE%CD%F8%CD%D1#d12bfd5e で説明されている「VB.NETがAPIから文字列を受け取る場合はString型でもうまくいかない。」に関わる様な気がします。 そして、構造体のサイズ(バイト数)をmidiOutGetDevCaps()の第3引数に渡すことになりますが… sizeof(MIDIOUTCAPSA)とLen(mc)は同じになるのでしょうか? # APIの説明的には想定している構造体よりサイズが小さい場合は後ろのメンバは触られないみたいですが。

selfesteem
質問者

お礼

Wr5様 ご回答ありがとうございます! UInt32 → Integer <MarshalAs(UnmanagedType.LPTStr)> → <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=32)> とすることで解決しました。大変助かりました。

関連するQ&A