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

Něco navíc v zeleném?
A proč ne...

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Archiv klubu C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
   
[ 280 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
bredy 12.6.2006 00:00  469
Čus.
Začal jsem psát seriál o OOP http://bredy.jinak.cz/?g=main&kat=21

Zatím je první díl v syrové formě, (ve které doufám postupně vychytám všechny pravopisné chyby :-)
bredy 1.6.2006 18:40  468
Rozhodl jsem se uvolnit něco ze svých knihoven. Nejedná se o žádný zázrak, ale začátečníkům to může pomoci.

Multithreading v C++ (ve Win32)

Obsahuje i API na fibery.
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 4.5.2006 11:59  467
Ono totiz kdybych si mel rypnout, tak je to tim, ze Windows nemaji poradnou spravu softwarovych balicku. Na Linuxu si sice clovek muze stezovat na dependency hell, ale zase kdyz pak dam pacman -S balicek, tak by mi to zahlasilo, ze jeste taky potrebuju balicek libmfc, a stahlo a nainstalovalo oba. Pak takovyhle problemy odpadaj.
Takze myslenka je to veskrze spravna, jenom je na Windows ponekud nedotazena.
johny_g Johny_G - Relaxační terapie pro lopušáky ZDARMA! 4.5.2006 10:31  466
No vidíte - když už jsme u toho. Píšu něco pod C# a při kompilaci se mi vždycky do zařízení deploynou jen knihovny wrapperu, a ty normální ne. Můžu je tam nějak přidat? Je to v prostředí Visual Studia .NET 2003.
mpts mpts Je to jinak, ba přesně naopak! 4.5.2006 10:28  465
Bredy: No jasně, princip je zřejmý, ale imho by buď takové nastavení nemělo být default, nebo by to mělo být pro méně zkušené nějak výrazně zdůrazněno. Ačkoliv, on to pak může kopírovat někdo z jednoho stroje, kde to bylo řádně instalováno i s knihovnami, na jiný, a když o tom houby ví, vezme stejně jen .exe. :-)
bredy 4.5.2006 09:32  464
mptsTo se dělá i dneska. Ono to není nic špatného. Třeba já mám hromadu věcí pod MFC a místo toho, abych s každým programem distribuoval MFC zabalené v tom EXE, tak na net dám jen ty samostatné exe s odkazem na to, kde stáhnout příslušné DLL (MFC71.DLL atd). Ta DLL si uživatel stáhne jen jednou. Vlastní aplikace jsou pak v porovnání mnohem menší (řádově i dva)
bredy 3.5.2006 18:10  463
kdokolivIconv nepotrebujes.Windows znají funkci MultiByteToWideChar a WideCharToMultiByte.Ta zvladne převést UTF-8 na UNICODE. (obecně je tahle funkce dost silná).A jak tu někdo říkal stačí za každou win funkci dat W a máš její unicodovanou verzi.Ani nepotřebuješ speciální knihovny protože pod Win2000 a výše jsou standardní. (Samozřejmě musíš mít nějaké liby v překladači)
mpts mpts Je to jinak, ba přesně naopak! 3.5.2006 16:07  462
Nemusí jít jen o dotnet, některé překladače měly (s C++ pod woknous jsem naposledy pracoval koncem devadesátých let a netuším, jak moc se situace popř. změnila) zlozvyk defaultně překládat tak, že spolu s programem bylo třeba -- kruci, jak se to řekne česky? -- aha, distribuovat i řadu knihoven, které se normálně instalovaly jen s tím překladačem.
johny_g Johny_G - Relaxační terapie pro lopušáky ZDARMA! 3.5.2006 14:19  461
anonym [459]: Pokud není psán pod .NETem, tak musí jít spustit normálně. V opačném případě nainstaluj .NET Framework.
anonym 3.5.2006 14:15  459
helpjak spustit exe soubor programu vytvoreneho v c++ na pocitaci kde c++ neni?
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 3.5.2006 11:40  458
Notorius [457]: No, do toho se budu kdyztak poustet, az bude-li to zase nutne. Ted to nejak funguje, tak dokud to nebude potreba rozsirovat, radsi to rozvrtavat nebudu.
notorius Notorius 3.5.2006 10:44  457
KdokolivTeď doufám že nebudu moc kecat, ale spousta API funkcí má variantu s W na konci (např. GetWindowTextW), která vrací Unicode řetězec. Musíš ale aplikaci zkompilovat s knihovnou Microsoft Layer for Unicode.
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 3.5.2006 10:25  456
Bredy [455]: Diky moc za podnety, zamyslim se nad tim vsim. Ono nastesti to reseni nemusi byt nejak extremne bullet-proof, takze proste muzu vychazet z dodatecnych predpokladu, ze to proste bude fungovat treba jenom na aplikace, ktere maji jedine okno, a tak podobne. Jinak u tech konzoli to vypada (podle toho, co jsem vyzkousel) tak, ze zvetsovat lze az do rozmeru tech, ktere jsou nastaveny jako "vyrovnavaci pamet zobrazeni" (a zmensovat pak libovolne s tim, ze se objevi scrollbary).
S tou cestinou a Unicodem jsi me trochu prekvapil. Abych totiz zasel do jeste vetsich podrobnosti, cele to ma byt funkce v nejakem dllku, ktera pak bude volana z Javy pres java native interface. Z toho, co jsem vcera vyzkoumal, tak Java ty funkci posila retezce zakodovane v utf-8 a kdyz jsem je predaval te API funkci takhle, tak to pochopitelne nefungovalo, co jsem musel udelat, abych to rozbeh, bylo to, ze jsem jeste doinstaloval iconv a nejdriv prevedl ten retezec do cp1250 a pak ho predal te API funkci, coz uz zabralo. Tudiz jsem usoudil, ze ty API funkce ocekavaji cestinu kodovanou (jedna-li se samozrejme o nase narodni prostredi) v cp1250.
bredy 2.5.2006 21:33  455
KdokolivTo ti rád pomůžu. Ve windows je okno a aplikace dvě věci. Pokud bys chtěl postupovat od oken, pak možná je lepší hledat podle class než podle titulku (GetClassName).
Můžeš získat daného okna číslo procesu (GetWindowThreadProcessId) a z ID processu můžeš získat pomocí GetProcessPathName (což je ten kus kódu na ruských stránkách), získat jméno aplikace

