ďťż

Ładny brzuch

Witam

Problem jest taki: jak z tablicy znaków (konkretnie char[20]) zrobic HWND? Próbowałem w ten sposób:

char buf[20];
HWND hwnd;
// ciach....
hwnd = (HWND) buf;
// ciach...


Skompilowało się, ale program generuje błąd. Próbowałem dynamic_cast i tym razem się nie kompiluje... Pomocy!

Pozdrawiam



eee?

Ty masz w tej tablicy charów uchwyt jakiegoś okna zapisany jako łańcuch znaków?
Jeśli tak to raczej wystarczy zwykłe atoi();

char buf[20]; HWND hwnd; // ciach.... hwnd = (HWND)atoi(buf);
Użytkownik Futhark edytował ten post 20 czerwiec 2005, 20:16
nie wiem zupełnie po co wykonujesz rzutowanie adresu tablicy na HWND, może przechowujesz w niej właśnie uchwyty okien, ale nawet wówczs powinienś zrobić to w inny sposób aby dobrać do nich... mimo to spróbuj reinterpret_cast

// mhmmm...
Użytkownik Kyoko edytował ten post 20 czerwiec 2005, 20:22
Ani to, ani to nie działa... Nie wierzę, żeby nie udało się tego zrzutowac, musi byc jakiś sposób... Jak lepiej mogę "składowac" HWND?



Jakieś pomysły?? Piszcie, piszcie...


Jakieś pomysły?? Piszcie, piszcie...

nie wiem, jak to robiłeś, ale tak ▼ działa ☺

char acTab[20] = {0};
HWND hWnd = reinterpret_cast<HWND>(acTab);
Użytkownik Kyoko edytował ten post 22 czerwiec 2005, 14:35
No faktycznie, rzutowanie działa, ale okazało się, że program źle odczytuje HWND... Występują np. 2 znaki "x" i niektóre liczby się dublują... Może to kwestia "%s" albo czegoś takiego?

Ej, panowie.
A wy wiecie wogóle, co to jest HWND, i co to są uchwyty?
Po kolei:
HWND <==> unsigned int
Uchwyt to jest liczba. Uchwyt okna to liczba nadana przez system, która jednoznacznie określa okno. HWDN to nie żaden wskaźnik, tylko najzwyklejsza liczba.

Co do sposobów "składowania" - co to za problem? Zapisać jako liczbę, odczytać jako liczbę - można albo sprintf'em, albo std::stringstream'em. Nie rozumiem natomiast tych pomysłów z rzutowaniem tablicy reinterpret_cast'em - co to ma dać? Chcecie zapisać adres tablicy jako wartość HWND? W najlepszym przypadku to po prostu scrashuje program; jednak przez przypadek możecie zacząć grzebać w obcych oknach i zrobi się nieciekawie ^^. A co do pomysłu z dynamic_cast - MZet, doczytaj sobie dokładniej do czego służy ten operator. I w ogóle - przestudiuj Symfonię albo Megatutorial ;)

BTW. Futhark dobrze pisał, wystarczy:
HWND uchwyt = static_cast<HWND>(atoi(bufor) );
gdzie bufor == ta tablica 20-elementowa.

Jeszcze mała uwaga odnośnie "składowania" uchwytów. System operacyjny przydziela te uchwyty przy tworzeniu okna wedle WŁASNEGO uznania, więc nie możemy tworzyć okna z konkretnym uchwytem. W przypadku własnego okna [nie liczę najbardziej podstawowych systemowych] po resecie programu, a w najgorszym przypadku komputera, uchwyt nie będzie już poprawny.

Pozdrawiam,
TeMPOraL.

zachowajmy spokój, ☺ Pan MZet nie pisał nic o uchwytch okien, co z tego, że HWND służy w Windows API do przechowywania właśnie uchwytów okien, przecież może on chce trzymać w HWND informacje o - hmm ja wiem - średnicy słoików!, kto to wie!, pomysł chory ale przecież, może pisze jakiś pokręcony program, w moim poście zwracam na to uwagę, ale to sprawa MZet co robi, tak czy siak rzutowanie adresu tablicy na cokolwiek i później używanie tego ma dość mały sens, aczkolwiek, taka wartość może się do czegoś przydać...

