IT NEWS PC REVUE PC FORUM FreeBSDInternet time: @263
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

Súťaž o viac prírody

Pomôžte s Orangeom vyhrať zeleň za 3 300 € pre vaše mesto či obec! www.orange.sk

OmegaMarine Forte

Eskimáci vedia, čo je zdravé Získajte balenie zadarmo www.naturamed.sk

Aktuálna novinka

Zisti pravdu o stravovaní! Vyšetrovanie odhalilo tajomstvo dokonalého tela. www.news2channel.net

Pre ľahší život

Pozrite sa, ako sa dostať do zdravšej a ľahšej telesnej hmotnosti. www.janinblog.com

Vyhraj s NIVEA

Nová online hra o luxusné hodinky, lístky a výrobky NIVEA Black&White. www.nivea.sk

Umiestnenie DLL

Zaslať odpoveď
AutorSpráva
jasug
Užívateľ
Užívateľ

Založený: 05.09.2008
Príspevky: 47

PríspevokZaslal: Pi 05.08.11 16:43Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: Pi 05.08.11 17:12Odpovedať s citátomNávrat hore

Samozrejme, ze sa to da - explicitnym linkovanim. Priklad:
http://www.scalabium.com/faq/dct0130.htm
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
jasug
Užívateľ
Užívateľ

Založený: 05.09.2008
Príspevky: 47

PríspevokZaslal: So 06.08.11 8:49Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: So 06.08.11 18:24Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
jasug
Užívateľ
Užívateľ

Založený: 05.09.2008
Príspevky: 47

PríspevokZaslal: Ne 07.08.11 14:34Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správu
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
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.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF

SEO - optimalizácia pre vyhľadávače

Freebsd