title image


Smiley Re: Au weia!
Ausgerechnet einen String als Beispiel zu verwenden, kann zu Konfusion führenEinen String übergibt man in der Regel ByRef an an eine C-Dll, indem man sie ByVal übergibt: also bei .....(char*z,......)Deklariert man: declare ..............(byval str as string,.......)Warum?Wei der Visual Basic Typ String vom C++ Typ BSTR(Unicode) ist. Er enthält - anders als bei C - Informationen über die String-Länge in einem separaten Datenbereich bereit.Wenn eine VB-Funktion an eine andere VB-Funktion einen String übergibt, klappt alles wie gewohnt.Wenn jedoch eine VB-Funktion einen String an eine C++ - Funktion ByVal übergibt, so wird aus der Sicht von C++ ein Zeiger übergeben, ist aus dortiger Sicht also eine Parameterübergabe ByRef.Würde eine VB-Funktion einen String ByRef an eine C++ Funktion übergeben, so entspräche das einem Zeiger auf einen Zeiger, was nicht beabsichtigt ist.Soviel zu Strings - jetzt zu Deinem Problem:Ich entnehme dem SDK folgenden Helptext:SND_MEMORY The parameter specified by lpszSoundName points to an image of a waveform sound in memory. Das heißt, wenn dieses Flag gesetzt ist, soll der erste Parameter lpszSound ein Zeiger auf eine WAV-Datei darstellen, die im Speicher liegt.Nun unterstelle ich, daß Du eine derartige WAV-Datei im Speicher hast, und zwar in einem Byte-Array, z.B.:Dim lpszSound() as ByteOpen "MeineSounddatei" For Binary as #1Redim lpszSound(LOF(1))Get #1, , lpszSoundClose #1Da Du nun die Sounddaten im Speicher hast und ein Byte-Array ByRef übergeben möchtest, mußt Dudie vorhandene Deklaration:Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As LongUmformen in:Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSound As Byte, ByVal uFlags As Long) As LongBeachte bitte, daß ich zwei Änderungen vorgenommen habe:1. String -> Byte2. ByVal -> ByRefDer Aufruf geschieht dann, indem man das erste Element unseres Arrays ByRef übergibt:ReturnValue = sndPlaySound(lpszSound(0),SND_MEMORY)Dadurch übergibt man einen Zeiger auf das erste Element des Arrays, und damit eben auch einen Zeiger auf das ganze Array.Viel Erfolg!Thomas Prötzschcu
Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: