win32api構造体引数の型指定について
selfesteemと申します。
midiを利用するアプリを作成するために
初めてwin32apiに挑戦しています。(WindowsVista,VB2008.net)
構造体引数の渡し方がまずいのかうまくいきません。
詳しい方教えていただけませんでしょうか?
よろしくお願いします。
・利用したいAPI
midiOutGetDevCaps
・発生するエラー
ArgumentException
型 'UInt32' のフィールド '_vDriverVersion' を持つ構造体のファイル入出力 (I/O) は無効です。
・MMSystem.hでの定義(抜粋)
WINMMAPI MMRESULT WINAPI midiOutGetDevCapsA( __in UINT_PTR uDeviceID, __out_bcount(cbmoc) LPMIDIOUTCAPSA pmoc, __in UINT cbmoc);
typedef UINT MMVERSION; /* major (high byte), minor (low byte) */
typedef struct tagMIDIOUTCAPSA {
WORD wMid; /* manufacturer ID */
WORD wPid; /* product ID */
MMVERSION vDriverVersion; /* version of the driver */
CHAR szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
WORD wTechnology; /* type of device */
WORD wVoices; /* # of voices (internal synth only) */
WORD wNotes; /* max # of notes (internal synth only) */
WORD wChannelMask; /* channels used (internal synth only) */
DWORD dwSupport; /* functionality supported by driver */
} MIDIOUTCAPSA, *PMIDIOUTCAPSA, *NPMIDIOUTCAPSA, *LPMIDIOUTCAPSA;
・実際のAPI呼び出しのソースコード(VB)
Imports System.Runtime.InteropServices
Private Declare Function midiOutGetDevCaps Lib "winmm.dll" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As UInt32, _
ByRef lpCaps As MIDIOUTCAPS, _
ByVal uSize As UInt32) As Long
<StructLayout(LayoutKind.Sequential)> _
Structure MIDIOUTCAPS
Public wMid As Short
Public wPid As Short
Public _vDriverVersion As UInt32
<MarshalAs(UnmanagedType.LPTStr)> Dim szPname As String
Public wTechnology As Short
Public wVoices As Short
Public wNotes As Short
Public wChannelMask As Short
Public dwSupport As Long
End Structure
Sub main()
Dim ret As Long
Dim mc As New MIDIOUTCAPS
ret = midiOutGetDevCaps(0, mc, Len(mc))←ここでエラー
End Sub
No.1ベストアンサー
- 回答日時:
VB.netは使ったことはありませんし、エラーの原因になる理由もわかりませんが…
気になったところを。
><MarshalAs(UnmanagedType.LPTStr)> Dim szPname As String
コレで、MAXPNAMELENバイトの領域になりますか?
この場合、APIから値を返されるコトになりますので、
http://akademeia.info/index.php?VB.NET%2F%A5%C6% …
で説明されている「VB.NETがAPIから文字列を受け取る場合はString型でもうまくいかない。」に関わる様な気がします。
そして、構造体のサイズ(バイト数)をmidiOutGetDevCaps()の第3引数に渡すことになりますが…
sizeof(MIDIOUTCAPSA)とLen(mc)は同じになるのでしょうか?
# APIの説明的には想定している構造体よりサイズが小さい場合は後ろのメンバは触られないみたいですが。
Wr5様
ご回答ありがとうございます!
UInt32 → Integer
<MarshalAs(UnmanagedType.LPTStr)>
→ <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=32)>
とすることで解決しました。大変助かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
デバッグ中のエラーのことで教...
-
Excelのエラーで困ってます。
-
Handlesについて
-
バッチからsqlplusの接続エラー...
-
VC++6.0 の/Zm オプションについて
-
sys/time.hのインクルードがで...
-
VBAでファイルを開くプログラム...
-
HANDLEの宣言でのエラー
-
BC30002: 型 'ListItem' が定義...
-
vbsで作ったプログラムを続けて...
-
「メモリが"read"...」アプリケ...
-
Sleepを使って処理を一時停止さ...
-
EXEで実行すると発生するORA:06...
-
VC2010のビルドエラーを全部出...
-
makedependのエラー
-
exception:java.lang.NumberFor...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
バッチからsqlplusの接続エラー...
-
Excelのエラーで困ってます。
-
sys/time.hのインクルードがで...
-
コンパイルできません。
-
HEWを使用しているのですが、こ...
-
RightとLeft関数のライブ...
-
ビルド失敗 指定されたファイ...
-
VB2008で定数に色の設定をした...
-
visual C++ でビルドの中止がで...
-
デバッグ中のエラーのことで教...
-
multiple definitionというエラー
-
ビルドが失敗してしまいます
-
LPCWSTRとchar
-
Handlesについて
-
BC30002: 型 'ListItem' が定義...
-
左側がクラス、構造体、共用体...
おすすめ情報