mr. Temporal! ☺
czy wiesz ile atoi pochłania cyklów, zapraszam do zdebugowania funkcji, nie twierdzą, że to zamuli aplikację, ale po co to wywoływać jak nie ma potrzeby

użycie static_cast będzie tu błędem składniowym, a to dlatego, że stały wskaźnik (adres tablicy) jest rzutowany do nie const ☺ oczywiście o ile wykluczamy użycie atoi

reinterpret_cast jest właśnie przeznaczone do niestandardowych rzutowań w przeciwieństwie do SC i właśnie to rzutowanie powinno zostać zastosowane

no tak mi się wydaje ☺
Użytkownik Kyoko edytował ten post 23 czerwiec 2005, 02:27

zachowajmy spokój, ☺ Pan MZet nie pisał nic o uchwytch okien, co z tego, że HWND służy w Windows API do przechowywania właśnie uchwytów okien, przecież może on chce trzymać w HWND informacje o - hmm ja wiem - średnicy słoików!, kto to wie!, pomysł chory ale przecież, może pisze jakiś pokręcony program, w moim poście zwracam na to uwagę, ale to sprawa MZet co robi, tak czy siak rzutowanie adresu tablicy na cokolwiek i później używanie tego ma dość mały sens, aczkolwiek, taka wartość może się do czegoś przydać...

ale temat poszedł w las,
naszym celem jest rozstrzygnięcie, jak zrzutować wskaźnik const char* na typ HWND, to jest sedno sprawy, a tutaj atoi nam doszło i tak dalej, Temporal please, skup się na tym tylko :) bo już wiedzę, że podświadomie odkryli wszyscy co MZet chciał zrobić :)

pozdrawiam Jacek :)


ale temat poszedł w las,
naszym celem jest rozstrzygnięcie, jak zrzutować wskaźnik const char* na typ HWND, to jest sedno sprawy, a tutaj atoi nam doszło i tak dalej, Temporal please, skup się na tym tylko :) bo już wiedzę, że podświadomie odkryli wszyscy co MZet chciał zrobić :)

pozdrawiam Jacek :)

To jesteś Ty :)
a z tym rzutowaniem nie wykręcam kota ogonem, bo przecież o to chodziło

Dobra; to ja przepraszam - może rzeczywiście "wykręciłem kota ogonem", ale koleś pytał się jak przekształcić tablicę z LICZBĄ w HWND, czyli wynika z tego, że prawdopodobnie chciał liczbę zapisaną jako tekst umieścić w HWND. Ale jeśli się myliłem [choć dalej twierdzę, że o to mu chodziło], to przepraszam ;).
Pozdrawiam ;)


wynika z tego, że prawdopodobnie chciał liczbę zapisaną jako tekst umieścić w HWND


No ba...

A tak BTW - UkrywaczNeo (bo do niego jest mi to wszystko potrzebne) zapisuje HWND w pliku, a PokazywaczNeo je odczytuje... Ludzie, ja wiem, co to jest HWND i jaki ono ma czas życia! Chodzi tylko o zachowanie uchwytu na czas konkretnej sesji systemu, a nie na 100 000 dni... Okienko Neostrady nie może byc przecież zamknięte gdy jest ukryte przed użyszkodnikiem (chyba że NeostradaTP.exe scrashuje, ale to już nie ten problem :))

no TeMPOraL juz podal rozwiazanie przeciez, a MZet to sam chyba nie wie o co mu biega i nie potrafi tego wprost napisac


Ale niezależnie od tego, HWND to i tak dalej unsigned int, i obsługa w tym kontekście zostaje taka sama.

Oj ... cobys sie nie przejechal :). To pointer a nie unsigned int :]

// EDIT:

a ja nie kumam MZtowego problemu. Geez ... zapisuje binarnie te sizeof(HWND) bajtow, potem odczytuje i ni cholery nie ma ZADNEJ konwersji .... po co sie pytam on to robi ??? ....
Użytkownik st3tc edytował ten post 23 czerwiec 2005, 21:09
ja tam nie wiem ;> moze nie wie ze mozna inaczej?

