.[ ČeskéHry.cz ].
Exac - dll vs data

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 5. prosinec 2011, 00:11:39    Předmět: Exac - dll vs data Odpovědět s citátem

Zdravim,
je mozne ve widlich nastavit zvlast pracovni adresar a zvlast adresar s dll?
Diky.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 5. prosinec 2011, 01:09:04    Předmět: Odpovědět s citátem

Pracovní adresář je aktuální, když otevřeš aplikaci poklepáním v Průzkumníku, nebo cokoli chceš, pokud aplikaci spouštíš zástupcem, který jsis vytvořil instalátorem (do Nabídky Start, na Plochu). DLL knihovny se prohledávají podle určitého seznamu cest, který si vygooglíš - předpokládám aktuální složka (pracovní adresář), a pak seznam v PATH.

Takže možné je všechno. Otevři Příkazový řádek, do enviromentální proměnné PATH připiš adresář s tvými DLL (na začátek? na konec? zjisti si, odkud to prochází), vlez do pracovního adresáře a cestou odtud spusť svou aplikaci. Ten PATH zástupcem nepořešíš, takže to můžeš hodit do souboru .bat - nebo pokud nechceš zobrazení okna konzole, tak si to hoď do druhého .exe typu "launcher".
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Lemik



Založen: 30. 07. 2007
Příspěvky: 138

PříspěvekZaslal: 5. prosinec 2011, 06:59:35    Předmět: Odpovědět s citátem

Tady rozebírají, jaké možnosti jsou ve Win ohledně načítání dll.

http://stackoverflow.com/questions/3899945/how-can-i-automatically-load-dlls-from-a-subdirectory

Jak je to s pořadím vyhledávání je pak tady:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 5. prosinec 2011, 07:27:17    Předmět: Odpovědět s citátem

Myslel tím zřejmě jestli jdou data uložit mimo složku s PE souborem.

Např.
app/bin/app.exe
app/data/tex.dds a nebo C:/data/tex.dds

Zřejmě bez toho aniž by musel ty cesty v aplikaci nějak měnit, protože všude používá relativní cesty.

Pracovní složka se nastavuje přes SetCurrentDirectory, ale mnohem lepší bude když použiješ přímo funkci chdir (_chdir u VS, z hlavičky direct.h), protože ta je více kompatibilní se všemi verzemi Windows.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 5. prosinec 2011, 09:58:49    Předmět: Odpovědět s citátem

Len tak btw, kde je ta nekompatibilita u SetCurrentDirectory? Ja tam vidim XP/2003. To je snad malo stare? Laughing
C ani C++ v tomto nijako multiplatformne nie je, bavime sa o Windows, tak co?
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 5. prosinec 2011, 10:59:29    Předmět: Odpovědět s citátem

pcmaster napsal:
Len tak btw, kde je ta nekompatibilita u SetCurrentDirectory? Ja tam vidim XP/2003. To je snad malo stare? Laughing
C ani C++ v tomto nijako multiplatformne nie je, bavime sa o Windows, tak co?

Nevidím že by jsi do diskuze něčím přispěl. Další pokus o flame? Koukni do komentářů dole na té stránce, pak pochopíš. Potom trochu pogoogli a zjistíš více... Evil or Very Mad
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 5. prosinec 2011, 11:13:13    Předmět: Odpovědět s citátem

Otvorene priznavam, ze vacsinou sa pokusam o flame, ale tentokrat nie. Je mi uplne jedno, ci mi uveris, ale tie poznamky v http://msdn.microsoft.com/en-us/library/windows/desktop/aa365530%28v=vs.85%29.aspx som si hned letmo preletel a nepridu mi nijako relevantne. Reagoval som na tvoje tvrdenie o "mnohem lepší" a "kompatibilní se všemi verzemi", ktore tak, ako si ho napisal, je postavene na vode. Nemusis uznat, ale je to tak Razz
Edit: Tak vidite... ja sa ani nemusim pokusat o flame a on aj tak zacne Very Happy Toto je moj posledny post do tohto vlakna, uz som ticho Razz Twisted Evil
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 5. prosinec 2011, 19:29:17    Předmět: Odpovědět s citátem

Problém starších systémů není ani tak v tom, že by to nešlo nebo že by člověk nechtěl, ale prostě už nemá k dispozici tak starý počítač. Pro ty systémy už nejsou ovladače na dnešní hardware (pokud se na fóru herních vývojářu zaměřím na OpenGL/Direct3D, takže mi neakcelerovaná grafika ve virtuálním počítači nestačí - 3D akcelerace je dnes jen pro XP a vyšší).

