Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Diskuze na Lopuchu,
pohlazení na duchu

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub Programování [ŽP: neomezená] (kategorie Programování) moderuje tvx.
Archiv
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: bboleuj
[ 857 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
gumysh 16.2.2008 22:16  882
BredyTo vis, ze nic extra noveho to byt nemuze - proste zase jde jen o fintu s mapovanim, kdy je nejaky fyzicky region odkazovan strankami vice procesu. Z toho take plynou omezeni, ale holt tak to je; treba __declspec(thread) promenne jsou podobnym pripadem.
Jinak rozhodne si nemyslim, ze by se to prepisovalo do DLL fyzicky, spis to zustane jen ve strance, ktera bude zalohovana systemovym strankovacim souborem stejne jako anonymni souborove mapovani. Ono totiz nemusi byt zapisove pravo k prislusne knihovne (resp. nevim, proc by melo byt).

S tou efektivitou sdilene pameti jsem to spatne napsal; myslel jsem to tak, pro jednoduche veci, kdy se pouzije, tak ma nejakou dalsi rezii navic na pootevirani/zavirani prislusnych handles (potencialne ve vsech procesech) a je potreba nejak v ni fungovat. Ten sdileny segment ale take urcite nebude zadarmo; treba hadam, ze zde bude potreba relokaci.
bredy 16.2.2008 12:49  881
GumyshPěkný, to jsem nevěděl. Ale v zásadě to je stále stejný princip. DLL jsou též načítány přes CreateFileMappings (přesnějí přes NtCreateSection). Tady jde snad jedině o to, že část sekce, kterou se sdílí image toho DLL se označí příznakem pro zápis a pak je opravdu sdílená. Ty podmínky, které tam ale jsou vyjmenované jsou někdy (zvlášť třeba v C++) dost omezující. Ale na drobnosti by to mělo stačit, to určitě. Jen by mě zajímalo, jestli data zapsaná do této sekce se přepisují i do toho DLL fyzicky, nebo jak to vlastně mají vyřešený.

O té efektivitě mapovaných souborů mi něco napiš. Nenapadlo by mě, že mohou být neefektivní. Vytvořit sdílenou paměť je v DLL primitivní, stačí v DLL_PROCESS_ATTACH zavolat CreateFileMapping a MapViewOfFile a dostanu se na stejnou situaci jako tady. A neřekl bych, že by to bylo nějak pomalější...
gumysh 16.2.2008 09:46  879
BredyJa bych dodal, ze sdileny obsah neni obcas nutne drzet ve sdilene pameti (mysleno ve sdilene pomoci CreateFileMapping()), aneb sdilena pamet muze byt kanon na vrabce pro jednoduche aplikace (a navic muze byt zbytecne neefektivni). I pro DLL lze nechat vytvorit sdileny segment, ktery pak je namapovan ve vsech instancich DLL na stejny (fyzicky) pametovy region. Tolik aspon MSDN a MS KB.
bredy 15.2.2008 20:11  878
machAno správně. DLL není nic jiného než knihovna (jako LIB), ale linkuje se dynamicky až za běhu. Jiný rozdíl v tom není. Takže DLL samo osobě má tolik instacní, kolik běží aplikací, které ho mají načtené v paměti. I když se dozvíš, že DLL se sdílí, tak to platí jen o kódu DLL (image), ale stav toho DLL má každý proces vlastní. Každý DLL má vlastní heapu, a vlastní sadu statických proměnných a samozřejmě nevidí proměnné v jiném procesu.

Sdílený obsah musíš držet ve sdílené paměti, kterou vytvoříš v DllMain PROCESS_ATTACH. Windowsy v tomhle směru mají docela pěknou podporu mapovaných souborů, kdy nemusíš řešit, kdo paměť vytvořil a kdo ji nakonec zničí, jako třeba v Linuxu (všechno vyřeší Windows za tebe).

Znova Tě mohu odkázat na můj článek o komunikaci mezi procesy :-D
operator304 15.2.2008 15:46  877
mam problem s jaxb

nevite nekdo, jestli se da jaxb predhodit libovolna NEANOTOVANA trida?

a dalsi, nevite nekdo, jakym zpusobem resi jaxb verzovani? Neco jako UUID u serializace.
mach 15.2.2008 14:28  876
promenne uvnitr DLL knihovnyZkousel jsem si hrat s temi hooky a programovanim DLL knihoven. Pro zacatek bych si chtel udelat program, co posloucha, jestli uzivatel kliknul a za kazdy klik udela v nejakem souboru tecku.

Udelal jsem tedy DLL knihovnu, ktera obsahuje funkci:

LRESULT __declspec(dllexport)__stdcall CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)

