---
title: "Använda sej av en dll"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/51471-använda-sej-av-en-dll/page2"
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: 2
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 2 av 2._

## #21 — UlfT, 2002-08-28T09:09Z

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

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

## #22 — Gein, 2002-08-28T09:21Z

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

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

## #23 — niko, 2002-08-28T09:26Z

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.

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

## #24 — Gein, 2002-08-28T09:30Z

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

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

## #25 — niko, 2002-08-28T09:43Z

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

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

## #26 — Gein, 2002-08-28T09:46Z

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.

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

## #27 — @nders, 2002-08-28T09:50Z

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

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

## #28 — UlfT, 2002-08-28T10:00Z

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

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

## #29 — niko, 2002-08-28T10:02Z

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.

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

## #30 — Gein, 2002-08-28T16:43Z

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

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

## #31 — Gein, 2002-08-28T17:03Z

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.

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

---

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