EDIT: Osobně považuju "Nevidím že by jsi do diskuze něčím přispěl. Další pokus o flame?" za pokus o začátek flame, protože pcmaster něčím skutečně přispěl - upřesnil minimální verzi Windows, nemusíme to hledat (na každém pak je, jak se rozhodne).
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 5. prosinec 2011, 20:44:45    Předmět: Odpovědět s citátem

DLL soubory jsou obvykle staticky bindované, tzn. načítají se přímo při startu EXE souboru, takže nelze v kódu našeho programu nijak ovlivnit, odkud se načítají. Zdůrazňuji v kódu - DLL se načítají dřív, než se spustí samotný program, takže jejich načítání lze ovlivnit jen konfigurací, nebo je potřeba je nechat načítat až později po spuštění, což má ale jiné spíše neblahé důsledky (jeslti se nepletu, tak to hlavně zavleče do kódu nepřímost všech volání).

Já bych v praxi doporučil použít manifest, ten považuju za nejbezpečnější či nejmodernější způsob. Ale přiznávám se, že nedokážu takhle z hlavy říct, jak se ten manifest udělá. Embarassed

Jinak upozorňuji, že načítání z aktuálního adresáře normálně neprobíhá NIKDY. Je to obrovská bezpečnostní díra a tato věc byla z Windows naštěstí už odstraněna. Čili ačkoliv pcmaster psal pravdu o chdir a určitě je dobře, že to napsal, debata o chdir zde není na místě - aktuální adresář nemá na nic vliv! A nesmí mít, i když ve starých Windows to dle MSDN vliv mělo (bohužel!).

Zajímavé je, že ačkoliv dokumentace MSDN, kterou ukázal Lemik to explicitně neuvádí, mám z nějakých knih v paměti, že adresář, ze kterého se DLL načítají, může být i podadresářem EXE - buď s názvem DLL, nebo doplněný o kulturu (tj. různé verze DLL souborů pro češtinu, angličtinu atd.).

Jinak Crypton psal kromě nemsyslu, na který upozornil již pcmaster, ještě jednu podivnost - DLL soubory jsou totiž PE stejně jako EXE - tím chci říct, že jde de facto o soubory stejného typu a u všech z nich se stejným algoritmem vyhodnocují jejich závislosti. Za prvé jakmile je jednou DLL již v paměti procesu, znovu se nenačítá. Takže používáte-li třeba ZIPLIB.DLL, tak se vám načte stejná verze do všech DLL, které používáte. No ve finále z toho může být pěkný guláš, hlavně u větších knihověn plných chyb jako MFC. A omlouvám se za ten závěr, ale musím to napsat: Zlatej dotnet! Tam to jede podle komponent, ne podle souborů, a nevadí mu ani kolize verzí v jednom procesu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 5. prosinec 2011, 23:09:27    Předmět: Odpovědět s citátem

Ladis napsal:
Osobně považuju "Nevidím že by jsi do diskuze něčím přispěl. Další pokus o flame?" za pokus o začátek flame, protože pcmaster něčím skutečně přispěl - upřesnil minimální verzi Windows, nemusíme to hledat (na každém pak je, jak se rozhodne).

Právě že tu nepřispěl vůbec ničím, protože ta minimální nutná verze pro tu funkci je uvedená přímo v tom odkaze, který jsem tu zaslal. Záměrem jeho komentáře bylo tak akorát zpochybnění mojich znalostí a zkušeností s WinAPI, jako by byl nějaký WinAPI guru. A k tomu moje tvrzení nijak nevyvrátil...

A to s tím flamewarem jsem zmínil právě protože jsem si všimnul, že už několikrát takhle zruinoval celou diskuzi. Wink

Neuvědomuje si, že já nemusím nic dokazovat, a nejsem povinný předkládat ke každému tvrzení odkazy na zdroj, protože nejsme ve škole. A pokud je tak líný, zadat si to do google, a vyhledat si jaké všechny problémy s touto funkcí můžou nastat, tak je to jen a jeho problém.

K tomu, autor článku uvedl v nadpisu příspěvku "Exac - dll vs data" a příspěvku se ptá "je mozne ve widlich nastavit zvlast pracovni adresar a zvlast adresar s dll", takže se ptá jestli je možné, aby dl knihovny byly v jiném adresáři, než v tom pracovním (s daty). Pracovní adresář je defautné nastavený na cestu k PE souboru, takže pokud používá relativní cesty, tak musí změnit i cestu k pracovní složce (pokud chce ty data přesunout, třeba na jiný oddíl), a to přes funkci chdir/SetCurrentDirectory.