Druhá varianta je postupovat od procesů, nalézt si svou hledanou aplikaci a k ní najít její okno. Dělá se to takto:

Nejprve si necháš sestavit list aktivních procesů: CreateToolhelp32Snapshot
Pomocí (Process32First) a (Process32Next) najdeš svůj process. Pak ale musíš enumerovat všechny thready procesu (ono možná to jde rovnou, já teď nevím, otázkou je, zda jsi pomocí toolhelpu získat z threadu jméno procesu, ale asi ne). Dělá se to tak, že si zase necháš sestavit list threadů a procházíš je tak dlouho, dokud nenarazíš na thready vyvoleného procesu. No a poté pro každý thread zadaného procesu necháš enumerovat všechny jeho okna (EnumThreadWindows). Pomocí funkce GetWindow(hWnd,GW_OWNER)==NULL najdeš jen ty, co jsou top-level. Jak vidíš, může to být víc oken, takže další identifikaci stejně budeš muset udělat přes titulek nebo class.

Má to pár zádrhelů. Ve Window2000 z nějakých důvodů je jméno procesu useknuto na 12 znaků. Lze to obejit, stačí si od procesu nechat vypsat všechny moduly, a první modul je většinou jméno EXE i s jeho cestou (takhle já hledám okno aplikace, kterou jsem spustil a potřebuji s ní komunikovat).

Co se češtiny týče, tak od Win2000 a výš jsou všechny titulky okna UNICODE. Pokud aplikace není UNICODE, pak používá kódovou stránku CP_THREAD, což je aktuální kódová stránka threadu. Všechny ne-UNICODE příkazy pak text převádí podle CP_THREAD do UNICODE. Tady bych doporučil překládat v UNICODE, vyhneš se problémům. Pokud nic neřekneš, platí, že aplikace má CP nastavenou podle nastavení národního prostředí ve Windows.

A ještě ke konzolím. Konzole má na starost vláštní modul v jádře. Aplikace běžící v konzoli nemá žádná okna, takže ji nemůžeš najít na desktopu. Co najdeš je její konzoli, ale velice záhy zjistíš, že vlastní okno patří jiné aplikaci (jestli to vůbec najdeš). Konzolové okno samozřejmě kontroluje, zda velikost písma a počet znaků konzole odpovídá zadané velikosti a případně upraví velikost tak, aby se dodržel počet řádků a sloupců. Když konzolové okno zavřeš, zavolá funkci definovanou v SetConsoleCtrlHandler. Aplikace na to může reagovat a když neudělá nic, tak to aplikaci ukončí přes ExitProcess.

Muzes zkusit konzolové okno Maximalizovat (ShowWindow). Aby šlo okno libovolně zvětšovat můsí to mít povolené, třeba automatickou volbu velikosti písma. Ale jinak to dělá to co popisuješ. Lze jej zmenšit (objeví se scrollbary), ale přes 80x25 se nedostaneš. O konzolích se dozvíš něco tady, třeba budeš chytřejší
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 2.5.2006 11:25  454
Dosla bida na kozaky a potrebuju ted udelat neco v C, co hur, na Windows za pouziti WinAPI, ktere jsem dosud nikdy nepotkal. Uloha je zhruba nasledujici - nalezt mezi bezicimi aplikacemi tu, ktera me zajima, jeji okno prenest do popredi a jeste mu vhodne nastavit velikost. Dosavadni reseni je nasledujici: funkci EnumWindows si nechat projit vsechna okna, to spravne rozpoznat podle titulku okna (GetWindowText) a kdyz je to to ono, tak zavolat SetForegroundWindow a SetWindowPos. Cely to pak v dusledku ma byt nejaky dllko, ale to uz asi neni tak podstatny.
Muj dotaz zni - da se to delat nejak inteligentneji, napriklad zda je nejaky lepsi napad, jak rozpoznat spravne okno, nez podle titulku? Druha vec - co kdyz je v titulku cestina, mam cekat nejake potize s kodovanim (konkretni vyvojove prostredi je Dev-C++, coz je postaveno na gcc/mingw, kdyby to s tim nejak souviselo)? A posledni vec - da se nejak rozumne SetWindowPos volat i na DOSovske aplikace bezici v okne? Totiz zkousel jsem to na Volkov Commander a tomu to okno tak slo jenom zmensovat (s tim, ze se objevily scrollbary), zvetsovat uz ne. Ale mozna je ten Volkov extrem, kterej nedovede fungovat v nicem jinym nez 80x25, nevim, prilis jsem navykl na linuxovske reseni pres ncurses, kterejm je proste jedno, jak velky je terminal, nejak se tomu prizpusobi, takze ted nevim, jak presne je tohle na Winech.

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

(c) 2001-2011 Lopuch.cz   
Kontakt