---
title: "Använda sej av en dll"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/51471-använda-sej-av-en-dll"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Gein"
published: "2002-08-27T14:24:44.000Z"
updated: "2002-08-28T17:03:41.000Z"
replies: 30
views: 774
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/51471-använda-sej-av-en-dll"
---

# Använda sej av en dll

_Sida 1 av 2._

## #1 — Gein, 2002-08-27T14:24Z

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.

Permalänk: https://www.webforum.nu/p/51471

## #2 — Gein, 2002-08-27T15:50Z

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?

Permalänk: https://www.webforum.nu/p/763951

## #3 — Gein, 2002-08-27T17:42Z

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?

Permalänk: https://www.webforum.nu/p/764004

## #4 — niko, 2002-08-27T18:11Z

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?

Permalänk: https://www.webforum.nu/p/764022

## #5 — Gein, 2002-08-27T18:16Z

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?

Permalänk: https://www.webforum.nu/p/764025

## #6 — niko, 2002-08-27T18:29Z

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

Permalänk: https://www.webforum.nu/p/764038

## #7 — Gein, 2002-08-27T18:31Z

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

Permalänk: https://www.webforum.nu/p/764041

## #8 — niko, 2002-08-27T21:30Z

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?

Permalänk: https://www.webforum.nu/p/764167

## #9 — niko, 2002-08-27T22:20Z

Hittade en tutorial om Mirc-dll:er här: <http://www.team-clanx.net/articles/c%20mIRC%20dll%20tutor.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.

Permalänk: https://www.webforum.nu/p/764201

## #10 — Gein, 2002-08-28T08:34Z

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.

Permalänk: https://www.webforum.nu/p/764318

## #11 — @nders, 2002-08-28T08:37Z

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,

Permalänk: https://www.webforum.nu/p/764324

## #12 — Gein, 2002-08-28T08:41Z

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?

Permalänk: https://www.webforum.nu/p/764327

## #13 — @nders, 2002-08-28T08:43Z

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

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

Mvh,

Permalänk: https://www.webforum.nu/p/764329

## #14 — Gein, 2002-08-28T08:44Z

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

Permalänk: https://www.webforum.nu/p/764330

## #15 — UlfT, 2002-08-28T08:44Z

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
```

Permalänk: https://www.webforum.nu/p/764331

## #16 — @nders, 2002-08-28T08:46Z

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

Mvh,

Permalänk: https://www.webforum.nu/p/764335

## #17 — Gein, 2002-08-28T08:47Z

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

Permalänk: https://www.webforum.nu/p/764337

## #18 — @nders, 2002-08-28T08:50Z

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,

Permalänk: https://www.webforum.nu/p/764339

## #19 — niko, 2002-08-28T08:55Z

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.

Permalänk: https://www.webforum.nu/p/764344

## #20 — Gein, 2002-08-28T09:07Z

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

Permalänk: https://www.webforum.nu/p/764351

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/51471-använda-sej-av-en-dll  
Nästa sida: https://www.webforum.nu/amne/dotnet/51471-använda-sej-av-en-dll/page2.md
