Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 5. prosinec 2011, 00:11:39 Předmět: Exac - dll vs data |
|
|
Zdravim,
je mozne ve widlich nastavit zvlast pracovni adresar a zvlast adresar s dll?
Diky. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 5. prosinec 2011, 01:09:04 Předmět: |
|
|
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 |
|
 |
Lemik
Založen: 30. 07. 2007 Příspěvky: 138
|
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 5. prosinec 2011, 07:27:17 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 5. prosinec 2011, 09:58:49 Předmět: |
|
|
Len tak btw, kde je ta nekompatibilita u SetCurrentDirectory? Ja tam vidim XP/2003. To je snad malo stare?
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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 5. prosinec 2011, 10:59:29 Předmět: |
|
|
pcmaster napsal: |
Len tak btw, kde je ta nekompatibilita u SetCurrentDirectory? Ja tam vidim XP/2003. To je snad malo stare?
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...  _________________
 |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 5. prosinec 2011, 11:13:13 Předmět: |
|
|
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
Edit: Tak vidite... ja sa ani nemusim pokusat o flame a on aj tak zacne Toto je moj posledny post do tohto vlakna, uz som ticho  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 5. prosinec 2011, 19:29:17 Předmět: |
|
|
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 |
|
 |
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 5. prosinec 2011, 20:44:45 Předmět: |
|
|
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á.
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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 5. prosinec 2011, 23:09:27 Předmět: |
|
|
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.
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.  _________________
 |
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 6. prosinec 2011, 19:04:44 Předmět: |
|
|
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é  |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 7. prosinec 2011, 02:08:08 Předmět: |
|
|
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 |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 7. prosinec 2011, 07:31:17 Předmět: |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 7. prosinec 2011, 09:29:25 Předmět: |
|
|
Díky za vysvětlení. Jsem rád, že tahle možnost teda zůstane. _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 7. prosinec 2011, 21:05:22 Předmět: |
|
|
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  _________________ WWW | GitHub | TW |
|
Návrat nahoru |
|
 |
|