No nie...

Jaki sizeof? Tego nie ma w moim kodzie... Weźcie sobie skompilujcie wasz kod w Dev-Cpp i zobaczcie jak wasze gadanie bierze w łeb!


No nie...

Jaki sizeof? Tego nie ma w moim kodzie... Weźcie sobie skompilujcie wasz kod w Dev-Cpp i zobaczcie jak wasze gadanie bierze w łeb!


Oj ... cobys sie nie przejechal :). To pointer a nie unsigned int :]
(...)

Temporal - nie wazne co przechowuje. Wazny typ :). Przy portowaniu bf-a na 64 bit dostalem kopa w dupe bo mial HWND 64 bity a ja mialem castowania do DWORD-a :]
Użytkownik st3tc edytował ten post 23 czerwiec 2005, 21:41

Twoje HWND nie ma liczby zawartej w tej tablicy, tylko jej [tablicy] ADRES W PAMIĘCI!

Heh no lol skończyło się na samoresecie kompa... :P Tylko mówię, zanim coś powiecie, skompilujcie sobie kod wg waszych wskazówek... Gadac najprościej. Gorzej zrobic, a niektóre z waszych fragmentów kodu w ogóle nie chciały się skompilowac!!!


Temporal - nie wazne co przechowuje. Wazny typ :). Tez bylem taki naiwny jak Ty - ale przy portowaniu bf-a na 64 bit dostalem kopa w dupe bo mial HWND 64 bity a ja mialem castowania do DWORD-a :]

MZet - daj nam po prostu ten kod to ci napiszemy poprawnie bo szczerze mowiac mnie juz cholera bierze jasna na twoje narzekania. Zamiast starac sie zrozumiec walisz na pale i masz pretensje.

Daj kod to Ci sam cholerka poprawie i nie bedziesz sie tu plul dluzej :P

// Wiem wiem unioslem sie .....

// TeMPOraL - ano niestety tak to juz tutaj jest :)
Użytkownik st3tc edytował ten post 23 czerwiec 2005, 21:50

HWND uchwyt;
char bufor[20]; //tutaj masz te HWND
std::sscanf(bufor, "%d", &uchwyt);

Doincluduj <cstdio>.


No nareszcie do rzeczy! Zamiast gadac głupoty wreszcie napisałeś kawałek kodu! Kilka linii kodu, a dyskusja na kilkadziesiąt postów... Inna rzecz - ja widocznie nie jestem tak doświadczony jak wy w tym temacie. Dlatego chcę jasnego wytłumaczenia. Dziękuję za ten fragment programu.

Troche pokory i szacunku czlowieku !. Kurna - podales debilne (tak - celowo uzywam tak dosadnego slowa) opisanie problemu (odsylam do lektury o prawidlowym pisaniu topicku). Nie podales kompletnie NIC na temat CO MASZ W TYM GLUPIM STRINGU. Co my wrozki do jasnej marchewki jestesmy ?. Mamy sie domyslac co zmalowales ?. Rownie dobrze mogles wpisac w pointer stringa wartosc HWND (i tak wiekszosc pomyslala).

Nie rozwalaj mnie - na moja propozycje jak PROSCIEJ zrobic - bez zadnych pierniczonych konwersji - po prostu zapisujac binarnie te glupie 4 bajty - to wyjechales na mnie ze nie masz w programie zadnego sizeof ... no ja piernicze a ty w ogole wiesz co ja mowilem i wiesz co to sizeof ?

Sam jestes sobie winien - a na proby chlopakow zgadniecia Co marysia miala na mysli jeszcze narzekasz. Jak bys podal CO bylo w tym stringu - PRZYKLAD - to bys mial odpowiedz w pierwszym poscie zaraz ...

Ja piernicze ... skad sie tacy biora ... ludzie chca im pomoc a ci jeszcze narzekaja :/

A normalnie "dajcie mi kod - ja nie mam zamiaru myslec sam wiec sie odczepcie" to mnie juz totalnie rozwala ...

Ty to jesteś brechowy... Jak zobaczę w telewizji że człowiek umarł na zawał gdzieś w Polsce (?) przed monitorem to sam umrę, ale ze śmiechu!

Jakoś wszyscy zrozumieli co jest "w tym głupim stringu", a ty nie?

// EDIT:

czy 262372 = 0x22fe48 ?
Użytkownik MZet edytował ten post 24 czerwiec 2005, 09:44
lol, przelicz sobie. i przestan pieprzyc, bo nastepnym razem nikt ci nawet nie bedzie chcial pomoc. i czytaj uwaznie co sie do ciebie pisze.

st3tc: jak ty to robisz, ze potrafisz zastapic lacine takimi *grzecznymi* tekstami? :>


Jakoś wszyscy zrozumieli co jest "w tym głupim stringu", a ty nie?

Blyskaj blyskaj dalej moze w koncu blysniesz czyms madrym. Jak bys nie zauwazyl to juz DAWNO ci powiedzialem jak to zrobic prosciej - i o dziwo - dokladnie to co chcesz.

Dla mnie eot lameriada i dyskusje z lameriada mnie irytuja ...

// AoD - znam jeszcze fajniejsze ale to pozniej :). BTW - co ty tak rano robisz ? Juz wakacje ? :/
Użytkownik st3tc edytował ten post 24 czerwiec 2005, 10:05

Dla mnie eot lameriada i dyskusje z lameriada mnie irytuja ...

Kto ci każe odpisywac?! Ten chyba, kto nie odróżnia newbie od lamera jest lamerem...

MZet - rzucasz sie - ale co ja (my) poradzimy ze jestes lopatologicznie odporny na wiedze i masz wzok jak kurze jajko ?.

Wystarczy wspomniec niedawny topick o rozmiarze exekow twojego programu - dostales 4 razy odpowiedz co nalezy zrobic - nawet kawa na lawe bo juz tracilem cierpliwosc (i inni chyba tez) a ty co ?

Najnormalniej w swiecie zbluzgales nas ...

Ja zaczynam podejrzewac, ze Ty masz jakis filtr na oczach - czytasz topick i wyszukujesz bloku [ CODE ][ /CODE ]. Jak go nie zobaczysz lecisz dalej ...

Problem w tym ze to forum (dzial) dla programistow - tak mi sie wydaje. Sek w tym, ze programista to ktos kto posiada nieslychanie trudna zdolnosc do samodzielnego myslenia.

I nie mowie tu - "odczep sie MZet radz sobie sam" - NIE - my Ci naprawde chetnie pomozemy.

Ale na BOGA - MZet - czytaj co Ci piszemy bo kurde szkoda pisac ...

I nie rzucaj mi tu hasel, ze jestem lamerem bo nie widze roznicy miedzy newbie a lamerem. Wiesz - newbie to ktos kto sie uczy - kto mysli samodzielnie bo sie chce czegos nauczyc.

Na drugi raz prosze uprzejmie czytac co piszemy - postarac sie zrozumiec co autor mial na mysli. Czesto odpowiedzi nie sa kawa na lawe - jak takie chcesz to idz na forum cosmopolitan.

My szanujemy ludzi ktorzy chca robic i sie do tego garna. Ale nie ludzi ktorym jak powiesz - "sluchaj a moze zrob z tym- bedzie lepiej" to w podziece wala bluzgi bo nie dala ta osoba [ CODE ][ /CODE ] ...

Patrzylem na rozne Twoje posty - niestety to jest nagminne

Pozdr.
st3tc
Użytkownik st3tc edytował ten post 24 czerwiec 2005, 11:32
st3tc, ja juz wakacje mam od dawna :> i jeszcze dluuugo je bede mial :) a dzisiaj jakos wyjatkowo mi sie udalo wstac :)

MZet - ciebie calkiem pogielo? przeczytaj sobie od poczatku caly ten temat. i wyciagnij wnioski. jesli liczysz, ze ktos ci da kod, ktory ty sobie wkleisz to sorry - panowie, next time dawajcie mu kod, ale z duzymi bledami, zeby musial go sobie sam poprawic, moze chociaz w ten sposob sie czegso nauczy :> (a jak nie, to mala strata :))

