■101698 / inTopicNo.1) |
Winmm.DLLでwaveOutSetVolumeを使用 |
□投稿者/ LINK (1回)-(2023/04/04(Tue) 13:16:01)
|
分類:[.NET 全般]
開発環境
Windows10
VB2022 + FW4.7.2
Formアプリ
お世話になります。 LINKと申します。
FW3.5で作成したアプリをFW4.7.2に変更しています。
アプリ自体はVB2022 + FW3.5の状態でコンパイルでき、起動までできました。
そこで、ターゲットフレームワークを4.7.2に変更したところ起動時にエラーが発生しました。
「マネージド デバッグ アシスタント 'PInvokeStackImbalance'
Message=マネージド デバッグ アシスタント 'PInvokeStackImbalance' : 'PInvoke 関数 '[アプリ名]::waveOutSetVolume' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。'」
Declare Function waveOutSetVolume Lib "Winmm.DLL" (ByVal wDeviceID As Integer, ByVal dwVolume As Long) As Integer
と宣言しており、上記の呼び出し時にエラーが発生します。
Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
CurrentVolLeft = CLng(Me.NumericUpDown1.Value)
' Increase the left sound channel setting:
Dim x As Integer
'CurrentVolLeft = CurrentVolLeft + &H1000&
'' Prevent the channel setting from exceeding the maximum limit:
'If CurrentVolLeft > &HFFFF& Then CurrentVolLeft = &HFFFF&
Dim r As String = Convert.ToString(CurrentVolRight, 16).PadLeft(4, "0"c)
Dim l As String = Convert.ToString(CurrentVolLeft, 16).PadLeft(4, "0"c)
Dim BothVolumes As Long = Convert.ToUInt32(r + l, 16)
' Enter the following two lines as one, single line:
x = waveOutSetVolume(0, BothVolumes) ←ここでエラー
End Sub
調べてみたところ、FW3.5時代はエラーのチェックの有無で問題が発生しないのではとありました。
参考URL「https://social.msdn.microsoft.com/Forums/security/ja-JP/df3b7e6d-1ae0-468a-ac87-dec9755e9434/c12398pinvoke1239112289pinvokestackimbalance12364303302998312377124271239?forum=netfxgeneralja」
ちなみに、宣言部分に「Alias」を追加してみましたが、回避できませんでした。
Declare Function waveOutSetVolume Lib "Winmm.DLL" (ByVal wDeviceID As Integer, ByVal dwVolume As Long) As Integer
↓
Declare Function waveoutSetVolume Lib "Winmm.DLL" Alias "waveOutSetVolume" (ByVal wDeviceID As Integer, ByVal dwVolume As Long) As Integer
回避方法をご教示いただければ幸いです。
|
|