kterou system vola pri nejake dalosti mysi. Taky mam na zacatku souboru nadefinovanou globalni promennou:

char fn[260];

kde bych si chtel uchovavat jmeno souboru, do ktereho se zapis provadi. Jenze kdyz tuhle promennou uvnitr MouseProc zmenim, pri zpracovani nasledujici udalosti uz je semtam obsah promenny jiny (jako kdyby byla najednou neinicializovana). Konkretne se to stava, kdyz uzivatel prepne proces (okno). Vypada to, jako kdyby ta dll knihovna mela pro kazdy proces oddelenou sadu (kopii) svych promennych, ktere jsou navzajem nezavisle. Je to vubec mozny? Zkousel jsem tu promennou deklarovat jako statickou, hodit ji dovnitr #pragma data_seg(".SHARDAT") a tak dal, ale porad se to chova stejne. Pouzival VS C++ 2005.
mach 18.1.2008 10:28  875
Diky vsem, zejmena Bredymu, prozkoumam to :-)
bredy 17.1.2008 14:26  874
Hooky lze instalovat selektivně
Možná ještě efektivnější řešení je zjistit si, ve kterým vláknu to okno žije (GetWindowThreadProcessId) a pak zavolat funkci SetWindowHookEx s číslem toho vlákna. Hook se pak nainstaluje jen na to vlákno.
bredy 17.1.2008 14:20  873
machZcela určitě to jde zapomocí hooku.

Prostuduj SetWindowsHookEx.

Možná že poprvé se může zdát, že je to k něčemu jinému. Ale hooky krásně poslouží k dopravení svého kódu do cizí aplikace. Stačí napsat DLL, a zaregistrovat ho na hook. Je vcelku jedno na jaký - mě napadá WH_CBT jako efektivní řešení. Jenom je potřeba zajistit spuštění na nějakou událost, třeba na otevření příslušného okna. Tam už není problém zaháknout se na WinProc toho ovládacího prvku (seznamu) a víš vše.

Hooky lze instalovat selektivně, stačí, když v DLLMain zkontroluješ podle GetModuleFileName kde jsi. Pokud se nejedná o aplikaci, která tě zajímá, tak vrátíš FALSE, a systém zase DLL z té aplikace odloaduje.

Dál už je na tobě, jak si zajistíš komunikaci mezi tvým DLL a tvou aplikací. Můžeš použí správy, roury, sdílenou paměť. Pokud bys tápal, tak jeden skvělý článek najdeš na mých stránkách:

http://bredy.jinak.cz/?Zaklady_komunikace_mezi_procesy_ve_Windows_/75
norfin Norfin 17.1.2008 11:21  872
mach [870]: No problem je tam prave v tom ziskani handlu tech polozek, kterym chces poslat zpravu. Potom by to snad jit melo (aspon kdysi jsem neco takoveho psal a posilani zprav cizim programum rozhodne jde). Jak ale ziskat ty handly, neporadim.
tessien Tessien Of course slavery is the worst thing - that ever happened. But maybe... 17.1.2008 11:11  871
mach [870]: tak to bych si byl skoro jisty, ze nejde (pokud na to ta druha aplikace neni pripravena). Jedine nejak emulovat vylozene pohyb mysi/klikani na klavesnici.
mach 17.1.2008 11:03  870
Myslite, ze je mozny nejak ve Windows z programu vyslat zpravu (nejakou message) do jiny aplikace (kterou jsem nenapsal), aby se tak nasimulovalo kliknuti do seznamu? Jde mi o to, ze mam program, ve kterem je nejaky silene dlouhy seznam a uzivatelum se v tom spatne orientuje. Ja to potrebuju nejak vyresit, takze bych udelal malou aplikaci, ve ktere by ten seznam byl zorganizovany/vizualizovany nejakym lepsim zpusobem, a ta aplikace by prave mela simulovat to, ze se v te druhe klikne na odpovidajici polozku toho seznamu.

Cili bych se nejak potreboval dohrabat k nejakym handlum/idckum polozek toho seznamu a vyslat jim message.
hok 15.1.2008 17:43  869
King
dík moc
king King Born to be king - ... 15.1.2008 13:18  868
hoka pak si precti tohle:

http://toys.jacobian.org/presentations/2007/oscon/tutorial/
bredy 14.1.2008 21:36  867
Legendární hra Brány Skeldalu jako OpenSource. Zdrojáky k této hře jsou k dispozici pod licencí GPL na SourceForge. Je-li tu nadšenec, přidej se mezi developery. Hledáme zejmena nadšence linuxu, který by to přeportoval z Windows

[ 857 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt