| | |
| Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
Autor | Správa |
---|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal jasug: 05.08.2011 16:43 | |
|
Dobrý deň,
poprosil by som odpoveď na môj problém s DLL v D6. Vytvoril som si DLL s názvom strlib v adresári napr. E:\delphi\dll a podľa potreby ju aktualizujem novými funkciami. Po skompilovaní som ju prekopíroval k aplikácii.
Deklarácia funkcie v projekte
function SomeFunction(S: string): string; external 'strlib.dll';
Uvedenú DLL ale chcem používať aj v iných projektoch, a tak som v klauzule external zadal umiestnenie DLL
external 'E:\delphi\dll\strlib.dll';
Všetko je v poriadku, ale keď chcem dať aplikáciu na iný počítač, tak sa mi vyskytne problém s načítaním DLL, lebo adresár 'E:\delphi\dll' sa tam nenachádza. Zatiaľ som to vyriešil tak, že na užívateľskom počítači som vytvoril adresár 'C:\delphi\dll' , kde som nakopíroval DLL a pri tvorbe mojich aplikácií sa odvolávam na external 'C:\delphi\dll\strlib.dll'. Nedá sa umiestnenie DLL robiť elegantnejšie , tzn. možno zadať parameter external cez premennú ? Môj nápad s premennou
external varCesta_dll;
- hlási [Error] : Constant expression expected - ?
Ide to vôbec tak ako to ja myslím ?
Vďaka za Váš čas.
|
|
Registrovaný: 11.01.09 Prihlásený: 27.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | |
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 06.08.2011 8:49 | |
|
Vďaka za odpoveď, statické a dynamické pripájanie dll som už nejak vyhelpoval, ale ani tento link mi nepomohol, asi som to slabo vysvetlil. Teda, v hlavnom unite mám deklarovanú globálnu premennú
varCesta_dll : string[60];
ktorej mám priradený string
varCesta_dll := 'E:\delphi\dll\strlib.dll';
V určitom unite deklarujem funkciu z dll (podla linku už aj s stdcall aj far)
function SomeFunction(S: string): string; stdcall; far; external varCesta_dll;
a tam mi hlási chybu
[Error] Constant expression expected
Kardinálna otázka : môže byť v external premenná ? V každom helpe vidím priamu deklaráciu DLL, napr. v linku
procedure ExecScript(UserID: Integer; ScriptName: PChar); stdcall; far; external 'yourDLLName.DLL';
Vďaka za Váš čas.
|
|
Registrovaný: 11.01.09 Prihlásený: 27.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 06.08.2011 18:24 | |
|
No aj po tomto vysvetleni si myslim, ze riesenie je prave v tom linku
Skusim rozpisat to, co je v tom priklade, mozno to bude lepsie s okomentovnim. Najprv este odpoviem na otazku:
jasug píše: môže byť v external premenná ?
Nemoze byt. Pretoze uz v dobe prekladu musi byt znamy nazov kniznice, ktora sa ma prilinkovat k programu ( bavime sa o pouziti 'external' , teda statickeho linkovania ).
Priklad:
Kód: // tuna budu vsetky prototypy funkcii, ktore sa maju nacitat z DLL knicnice type TSomeFunction = procedure( s: string );
// a tuna sa vytovria smerniky na dane typy funkcii, cez ktore sa neskor bude pristupovat k funkciam z knicnice const SomeFunction: TSomeFunction = nil;
var hLib: THandle; varCesta_dll: string = 'E:\delphi\dll\strlib.dll';
// -- implementation --
hLib:= LoadLibrary( PChar( varCesta_dll ) ); if ( hLib < HINSTANCE_ERROR ) then begin ShowMessage( 'Kniznica nenajdena.' ); Application.Terminate; end;
try
// druhy parameter funkcie GetProcAddress je skutocny nazov funkcie @SomeFunction := GetProcAddress( hLib, 'SomeFunction' ); // ak sa funkcia v kniznici nasla, tak ju zavolaj - to uz staci upravit podla potreby if Assigned( SomeFunction ) then SomeFunction( 'nejaky retazec predany funkcii v DLL' ); finally FreeLibrary( hLib );
end;
Snad to uz je vystiznejsie.
|
|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 07.08.2011 14:34 | |
|
Vďaka za informáciu, akceptujem nemožnosť deklarácie cesty k DLL, zaradím ten postup do aplikácie, vďaka za Tvoj čas.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|