Po pierwsze - próbuję myślec, ale zrobic ten kawałek kodu to nie jest takie proste, jak wam się wydaje (ciekawe, czy wy w ogóle widzieliście źródła starego Ukrywacza, o którym piszę)?

Macie tu źródła wersji, z którą się właśnie męczę:

// PokazywaczNeo.cpp #include <windows.h> #include <iostream> #include <fstream> using namespace std; int main() {    ifstream plik_in("ukr_cfg.dat", ios::binary);    HWND hwnd;    char buf[20] = {0};    if (!plik_in) cout << "\n\nNie mozna odnalezc pliku z ustawieniami programu. Ponowne pokazanie okna nie jest mozliwe.\n\n";    else    {        plik_in.read(buf, 20);        plik_in.close();        ofstream plik_out("ukr_cfg.dat");        if (!plik_out)        {            cout << "\n\nNie mozna wyczyscic pliku konfiguracji. Nie uruchamiaj ponownie PokazywaczNeo bez uprzedniego uruchomienia UkrywaczaNeo.\n\n";        }        else        {          plik_out << "";          plik_out.close();        }        }                hwnd = (HWND) (long) buf;        // kontrowersyjna linia...    cout << "\n\n" << hwnd;    if (!hwnd) {cout << "\n\nNie mozna odnalezc okna. Ponowne pokazanie okna nie jest mozliwe.\n\n"; system("PAUSE");} else {ShowWindow(hwnd, 1); cout << "\n\nOkno zostalo pokazane. Aby je schowac uruchom program PokazywaczNeo.\n\n"; system("PAUSE");}    return 0; }

// UkrywaczNeo.cpp #include <windows.h> #include <iostream> #include <fstream> using namespace std; void Chowaj(HWND hwnd) {    cout << "\n\nZnaleziono okno\n\n";    ShowWindow(hwnd, SW_HIDE);    cout << "Aby pokazac okno uruchom program PokazywaczNeo\n\n";    system("PAUSE"); } void nie_znaleziono() {    cout << "\n\nNie znaleziono okna. Okno prawdopodobnie nie jest otwarte lub widoczne. Jezeli ukryles je wczesniej, uruchom program PokazywaczNeo.\n\n";    system("PAUSE"); }     BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lparam) { char text[256]; if (GetWindowText(hwnd, text, 256))  if (strstr(text, " Neostrada TP") != 0)   if (IsWindowVisible(hwnd)) Chowaj(hwnd);    else return true;    else return true;    else return true;    ofstream plik ("ukr_cfg.dat", ios::binary);    if (!plik) cout << "\n\nNie mozna zapisac ustawien programu. Ponowne pokazanie okna moze nie dojsc do skutku.\n\n";    else {plik << (hwnd); plik.close();} return false; } int main() {    if (EnumWindows(&EnumProc, 0) == true) nie_znaleziono();    return 0; }    

Jeżeli ten kod przyprawia was o conajmniej palpitacje, trudno - jedne z moich niewielu programów, które zawierają ponad 20 linii... Skompilujcie, zobaczcie (ja używam Dev-Cpp). To jest cała specyfika - ten program zapisuje, ten odczytuje to HWND, i sam myślałem, że problem jest mniejszy niż w rzeczywistości...

Po drugie - st3tc: sam cholerujesz i wyrażasz się grubiańsko... Z resztą zobacz, na te kilkadziesiąt postów o rozmiarze programów dostałem TYLKO 4 odpowiedzi z sensem. Skończyło się na tym, że tą "olimpiadę kto da mniej" zamknął moderator... :) Weź się nie zdenerwuj jak ty prosisz o metodę, a oni ci dają same rozmiary i exeki już skompilowane.


Po drugie - st3tc: sam cholerujesz i wyrażasz się grubiańsko... Z resztą zobacz, na te kilkadziesiąt postów o rozmiarze programów dostałem TYLKO 4 odpowiedzi z sensem. Skończyło się na tym, że tą "olimpiadę kto da mniej" zamknął moderator... :) Weź się nie zdenerwuj jak ty prosisz o metodę, a oni ci dają  same rozmiary i exeki już skompilowane.

czesc czołem.

Rada pierwsza:
"wywal #include <iostream> "

Rada druga:
"Hmm mi UkrywaczNeo(kod ze strony projektu) kompilowany w Microsoft Visual C++ Toolkit 2003 zajmuje ~80KB, dlatego propozycja Futhark o zmianie kompilatora jest jak najbardziej wskazana jeśli autorowi topiku chodzi o rozmiar (ew. Zmiana biblioteki na <cstdio> ). "

Rada trzecia:
"Niech ten kolega wywali iostream - juz spax chyba nawet mowil. iostream na GCC jest koszmarnie olbrzymi. Zamiast cout << niech uzyje printf i juz mu kolosalnie spadnie "

Podziękowanie za rady:
"Czy ktoś tu umie czytac po polsku?!"

I kto tu jest grubiański?

pozdro
sp4x
Użytkownik spax edytował ten post 24 czerwiec 2005, 13:04
MZet, troche szacunku do ludzi którzy Ci pomagają na forum. Co jak co, ale nazwanie st3tc'a lamerem to już jest totalne przegięcie [szkoda, że nie wiesz dlaczego ^^]. Odpowiedź podana została w tym temacie już wiele razy, i to na samym początku. Tylko Ty jej nie chcesz zobaczyć.

ifstream plik_in("ukr_cfg.dat", ios::binary);
(...)
hwnd = (HWND) (long) buf;        // kontrowersyjna linia...

Na litość.... mogłeś nam powiedzieć, że wczytujesz przez ios::binary.
hwnd = *(reinterpret_cast<const HWND*>(buf));
To przerobi pierwsze sizeof(HWND) bajtów na HWND.

Jesteś jednym z tych nielicznych osób, którym po prostu nie chce się pomagać, bo im bardziej się człowiek stara, tym Ty bardziej narzekasz. Zwłaszcza, że Twój problem jest tak banalny, że nawet n00b w znaczeniu st3tc'a [samodzielnie myślący] z Symfonią lub Megatutorialem pod ręką sam potrafi na to wpaść. Też kiedyś zaczynałem, i naprawdę - na takie rzeczy da się samemu wpaść.

Pozdrawiam.

PS.
st3tc, witam w KŚESACP ;).
Użytkownik TeMPOraL edytował ten post 24 czerwiec 2005, 16:49

MZet, troche szacunku do ludzi którzy Ci pomagają na forum. Co jak co, ale nazwanie st3tc'a lamerem to już jest totalne przegięcie [szkoda, że nie wiesz dlaczego ^^]. Odpowiedź podana została w tym temacie już wiele razy, i to na samym początku. Tylko Ty jej nie chcesz zobaczyć.

Na litość.... mogłeś nam powiedzieć, że wczytujesz przez ios::binary.
hwnd = *(reinterpret_cast<const HWND*>(buf));
To przerobi pierwsze sizeof(HWND) bajtów na HWND.

Jesteś jednym z tych nielicznych osób, którym po prostu nie chce się pomagać, bo im bardziej się człowiek stara, tym Ty bardziej narzekasz. Zwłaszcza, że Twój problem jest tak banalny, że nawet n00b w znaczeniu st3tc'a [samodzielnie myślący] z Symfonią lub Megatutorialem pod ręką sam potrafi na to wpaść. Też kiedyś zaczynałem, i naprawdę - na takie rzeczy da się samemu wpaść.

Pozdrawiam.

PS.
st3tc, witam w KŚESACP ;).

Miałem już zignorować ten temat, ale już nie wytrzymałem. MZet - ty już przeginasz na całej linii. Zachowujesz sie jak 5 letni dzieciak, któremu się powie: "głupio zrobiłeś, powinieneś...", a odpowiada "sam jesteś głupi, lamerze jeden!"

To jeszcze nic, ja nie choleruję, nie mówię, że coś jest debilne, nie nazywam z własnej inicjatywy ludzi "lameriadą"...

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •