Beep ;)

Hi!
Sagt mal, hat irgendwer eine Ahnung, warum "Beep" (unter VB, aber ich denke das macht keinen Unterschied) auf manchen Computern funktioniert und auf manchen nicht. (Ein und das selbe Programm) Würde mich nur mal interessieren.
cu Gabriel
 
Also ich kenns jetz nur von Basic und da spricht man mit beep den speaker an. das problem dabei ist nur das das ganze nur bis (ich glaube) win 98 funtzt, bei NT und XP geht das nicht mehr.
 
Nur als Vermutung:
Ich habe auf die Schnelle nur eine Funktion für Beep unter VB (genauer: inder VB6.DLL ;) ) gefunden, und diese ruft die WinAPI "MessageBeep" auf. Ansonsten habe ich leider kein VB bzw entsprechendes Programm in VB, so dass ich mir nicht ansehen kann, wie Beep da realisiert ist.

Wenn Du aber damit meinst, einen Ton über den eingebauten Lautsprecher auszugeben: dafür gibt es von Windows eine API - ich denke nicht, dass VB es irgendwie "direkt" versuchen würde, so dass es auch unter 2k/XP laufen sollte - vorausgesetzt, es gibt auch wirklich einen internen Lautsprecher ;). Wenn dieser fehlt oder abgeklemmt ist, scheitert auch das Abspielen verständlicherweise.
 
@CDW:
Ich meinte mit "unter VB", dass ich unter VB die Win-Api Beep
Code:
Private Declare Function Beep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
deklariere und dann aufrufe (Und nicht MessageBeep, die kann man aber auch deklarieren).
Und das Programm "beept" dann seltsamerweise nur auf einem knappen Drittel aller Testcomputer (alle XP).
 
@ CDW:
hast du eine ahnung wie das rein hardware bezogen realisiert wird? der "beep" ist ja im DOS, ohne betriebssystem genauso abspielbar.
tia, lg
 
@Ar-ras:
Beep lässt bei nicht installierter Soundkarte ein beep über die PC-Speaker laufen...
Bei installierter Soundkarte kommt ein Beep über die Soundkarte....
Ich glaube nicht, dass das stimmt, da meine Soundkarte definitiv installiert ist, der Beep aber nicht über die Boxen kommt.
3. Sind die PC-Speaker angeschlossen am Mainboard angeschlossen?
Ich weiß nicht mit Sicherheit, ob das bei den anderen Test-PCs der Fall ist, weil ich das Prog den Besitzern nur geschickt habe und dann nachgefragt habe, ob Beep geht. Das wäre natürlich ein möglicher Grund, aber es kommt mir doch ein wenig seltsam vor, dass bei so vielen Computern kein Pc-Speaker vorhanden ist.
 
Bei Beep kommt der Ton definitiv nicht über die Soundkarte, egal ob installiert oder nicht. Wenn kein Ton kommt, liegt es wohl daran, dass kein interner Lautsprecher vorhanden ist, oder der Dienst nicht gestartet ist, den Windows dafür nutzt. Überprüfe am besten mal den Rückgabewert von Beep und rufe im Fehlerfall GetLastError() auf. Falls der Dienst nicht gestartet ist, falls der Dienst nicht läuft, wird z.B. ERROR_FILE_NOT_FOUND (2) geliefert. FILE_NOT_FOUND deshalb, weil die Gerätedatei, über die diese Funktion realisiert ist, ("\Device\Beep") fehlt.
Starten kann man den Dienst(NT-Systeme) mit: net start beep
 
Also, ich habe zwar noch nie etwas mit VB gemacht, aber Beep ist ja schließlich ein WinAPI-Funktion und nichts VB-spezifisches(außer Beep in der vb-dll, wie cdw erwähnte). Aber die normale kernel32.Beep-Funktion geht über den internen Lautsprecher(siehe msdn dazu). MessageBeep funktioniert über die Soundkarte und ist wohl unter VB mit Beep betitelt, wie es CDWs Post zu entnehmen ist.
 
