UlfTMedlem sedan maj 20018 027 inlägg
Både strData o strParm ska vara ByVal eftersom dom är char*. Inget annat!!
(Har att göra med att VB:s BSTR är en pekare till en pekare.)
Ja, och dessutom bör man se till att strängarna rymmer det som kan trilla ner i dem. Fyll alltså strängarna så att de blir tillräckligt stora, tex:
strData = String(255, vbNullChar)
Då slipper man risken att data skrivs till utrymmen som används till något annat än strängen (förutsatt att strängen inte blir längre än 255 tecken i det här fallet).
GeinMedlem sedan sep. 20005 700 inläggytterliggare framsteg!
Jag provade nu funktionen WinAmpSet för att försöka ändra volymen. Denna kod funkar klockrent:
Private Declare Function WinAmpSet Lib "c:\swamp.dll" (ByVal mWnd As Long, ByVal aWnd As Long, ByVal strData As String, ByVal strParm As String, ByVal show As Boolean, ByVal nopause As Boolean) As Long
Private Sub Form_Load()
WinAmpSet hWnd, hWnd, "Volume 220", "", True, True
End Sub
Jag skickar alltså in "Volume 220" i strData och inte strParm, detta funkar alltså.. hmm, jag provar vidare
r) vidare funkar även WinAmpCmd för att ändra låt med t.ex NEXTTRACK. Det är alltså hos just WinAmpGet som det inte funkar något bra. Det som skiljer dessa från varandra, är att WinAmpGet ska ta emot data, så vitt jag förstår? (Namnet på låten som spelas t.ex) Det är nog här det blir fel någonstans
NnikoMedlem sedan juni 20022 599 inlägg Hittade lite källkod till en annan mIRC-WinAmp-Dll: http://www.bolt.cx/mircamp/src/mircamp.cpp
Om den följer nån standard så gäller följande:
1. Returvärde 3 betyder att allt är OK.
2. mWnd o aWnd används (eventuellt) inte.
3. Svaret skickas tillbaka i tredje parametern (strData).
4. strData omallokeras INTE i funktionen den måste alltså ha tillräcklig längd från början.
Slutsats:
Prova UlfTs förslag att "padda" strängen innan.
GeinMedlem sedan sep. 20005 700 inläggJag provade det, det hjälpte tyvärr inte, strängen är fortfarande tom
NnikoMedlem sedan juni 20022 599 inlägg OK. Skulle tro att det är nåt problem med Unicode-ANSIkonvertering.
Vad man kan göra (om man orkar) är att dimma en Bytearray(0 to 255) fylla
den med ASCI-värdena för "TRACKFILENAME" lägga på slutnolla
och sen skicka in första elementet i anropet.
Du måste alltså deklarera:
Private Declare Function WinAmpSet Lib "c:\swamp.dll" (ByVal mWnd As Long, ByVal aWnd As Long, ByRef strData As long, ByVal strParm As String, ByVal show As Boolean, ByVal nopause As Boolean) As Long
När anropet är klart så undersöker man på nytt innehållet i ByteArrayn och
ser om där står nåt vettigt.
Har dock lite körigt nu så jag stiger åt sidan i vanlig ordning. ;)
GeinMedlem sedan sep. 20005 700 inläggSka bara säga att jag nu lyckats få ut även trackfilename. Det märkliga är dock att jag inte använder mej av strParm...
Private Declare Function WinAmpGet Lib "c:\swamp.dll" (ByVal mWnd As Long, ByVal aWnd As Long, ByVal strData As String, ByVal strParm As String, ByVal show As Boolean, ByVal nopause As Boolean) As Long
Private Sub Form_Load()
Dim strData As String
strData = String(255, vbNullChar)
strData = "TRACKFILENAME" & String(249, vbNullChar)
MsgBox WinAmpGet(hWnd, hWnd, strData, "", True, False)
MsgBox strData
End
End Sub
så ser det ut, skickar med TRACKFILENAME i strData och får sedan tillbaka värdet i samma variabel. märkligt.
@ndersMedlem sedan juni 200032 967 inlägg
niko skrev:
Både strData o strParm ska vara ByVal eftersom dom är char*. Inget annat!!
(Har att göra med att VB:s BSTR är en pekare till en pekare.)
All right. Vad betyder *?
*märker att jag är ute på galen cykel i tunt vatten här*
Tack för alla upplysande inlägg! :D
Mvh,
UlfTMedlem sedan maj 20018 027 inlägg
@nders skrev:
niko skrev:
Både strData o strParm ska vara ByVal eftersom dom är char*. Inget annat!!
(Har att göra med att VB:s BSTR är en pekare till en pekare.)
All right. Vad betyder *?
Det betyder att vi har en pekare till en char. Så brukar strängar hanteras i C, dvs pekare till första tecknet i en nullterminerad sträng. När VB skickar över strängar till en C-funktion, brukar VB automatiskt konvertera sin sträng till en C-sträng.
Eftersom det är en pekare som man skickar över, behöver man inte använda ByRef för att ändra strängen. Pekaren adressering ändras ju inte. Bara innehållet i minnesutrymmet som finns vid den adressen. Därför ändras strängen trots att den skickas över med ByVal.
NnikoMedlem sedan juni 20022 599 inlägg Gein>>
Grattis!
Om man kollar på:
http://www.bolt.cx/mircamp/src/mircamp.cpp
så ser man att BÅDE dat och parms kan användas som inparametrar.
GeinMedlem sedan sep. 20005 700 inläggTack niko och alla andra för hjälpen!
Verkligen uppskattat!
GeinMedlem sedan sep. 20005 700 inläggEn följdfråga: När jag kör en Private Declare på detta vis så tycker den inte om att blanda in variabler. T.ex
Private Declare Function WinAmpGet Lib app.path & "\swamp.dll" ...
Detta tycker den inte om. Finns det något annat sätt att lösa det på, annars måste jag bestämma ett specifikt ställe där dll:en ska ligga för att det ska funka, och sen måste alla som använder sej av rätta sej efter det.
r) såg sedan att det funkade bra om jag bara skrev "swamp.dll" och sedan la dll:en i system32-katalogen. Detta borde funka bra.