Avatar billede hclarsen Nybegynder
05. august 2008 - 13:01 Der er 17 kommentarer og
1 løsning

Læse dll fra en anden mappe

Hej alle

Jeg bruger et library (.dll), som naturligvis er placeret samme sted som min .exe-fil. Er der nogen måde, hvorpå min .dll-fil kan placeres i en mappe "settings", hvor mappen "settings" er i samme dir. som min .exe-fil?
Avatar billede hrc Mester
05. august 2008 - 13:10 #1
Intet problem. Hvis du loader dynamisk (LoadLibrary) angiver du bare stien. Ved statisk load angiver du dll-filen til sidst. Angiv den med en sti og du er kørende.
Avatar billede hclarsen Nybegynder
05. august 2008 - 13:42 #2
Hmm, jeg har bare angivet dem i min USES?
Avatar billede hclarsen Nybegynder
05. august 2008 - 13:56 #3
- jeg bruger bass.dll (www.un4seen.com), og der tilføjer jeg blot bass i uses. Det er nok - er det så stadig muligt at få .dll-filerne til at ligge i en anden mappe?
Avatar billede hrc Mester
05. august 2008 - 15:06 #4
Det bliver lidt sværere når nu det er en pakke med eget API. API'et pakker blot ovenstående ind i en Delphi-unit og så afhænger det af den enkelte udvikler hvor meget der kan konfigureres.

Hvorfor skal det ind i et andet katalog? Man plejer at placere DLL hos exe-filen eller i DLL-hell (windows\System32), evt. registreret med RegSvr32.

Er det en god komponent?
Avatar billede hclarsen Nybegynder
05. august 2008 - 16:22 #5
Ja, jeg synes det er et fedt komponent - det kan en masse, og der følger en masse gode eksempler med.

Ang. hvorfor, så er det mere for syns skyld - jeg kunne godt tænke mig at samle alle programmets "indstillings-filer" og lign. i en mappe.

Hvad kan jeg så gøre? Er der evt. noget litteratur på nettet, der beskriver hvorledes man gør? Og hvad hedder det helt præcist, det som jeg vil gøre (således det bliver nemmere at søge efter det på google)?
Avatar billede hrc Mester
05. august 2008 - 17:51 #6
Det afhænger om du har købt koden med til BASS eller bare de binære filer. Har du koden kan du let se (og evt. rette) hvor komponenten kigger efter DLL'et. Har du købt licensen uden VCL-kode er det sværere. Du kan evt. tilføje stieen til din PATH. Så vil programmet kigge der.
Avatar billede hclarsen Nybegynder
05. august 2008 - 18:32 #7
Jeg har ikke købt noget - jeg har hentet det ganske gratis (og lovligt!).

Jeg kan rette i bass.pas - her er et udsnit:

const
  bassdll = 'bass.dll';

function BASS_SetConfig(option, value: DWORD): DWORD; stdcall; external bassdll;

Jeg tænkte på at rette bassdll til:

bassdll = IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)))+'\settings\bass.dll'; - ville dette give mening?
Avatar billede hclarsen Nybegynder
05. august 2008 - 18:41 #8
- faktisk har jeg prøvet:

const
  bassdll = teststreng;

function BASS_SetConfig(option, value: DWORD): DWORD; stdcall; external bassdll;

initialization:
hej = IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)))+'\settings\bass.dll';

- men jeg får ikke lov til at erklære en streng ved navn teststreng noget sted i løbet af bass.pas.
Avatar billede hrc Mester
06. august 2008 - 07:38 #9
Nej. Det vil det nok ikke.

Der er i øvrigt fejl i ovenstående. Når du bruger IncludeTrailingBackslash skal du ikke sætte et yderligere. Grimt, men korrekt ser det sådan ud:

hej := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)))+'settings')+'bass.dll';

.. men kønt er det sgu ikke.

Hvis du skal rette en const kan det vistnok kregles sådan her: const bassdll: string[255] = ''.
Avatar billede borrisholt Novice
12. august 2008 - 09:00 #10
Hvis du stadik ikke kan få det til at virke kan du bare hooke Windows API kaldet LoadLibrary ,,,

Således at i koden til bas.dlll står der LoadLibrary(bassdll), som der hele tiden har gjort ...

Men i stedet for at kalde en funktion nede i windows.pas kalder den i stederfor din egen LoadLibrary ..

Så kan du jo bare sætte den ønskede path på ...

Skriv om du har fundet ud af noget.

Jens Borrisholt
Avatar billede borrisholt Novice
12. august 2008 - 09:19 #11
Hmmn ... Jeg poster lige løsningen alligevel ... Det kunne jo være der vaar nogen der ville vide hvordan man gjorde : http://borrisholt.dk/Eksperten/APIHOOK.zip

Jens Borrisholt
Avatar billede borrisholt Novice
13. august 2008 - 12:15 #12
hclarsen>> Fik du det til at virke
Avatar billede borrisholt Novice
16. august 2008 - 16:57 #13
hclarsen>> Fik du det til at virke
Avatar billede hclarsen Nybegynder
16. august 2008 - 18:11 #14
Jeg fik det til at virke :-)

Smid gerne et svar, begge to.
Avatar billede borrisholt Novice
18. august 2008 - 16:14 #15
Var det så API hooking løsningen du valgte ?

Jens B
Avatar billede hclarsen Nybegynder
18. august 2008 - 22:25 #16
Faktisk var det en løsning, der fulgte med som eksempel når man henter BASS-biblioteket.
Avatar billede borrisholt Novice
18. august 2008 - 22:47 #17
Måske du bare for nar- stregernes skyld gidder at prøve med API hooking ? Om ikke andet fordi så har du den løsning i din værktøjskasse til en anden god gang ..

Jens Borrisholt
Avatar billede hclarsen Nybegynder
19. august 2008 - 07:17 #18
Jeg kan ikke helt få det til at virke. Såvidt jeg kan se, er der to units, men jeg ved ikke, hvad jeg skal stille op med dem.

Dog tænkte jeg på: Er det ikke muligt blot at loade ens DLL's dynamisk? Efter at have søgt på nettet, virker det som en nem løsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester