Jag har mitt mIRC-skript för att kunna läsa o styra winamp. det ser ut ungefär såhär:
admp3 {
if $dll(script\dlls\swamp.dll, WinAmpGet, RUNNING ) {
if $dll(script\dlls\swamp.dll, WinAmpGet, STATE) != Stopped {
var %mp3 $dll(script\dlls\swamp.dll, WinAmpGet, TRACKFILENAME)
say Mp3: $nopath($remove(%mp3,.mp3)) - '/ctcp $me !getmp3'
}
}
}
den använder sej alltså av swamp.dll för att göra diverse saker. Nu undrar jag om jag kan använda mej av denna dll för att läsa o styra winamp via ett VB-program istället, och hur man isåfall ska gå tillväga.
Har kommit en bit på vägen iaf... min kod ser ut såhär:
Private Declare Function WinAmpGet Lib "c:\swamp.dll" (ByVal strData As String) As String
Private Sub Form_Load()
MsgBox WinAmpGet("TRACKFILENAME")
End Sub
men jag får felmeddelande. "Bad DLL calling convention"
Den verkar iaf hitta funktionen WinAmpGet i dll:en, men det verkar bli fel när jag försöker skicka med "TRACKFILENAME"
ingen idé någon?
Ett uppenbart problem är ju att du säger till VB:s länkare att
returvärdet är en BSTR (pekare på pekare på en Unicode-sträng),
vilket det sannolikt inte är, utan kanske en char* ? Vem vet?
Kanske svamlar men, vad du kunde prova är att ange Long som
returvärde och sen flytta resultatet till en String med
API:et "CopyMemory".
En annan fråga: Jag kan inget om mIRC-skript men varför skulle
returvärdet vara en sträng? Är inte Stopped helt enkelt en
numerisk konstant, eller nåt?
ehm, du talar i gåtor ;)
jag provade ändra returvärdet till Long, ingen skillnad.
Returvärdet skulle ju, om jag skickar med TRACKFILENAME, bli namnet på låten som spelas, är inte det än sträng?
Jag har också provat att anropa den från C++ mha LoadLibrary o GetProcAddress
på olika sätt. Får då resultatet:
The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared with
one calling convention with a function pointer declared with
a different calling convention.
Så för att komma vidare så behövs nog header-filen till Dll:en
så man kan se exakt vad den använder för calling convention, vilken
typ det är på inparametrar och returvärde osv. Tyvärr ..
Annars finns det kanske nån annan här som vet något om den här dll:en?
Private Declare Function WinAmpGet Lib "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
"svaret" returneras i "strData" och TRACKFILENAME skickas in i strParm, skulle jag tro.
Vad de övriga parametrarna står för vet jag inte, men jag hoppas du kan komma vidare med detta.
okej, jag har testat lite, och med den nya koden får jag, precis som du, alltid returvärdet 3. Det jag inte förstår är hur jag ska få ut värdet ur strData, det är ju en inparameter?, om jag lämnar den tom så klagar VB.
Jag tolkar det som att det borde vara ByRef strData, och i så fall har du värdet tillgänglig i variabeln du skickade in i funktionen efter funktionskörningen.
Red: Så länge metoden i dll:en gör förändringar till den alltså.
Private Declare Function WinAmpGet Lib "c:\swamp.dll" (ByVal mWnd As Long, ByVal aWnd As Long, ByRef 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
MsgBox WinAmpGet(hWnd, hWnd, strData, "TRACKFILENAME", True, False)
End Sub
men jag anropar säkert inte på rätt sätt, hur får jag värdet ur strData?
Eftersom du har anropat funktionen med "strData" ByRef, bör du ha din sträng i "strData" efter anropet. Alltså skulle du kanske anropa på följande vis:
*hoppas anders får tråkigt ikväll* :p
har iaf provat detta nu:
Private Declare Function WinAmpGet Lib "c:\swamp.dll" (ByVal mWnd As Long, ByVal aWnd As Long, ByRef 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
WinAmpGet hWnd, hWnd, strData, "TRACKFILENAME", True, True
MsgBox strData
End Sub
Detta ger mej bara en tom dialogruta, dvs strData är tom.
Men gör jag rätt med ByRef? är det så att på ByRef placerar man en variabel som ska ta emot data?
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.)
Den stora frågan är dock vad de övriga parametrarna står för?
Vad står mWnd o aWnd för? Är de fönsterhandtag till VB-appen,
eller till WinAmp? Eller något annat? Har dessa en specialbetydelse
och funkar kanske bara i mIRC-miljön?
( I anropet från mIRC-script fylls dessa i automatiskt och vi vet inte med vad.)
Som sagt, det känns som om man behöver dokumentation för att komma vidare.
Att funktionen alltid returnerar 3 kan ju tex betyda att detta är en intern felkod.
Jag provade att köra funktionen WinampRun istället, och det funkade faktiskt!
"WinAmpRun - Used to run WinAmp with or without parameters."
Private Declare Function WinAmpRun 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 = ""
WinAmpRun hWnd, hWnd, strData, strData, True, True
End Sub
den startar winamp korrekt
r) det gör tilläggas att returvärdet blir nu istället 1
265 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2