@Ar-ras: Im Ernst, ich bin ein wenig perplex. Bei mir kommt der Beep eindeutig über den PC-Speaker. Das würde allerdings bedeuten, dass meine Soundkarte nicht installiert ist, was sie soweit ich weiß ist.
Die einzige Erklärung, die ich noch dafür sehe, ist, dass auf der geposteten Seite (http://www.vbarchiv.net/vbapi/Beep.php) Win XP nicht als kompatibel aufgeführt ist. Vielleicht gilt unter XP wieder etwas anderes?
Also ich habe allmählich echt keine Ahnung mehr, warum das bei mir überhaupt funktioniert. ;)

//EDIT:
Sagt mal kann das sein, dass wir aneinander vorbei reden? Nur um das klarzustellen: Ich verwende nicht den Standard-Beep von VB, sondern deklariere die Win-Api (siehe auch Post weiter oben).
Code:
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Aber das hat mich jetzt auf was gebracht. Es könnte sein, dass die Namenüberlagerung der beiden beeps(also VBs Beep und dem API-Beep) an dem Problem schuld ist, so dass die Deklaration so heißen muss:
Code:
Private Declare Function APIBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Das erklärt allerdings immer noch nicht, warum es bei mir dann funktioniert hat.
 
Auf die Gefahr hin, mich zu wiederholen: Was sagt denn GetLastError() im Fehlerfall(Beep-Rückgabewert == 0)? Läuft der auch der entsprechende Dienst, der für Beep verwendet wird auf den Rechnern, bei denen es nicht funktioniert?
 
> Also Beep von kernel32.dll kommt ein PC-Speaker Ton
> bei MessageBeep von user32.dll kommt ein Standardsound

Genau das versuche ich dir schon seit meinem zweiten Post zu erklären.

> Die Funktion liefert einen Wert ungleich ungleich 0, wenn Beep erfolgreich ausgeführt wurde. Tritt ein Fehler auf, so ist der Rückgabewert 0.

Darum steht "Rückgabewert == 0" ja auch in Klammern hinter Fehlerfall! Lies die Posts bitte mal genauer, es wurde auch schon im zweiten Post des Threadstarters gesagt, dass es um die WinAPI-Funktion geht und trotzdem postest du einen Link zu der VB-Api Beep.

>.... scheinbar wird dann nicht GetLastError Rauskommen?....

Was? Wo soll GetLastError "rauskommen"? Mit GetLastError lässt sich (hoffentlich) bei Fehlschlag die Ursache ermitteln. Zum Beispiel liefert GetLastError 2 (ERROR_FILE_NOT_FOUND), falls der erforderliche Dienst nicht läuft. Was bei fehlendem PC-Speaker zurückgegeben wird, weiß ich nicht.
 
Nochmal das ganze:
Außerdem ist es keine VB-API Beep sondern es ist die WINDOWS API Beep in der kernel32.dll, kannst es ja nachprüfen...:S

Das war mir von Beginn an klar, zu sehen an folgenden Posts:

Geschrieben von mir
es wurde auch schon im zweiten Post des Threadstarters gesagt, dass es um die WinAPI-Funktion geht
Geschrieben von mir
Also, ich habe zwar noch nie etwas mit VB gemacht, aber Beep ist ja schließlich eine WinAPI-Funktion und nichts VB-spezifisches(außer Beep in der vb-dll, wie cdw erwähnte). Aber die normale kernel32.Beep-Funktion geht über den internen Lautsprecher(siehe msdn dazu). MessageBeep funktioniert über die Soundkarte und ist wohl unter VB mit Beep betitelt, wie es CDWs Post zu entnehmen ist.

Soviel dazu.
Jedoch sprachst du selbst nach diesem Post des Erstellers:
Geschrieben von Gabriel3
Ich meinte mit "unter VB", dass ich unter VB die Win-Api Beep

noch teilweise von der Vb-Api:
Geschrieben von Ar-ras
jetzt muss ich doch mal vb installieren

EDIT:
Nö muss ich nicht...

http://www.vbarchiv.net/vbapi/Beep.php

war ironisch gemeint... Es kommt eine Fehlermeldung.... ist doch klar, aber dafür muss man nicht die Windows API GetLastError aufrufen.
Achja? Dann mache mal folgendes:
cmd.exe -> "net stop beep" und dann führe ein Programm aus, was nur kernel32.Beep aufruft(dein masm-Programm, schaue dir es ggf. mit einem Debugger an). Man sieht nirgends eine Fehlermeldung, jedoch gibt Beep 0 zurück und GetLastError() liefert 2, eine Fehlermeldung muss man selbst implementieren.
Es kommt nicht automatisch eine Fehlermeldung, nur weil ein Api-Call fehlschlägt.

