|
 | | |
| Autor | Správa |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: Pi 05.08.11 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. |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Pi 05.08.11 17:12 |   |
|
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 |
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. |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 06.08.11 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 napísal: | | 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. |
| |
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: Ne 07.08.11 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. |
| |
  |
 |
|
Nemôžete pridávať nové témy do tohto fóra. 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. Nemôžete hlasovať v tomto fóre.
|
| |