webForumDet fria alternativet

Använda sej av en dll

.NET

30 svar · 750 visningar · startad av Gein

Medlem sedan sep. 20005 700 inlägg
Frågan#1

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.

Medlem sedan sep. 20005 700 inlägg
#2

ingen med någon idé. Om det går att använda sej av dll:en i mIRC borde det inte vara något problem att göra detsamma i vb?

Medlem sedan sep. 20005 700 inlägg
#3

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?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vblr7/html/vaerrbaddllcallingconvention.asp
Någon som förstår sej på det här bättre kanske?

Medlem sedan juni 20022 599 inlägg
#4

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?

Medlem sedan sep. 20005 700 inlägg
#5

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?

Medlem sedan juni 20022 599 inlägg
#6

ehm, du talar i gåtor

Jo, onekligen.

Jag laddade faktiskt ner swamp.dll och testade lite snabbt.
När jag skriver:

Private Declare Function WinAmpGet Lib "c:\swamp.dll" (ByVal strData As String) As Long

så får jag ingen "Bad DLL calling convention".

Däremot blir returvärdet alltid 3! Vilket känns lite konstigt.

Ska titta lite på det om jag får tid. Under tiden stiger jag gärna åt
sidan om det är nån annan som har bättre koll.

Medlem sedan sep. 20005 700 inlägg
#7

Hur ser det ut där du kallar på funktionen?

Medlem sedan juni 20022 599 inlägg
#8

Jag anropar den på samma sätt som du gör.

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?

Medlem sedan juni 20022 599 inlägg
#9

Hittade en tutorial om Mirc-dll:er här: http://www.team-clanx.net/articles/c mIRC dll tutor.html

Tydligen har funktioner i dessa dll:er ett givet format och ser egentligen ut så här:

int __stdcall WinAmpGet(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)

vilket i VB borde bli:

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.

Medlem sedan sep. 20005 700 inlägg
#10

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.

Medlem sedan juni 200032 967 inlägg
#11

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å.

Hur försöker du anropa funktionen?

Mvh,

Medlem sedan sep. 20005 700 inlägg
#12

ehm, nu ser det ut såhär:

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?

Medlem sedan juni 200032 967 inlägg
#13

Lägg till en MsgBox strData efter din andra msgbox i subben.

Även strParm kanske ska vara ByRef, förresten.

Mvh,

Medlem sedan sep. 20005 700 inlägg
#14

provade det, den är bara tom
vad är skillnaden på ByVal och ByRef?

Medlem sedan maj 20018 027 inlägg
#15

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:

WinAmpGet(hWnd, hWnd, strData, "TRACKFILENAME", True, False)
MsgBox strData
Medlem sedan juni 200032 967 inlägg
#16

Jag har inga fler idéer just nu, men jag kanske har tråkigt ikväll, och då kan jag kanske testa lite.

Mvh,

Medlem sedan sep. 20005 700 inlägg
#17

*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?

Medlem sedan juni 200032 967 inlägg
#18

ByRef skickar en pekare till variabeln, så ändringar i funktioner / subbar gör ändringar till den variabeln man skickar in.

ByVal skickar med en kopia av variabeln, så förändringar som görs till ByVal-parametrar är lokala.

Mvh,

Medlem sedan juni 20022 599 inlägg
#19

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.

Medlem sedan sep. 20005 700 inlägg
#20

Bifogar manual till swamp.dll: http://www.knivby.nu:81/manual.txt

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
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)