Autor se neptá na funkci linkeru, a ani jiný nízkoúrovňový sajrajt, vyhrabaný někde z učebnice (viz AI), takže nevím proč ho s tím tady někdo zatěžuje, když se na to neptal.

Nicméně, otázka je víceméně špatně položená, takže se už k tomuto tématu nebudu vyjadřovat. Exclamation
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 6. prosinec 2011, 19:04:44    Předmět: Odpovědět s citátem

Ladis napsal:
EDIT: Osobně považuju "Nevidím že by jsi do diskuze něčím přispěl. Další pokus o flame?" za pokus o začátek flame

Přesně tak. A navíc je tam zjevná nahrávka pro grammar nazi (by jsi místo bys), je to očividné Razz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 7. prosinec 2011, 02:08:08    Předmět: Odpovědět s citátem

Al napsal:
Jinak upozorňuji, že načítání z aktuálního adresáře normálně neprobíhá NIKDY. Je to obrovská bezpečnostní díra a tato věc byla z Windows naštěstí už odstraněna.

Kdy byla odstraněna? Ve Windows 7 mi to funguje, Windows 8 jsem už bohužel smazal. Načítání z aktuální složky je podle mě nutnost, pokud chceme dát možnost distribuovat aplikaci jen rozbalením, nikoli instalátorem (podobně na Macu jen přetáhnu kamkoli ikonu z archivu .dmg, v Linuxu si zas ten archiv .tar.gz/.tar.bz2 kamkoli rozbalím). Ono vůbec se mi nelíbí představa, že mi instalátor takové třeba wxWidgets nebo Objective-C aplikace nebo hry postavené na Unreal3 enginu musí do System32 nainstalovat desítky DLL o velikosti desítek MB, které pak neodinstaluje (takové to "DLL může být používána jinými aplikacemi").
_________________
Award-winning game developer


Naposledy upravil Ladis dne 7. prosinec 2011, 09:42:32, celkově upraveno 2 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 7. prosinec 2011, 07:31:17    Předmět: Odpovědět s citátem

Ladis> v tomhle případě se načítají z adresáře s binárkou (nezávisle na tom, jaký adresář je aktuální).
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 7. prosinec 2011, 09:29:25    Předmět: Odpovědět s citátem

Díky za vysvětlení. Jsem rád, že tahle možnost teda zůstane.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 7. prosinec 2011, 21:05:22    Předmět: Odpovědět s citátem

Odpověď frcovi: Windows API funkce SetDllDirectory
Ale! Máš-li stejně nazvanou .dll v adresáři s programem a v tom, který nastavíš, Windows budou vždy preferovat tu z adresáře s programem.

Pořadí prohledávání adresářů může být na různých verzích Windows trochu jiné, je ale dostatečně stejné na to aby programátor nemusel (v převážné většině případů) dělat žádné ptákoviny a nechal to tak. Přesný popis je tady: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx (poznámky k Metru lze bezpečně ignorovat).

Ladis: Pleteš si aktuální adresář a adresář z něhož je EXE spuštěn. Od Windows XP SP2 na to je v registru příznak, defaultně zapnutý, který způsobuje, že se aktuální adresář v běžném prohledávání nechává až téměř jako poslední (pak už se hledá jen v %PATH%), viz odkaz výše.

OT:
A teď bych se chtěl zeptat Ala, co ho vede k tomu, na triviální otázku odpovědět kantorským způsobem, tedy překomplikovaným nekonkrétním neúplným a ještě v mnohým bodech nepřesným vysvětlením, které tazatele akorát zmate ale vůbec mu nepomůže, a pak si dál povídá o něčem úplně mimo? Celá problematika je navíc ještě komplikovanější, počínaje KnownDLLs a x86-64 FS redirectorem, přes závislosti napříč knihovnami a zmíněné obludné manifesty (mimochodem, hodně štěstí s podporou w2k, a verze 3, kterou když loader WinXP uvidí, umí umřít a/nebo zhodit i celý systém), až po úchylnosti jako on-demand loading stuby visual studia.

EDIT:
jsem slepý, sry, odkaz i vysvětlení pro Ladise už tu je Cool
_________________
WWW | GitHub | TW
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna