webForumDet fria alternativet

Använda sej av en dll

.NET

30 svar · 750 visningar · startad av Gein · sida 2 av 2

Frågan, av Gein

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 s

Läs frågan i sin helhet →
Medlem sedan maj 20018 027 inlägg
#21

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

Medlem sedan sep. 20005 700 inlägg
#22

ytterliggare 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

Medlem sedan juni 20022 599 inlägg
#23

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.

Medlem sedan sep. 20005 700 inlägg
#24

Jag provade det, det hjälpte tyvärr inte, strängen är fortfarande tom

Medlem sedan juni 20022 599 inlägg
#25

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. ;)

Medlem sedan sep. 20005 700 inlägg
#26

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

Medlem sedan juni 200032 967 inlägg
#27

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,

Medlem sedan maj 20018 027 inlägg
#28

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

Medlem sedan juni 20022 599 inlägg
#29

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.

Medlem sedan sep. 20005 700 inlägg
#30

Tack niko och alla andra för hjälpen!
Verkligen uppskattat!

Medlem sedan sep. 20005 700 inlägg
#31

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

265 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)