Geschrieben von Ar-ras
Er hat am ANFANG von BEEP gesprochen... dieses Verhielt sich normalerweise so wie ich es auch erklärt hatte...
Ich kann ja nicht ahnen, das die Programmierer von Windows dass trennen (bezüglich beep aus kernel32.dll

Dein erster Post, der das Verhalten von VB6.Beep erklärt, kam erst nachdem der Ersteller gesagt hat, dass er kernel32.Beep meint, darauf bezog sich mein Hinweis "genauer lesen".
 
Mal hierzu:
Geschrieben von dieser vb-seite
ist keine Soundkarte installiert, so erklingt der Systemsound über den PC Speaker

Ja ok, hierbei habe ich nicht den Link angeschaut, sondern nur die Adresse, er beschreibt wirklich die Windows-API, jedoch ist das was dort steht afaik eine Falschinformation. In der MSDN steht schließlich auch nur, dass der Ton über den internen Lautsprecher abgespielt wird und nicht über die Soundkarte:
Geschrieben von msdn
The Beep function generates simple tones on the speaker. The function is synchronous; it performs an alertable wait and does not return control to its caller until the sound finishes.

Nachweis, dass auf der VB-Seite Müll steht: Disassembly von Kernel32.Beep
Code:
7C838AAB    68 AC8B837C                            PUSH kernel32.7C838BAC                                            ; UNICODE "\Device\Beep"
7C838AB0    8D45 DC                                LEA EAX, DWORD PTR SS:[EBP-24]
7C838AB3    50                                     PUSH EAX
7C838AB4    FF15 4010807C                          CALL DWORD PTR DS:[<&ntdll.RtlInitUnicodeString>]                 ; ntdll.RtlInitUnicodeString
7C838ABA    56                                     PUSH ESI
7C838ABB    56                                     PUSH ESI
7C838ABC    56                                     PUSH ESI
7C838ABD    6A 03                                  PUSH 3
7C838ABF    6A 03                                  PUSH 3
7C838AC1    56                                     PUSH ESI
7C838AC2    8D45 DC                                LEA EAX, DWORD PTR SS:[EBP-24]
7C838AC5    8945 CC                                MOV DWORD PTR SS:[EBP-34], EAX
7C838AC8    56                                     PUSH ESI
7C838AC9    8D45 E4                                LEA EAX, DWORD PTR SS:[EBP-1C]
7C838ACC    50                                     PUSH EAX
7C838ACD    8D45 C4                                LEA EAX, DWORD PTR SS:[EBP-3C]
7C838AD0    50                                     PUSH EAX
7C838AD1    6A 03                                  PUSH 3
7C838AD3    8D45 F8                                LEA EAX, DWORD PTR SS:[EBP-8]
7C838AD6    50                                     PUSH EAX
7C838AD7    C745 C4 18000000                       MOV DWORD PTR SS:[EBP-3C], 18
7C838ADE    8975 C8                                MOV DWORD PTR SS:[EBP-38], ESI
7C838AE1    8975 D0                                MOV DWORD PTR SS:[EBP-30], ESI
7C838AE4    8975 D4                                MOV DWORD PTR SS:[EBP-2C], ESI
7C838AE7    8975 D8                                MOV DWORD PTR SS:[EBP-28], ESI
7C838AEA    FF15 0810807C                          CALL DWORD PTR DS:[<&ntdll.NtCreateFile>]                         ; ntdll.ZwCreateFile
7C838AF0    8BF8                                   MOV EDI, EAX
7C838AF2    3BFE                                   CMP EDI, ESI
7C838AF4    0F8C 24220000                          JL kernel32.7C83AD1E
7C838AFA    8B45 08                                MOV EAX, DWORD PTR SS:[EBP+8]
7C838AFD    3BC6                                   CMP EAX, ESI
7C838AFF    8B3D 3810807C                          MOV EDI, DWORD PTR DS:[<&ntdll.NtDeviceIoControlFile>]            ; ntdll.ZwDeviceIoControlFile
7C838B05    53                                     PUSH EBX
7C838B06    BB 00000100                            MOV EBX, 10000                                                    ; UNICODE "=::=::\"
7C838B0B    0F84 3C030000                          JE kernel32.7C838E4D
7C838B11    83F8 25                                CMP EAX, 25
7C838B14    0F82 41030000                          JB kernel32.7C838E5B
7C838B1A    3D FF7F0000                            CMP EAX, 7FFF
7C838B1F    0F87 36030000                          JA kernel32.7C838E5B
7C838B25    56                                     PUSH ESI
7C838B26    56                                     PUSH ESI
7C838B27    8945 EC                                MOV DWORD PTR SS:[EBP-14], EAX
7C838B2A    8B45 0C                                MOV EAX, DWORD PTR SS:[EBP+C]
7C838B2D    6A 08                                  PUSH 8
7C838B2F    8945 F0                                MOV DWORD PTR SS:[EBP-10], EAX
7C838B32    8D45 EC                                LEA EAX, DWORD PTR SS:[EBP-14]
7C838B35    50                                     PUSH EAX
7C838B36    53                                     PUSH EBX
7C838B37    8D45 E4                                LEA EAX, DWORD PTR SS:[EBP-1C]
7C838B3A    50                                     PUSH EAX
7C838B3B    56                                     PUSH ESI
7C838B3C    56                                     PUSH ESI
7C838B3D    56                                     PUSH ESI
7C838B3E    FF75 F8                                PUSH DWORD PTR SS:[EBP-8]
7C838B41    FFD7                                   CALL EDI

Dieser Code öffnet die Gerätedatei \Device\Beep und spielt per ZwDeviceIoControlFile den Sound ab.
In der dafür zuständigen Datei Beep.sys findet sich dazu nur ein Call zu HAL.HalMakeBeep:
Code:
Hal.dll, Funktion: HalMakeBeep
//Lautsprecher einschalten(offset:80018B58):
in      al, 61h        
jmp     short $+2
and     al, 0FCh
out     61h, al
//Timer bereit machen+Sound abspielen(offset:80018B7D)+Lautsprecher abschalten
push    eax
mov     al, 0B6h
out     43h, al         ; Timer 8253-5 (AT: 8254.2).
jmp     short $+2
pop     eax
out     42h, al        
jmp     short $+2
mov     al, ah
out     42h, al        
jmp     short $+2
in      al, 61h        
jmp     short $+2
or      al, 3
out     61h, al
(Adressen können aufgrund von anderen Dateiversionen abweichen)

Wenn man genau hinschaut, sieht man, dass dies im Grunde der selbe Code ist, der oben in dem von mir geposteten Link zum Abspielen eines "Beeps" unter Dos steht. Nichts mit Soundkarte, lediglich der interne Lautsprecher wird verwendet.

Fazit: Auf der VB-Seite steht Mist. Die Soundkarte wird nicht verwendet.
Nochmal zusammengefasst:
Kernel32.Beep: Spielt einen Sound über den internen Lautsprecher ab, egal ob eine Soundkarte da ist oder nicht.
MSVBVM60.rtcBeep: Lediglich ein anderer Name für Kernel32.MessageBeep
Ich hatte übrigens nicht die Absicht zu provozieren.
 
Hi @all.
Es wäre nicht nötig gewesen, dass ihr euch wegen meines Posts gegenseitig zerfleischt. Nun wie auch immer.
Fazit: Auf der VB-Seite steht Mist. Die Soundkarte wird nicht verwendet.
Meine Rede:
Zitat von Ar-ras:

Beep lässt bei nicht installierter Soundkarte ein beep über die PC-Speaker laufen...
Bei installierter Soundkarte kommt ein Beep über die Soundkarte....

Ich:
Ich glaube nicht, dass das stimmt, da meine Soundkarte definitiv installiert ist, der Beep aber nicht über die Boxen kommt
Wie auch immer.
Um das jetzt zusammenzufassen: es kann also nur daran liegen, dass kein Pc-Speaker angeschlossen ist. Nun, da kann man nichts machen. Danke nochmal.
cu Gabriel3
 
Zurück
Oben