PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Visual Basic Beep Funktion


Geldmann3
2011-10-30, 18:31:26
Hallo,
ich schreibe gerade ein Programm in Visual basic 2010 welches mir einen Ton mit einer von mir angegebenen Frequenz ausgeben soll, wenn ich einen Button drücke.

Mein Code:
Public Class Form1

' API-Deklaration
Private Declare Function Beep Lib "kernel32" ( _
ByVal dwFreq As Long, _
ByVal dwDuration As Long) As Long

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Beispiel
Beep(1000, 50)
End Sub
End Class
Quelle: http://www.vbarchiv.net/tipps/tipp_430-beep-nach-lust-und-laune.html

Der Code zeigt bis zum Ausführen keine Fehler an, doch dann kommt.
Ein Aufruf an die PInvoke-Funktion "SoundGenerator!SoundGenerator.Form1::Beep" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Was mache ich falsch?

Edit: Problem gelöst.
Habe es als Integer anstatt als Long definiert.

PatkIllA
2011-10-30, 21:16:43
Weil es zum Thema passt:
http://pinvoke.net
da gibt es für etliche API Calls die richtige Deklaration

Geldmann3
2011-10-30, 23:09:22
Danke

Gast
2011-11-02, 10:40:06
Ein Aufruf an die PInvoke-Funktion "SoundGenerator!SoundGenerator.Form1::Beep" hat das Gleichgewicht des Stapels gestört.WTF? Hat der Stack das Gleichgewicht verloren und ist umgefallen oder wie? Was genau soll das bedeuten?

Geldmann3
2011-11-04, 23:19:59
HAHAHA genau das dachte ich mir auch. Das Gleichgewicht des Stapels gestört? WTF?? Was ist das für eine Fehlermeldung. Hätte noch die option gefehlt, "Stapel wieder aufrichten?"

Hat vielleicht etwas hiermit zu tun. :wink:
http://de.wikipedia.org/wiki/Stapelspeicher

Gnafoo
2011-11-05, 00:10:38
Der Aufrufer packt die Argumente an die Funktion auf den Stack. Dann übergibt er die Kontrolle an die Funktion, welche diese wieder vom Stack holt und den Speicher freigibt.

Das Problem hier ist, dass du mehr oder weniger auf den Stack gepackt hast, als die aufgerufene Funktion wieder vom Stack entfernt hat. Damit ist das Gleichgewicht zwischen dem vom Aufrufer reservierten Speicher und dem danach freigeräumten Speicher zerstört. Der Stack kann dann nicht mehr sinnvoll weiterverwendet werden.

http://en.wikipedia.org/wiki/Stdcall#stdcall