debugwindow ved hjælp af atomer

, forklarer hvad atomer er, og hvordan du kan bruge dem til at sende tråde til andre anvendelser, uden behov for fælles hukommelse.,, emne: debugwindow ved hjælp af atomer og meddelelser, områder: windows api, komponent udvikling, atomer, forfatter: john scalco, april 01, 2001, mailto: jscalco @ idealsw. kom, læsere bemærkning: for en html version af denne artikel og /eller kildekoden, du kan downloade koden fra http: //www.idealsw. kom /filedownloads. html,,,,, for længe siden, i et langt fra 16 - bit - galaksen, jeg brugte delphi 1,0.på det tidspunkt, jeg arbejdede på en ansøgning, som var i gang med tidstro kommunikation.delphi - 1, 0 debugger var en c dll, som i mit tilfælde), ofte har... hvis jeg sætter grænseværdier i visse funktioner.som følge heraf, virkede det som om, at jeg har brugt meget tid tilbage min pc - windows 3.1 vil ikke frigive dll, som debugger brugte.,,, med hensyn til min ansøgning ved at placere breakpoints i kodeksen, jeg løb en risiko for, at jeg kunne være at ændre den måde, hvorpå ansøgningen arbejdede (det var en kommunikation type software - pakken),,,,, efter et stykke tid, og mange genstarter senere, jeg blev træt af det, og jeg tænkte, "jeg ville ønske, jeg havde en fejlcheck vindue som visuelle c + + og visuelle grundlæggende".selv om brugen af visuelle c + + er ser vindue, er et godt udgangspunkt, træk klogt, jeg havde brug for flere muligheder, end det, der tilbydes.hvis kun delphi havde sådan noget.,,,,,, jeg ville have følgende kendetegn:,,, evnen til at se data i den skærm, mens programmet løb.,, evnen til at redde disse data til en fil, print det til en fil, og type i teksten, at tilføje yderligere kommentarer.,,, jeg ville også give brugeren af mit produkt at køre dette værktøj (på deres pc 'er) til at udføre diagnostik "i marken".,,, someo af dem kan være at sige "hej, hvorfor ikke bruge tilfælde skærm?? "...god idé, men det var ikke til rådighed i win16 og den stadig ikke havde alle de elementer, jeg har nævnt.især, at den kan bruges af en kunde i marken.,,,, med delphi, jeg kunne få de fleste af disse karakteristika ved at skrive en separat ansøgning med et notat komponent i det, og nogle ekstra kode.problemet var, at produktionen fra min ansøgning til anden anvendelse.,,, ind i vinduerne sdk.jeg ved, det lyder sygt, men jeg har til tider snoop sdk for interessante opgaver, men en dag, mens jeg var "snage", og jeg fandt noget, der hedder et atom.,,, en atom tillader dig, at en snor i en placering i os, hvor alle kan få adgang til det, uanset hvad du er i processen.det er som fælles hukommelse, men du behøver ikke gøre meget for at give andre processer, for at få fat i data.,,, for at få adgang til "ved du hvad" nøglen "er at indhente oplysninger i atomet.så længe en ansøgning "ved", hvad nøglen er, at det kan hente data fra atomet.,,, ved hjælp af denne atom, jeg kunne bringe snoren i mands minde - - og så kunne jeg lade min anden anvendelse ved, at jeg havde stillet oplysninger der og så app kunne finde det og vise det.,,,,, det ville gøre det lettere at opfatte dette som en klient /server - forhold.kunden er den ansøgning, der er under ordnede.serveren er anvendelsen eller skærm, der skal være ansvarlig for at vise den besked.dette åbner interessante muligheder: forestil dig, at du ønskede at filtrere budskaber eller udføre andre typer foranstaltninger, baseret på specifikke budskaber, som skriver en besked.,,,, så kunden skal gøre følgende:,,, streng besked i et atom.for eksempel: "hej" og sende et budskab til server anvendelse, der viser, at den snor, er til rådighed for behandling.,,,, - - skal gøre følgende:,, klare budskab (windows - meddelelse), som angiver den snor, er til rådighed for læse - og ekstrakt snoren fra atom - det i ser på skærmen.,,,,, det her er kunde er en kode.I decided to place this in a procedure so that I didn't have to repeat the same code every time I wanted to post a debug message.,,, procedure DebugMsg(AMsg:string);,, var,, szMsg : array [0..255] of char;,, Atom : TAtom;,, begin,,, //Add an atom the list of Global atoms,, //available from any application,, Atom := GlobalAddAtom (StrPCopy (szMsg, AMsg));,,, //broadcast the message that I have,, //updated my atom to all top windows - I don't know,,, //which window is a debug window.,, SendMessage (hwnd_broadcast, wm_DebugId, 0, Atom);,,, //delete the atom - by the time the,, //message has been sent above, the,, //atom is no longer needed,,, // - in theory :),, GlobalDeleteAtom (Atom);,, end;,,,, The Atom is addedfor den samlede liste over atomer, som er tilgængelige for anvendelse, så længe de ved "nøglen".af den måde, størrelsen af den snor, ifølge lægerne, er begrænset til 255. selv om det lyder som win16 dok.måske nogen har glemt at ajourføre dem?.,,,,, der sendes et budskab til alle top vinduer - det er (meget) anvendelse.i stedet for at kende navnet på den ansøgning, som styrer ser på skærmen, kan jeg ganske enkelt sende et budskab til alle top vinduer.det holder alle muligheder åbne - - på et tidspunkt, jeg kunne skrive en anden ser på skærmen app?det behøver jeg ikke at ændre kodeksen i den kunde, behøver jeg blot at gennemføre en server, der ved besked til at lytte til, og det kan også modtage meddelelser om debugging - aktivitet,.,,, som en påmindelse, funktion sendmessage() vil ikke tilbage, før det har sendt den besked, inden den næste linje er nået, atom er allerede blevet læst fra af "beskueren« anvendelse.,,, en sidste bemærkning om denne kode snippet er det budskab, som jeg bruger wm_debugid, hvor kommer det fra???- vinduer faktisk enestående genererer.der er masser af beskeder i vinduerne, hvis du vælger bare et tilfældigt tal, er der en chance for, at det kan anvendes til noget andet.for eksempel, hvad hvis du bruger det budskab, som ændrer farven på vinduet, - - kunne du have nogle ret "interessante" resultater.vinduer, omhandler dette potentielle problem ved at give en adi, registerwindowmessage(), der giver dig mulighed for at oprette (reserve) en enestående vinduer besked.,,, procedure debugmsg_init;,, begynder, wm_debugid: = registerwindowmessage ('is_debug);,,,,,,, at dette budskab skal være oprettet før opkald til debugmsg() er lavet.jeg gør dette ved at placere denne kode i den initialization afsnit på den enhed, hvor jeg har min kode.at denne kode i den initialization del af enheden sikrer, at kodeksen bliver kaldt, når enheden er ladt tilbage i hukommelsen i begyndelsen af anvendelsen, hvilket resulterede i min skik budskab, der er registreret før enhver opfordring til at debugmsg() er gjort.,,, så vi har en idé om, hvordan til at sende en besked fra klientprogrammet til server.lad os se, hvad de har at gøre - at indfange de besked.,,,, - kode, løsningen er at fælde et vindue ind og se det.,,, det er sådan her:,,, procedure tform1.defaulthandler (var - mng: tmessage),, var, szbuffer: system [0..255] char,,, smsg: string;, begynder, //se, om det er den ser id, hvis mng. mng = getdebugid så begynde, hvis globalgetatomname (msg.lparam, szbuffer, 255) = 0,, strcopy (szbuffer, "fejl: atom ikke fundet");,,, smsg: = strpas (szbuffer);,, memo1.lines.add ('dbg > > + smsg);,,,,,,,,,,, defaulthandler metode faktisk behandler alle meddelelser, der ikke er håndtering af form.så vi kan omgå denne metode og tilføje en kode, som vil kontrollere, om vores skik besked wm_debugid.hvis vi får den besked, vi ved, vi vil klare det. ellers vil alle andre budskaber igennem.,,, ved hjælp af windows api - globalgetatomname (), jeg finde atom fra atomet, og jeg derefter konvertere nul afsluttes snor til en regelmæssig pascal snor.jeg så skrive det til det element, der er den form,.,,, at holde områder (og hårde kodning) til et minimum, skrev jeg en funktion til getdebugid(), som vender tilbage, hvad wm_debugid er fastsat, giver dette en ansøgning, som ønsker at vise signaler fra skærmen på en måde at få det korrekt wm_debugid uden at ændre det eller afhængigt af, hvordan den gennemføres - da funktion viser, det er gennemførelsen og er i den enhed, der kaldes is_debug. pas.,,, hvis du har downloadet kildekoden til is_debug.pas, de har måske bemærket, at jeg har erklæret wm_debugid som en variabel under gennemførelsen.det er ikke en fejl.,,, før de dage i delphi (turbo pascal), hvis du ville holde brugere af en enhed fra at få adgang til visse typer oplysninger, eller endog at vide, hvordan den type blev gennemført, kunne du sætte erklæringer under gennemførelsen afdeling, og det ville være private til enheden,.,,, - herunder funktioner, metoder, klasser og så på anmeldt under gennemførelsen af enhed kan ikke nås af den kode, som anvender enheden.så det er faktisk en privat variabel uden objekter.,,,,, det er her for fuldstændighed:,,, funktion getdebugid: heltal, begynder, resultat: = wm_debugid,,,,,,,, og det er en god måde at tillade, at en ansøgning om at sende meddelelser til andre anvendelser uden at bruge fælles hukommelse.,,,,, at dette stykke værktøj har været nyttige, jeg brugte det mange gange, nu, hvis skærmen er til rådighed, men, du ved, jeg stadig gerne denne fremgangsmåde, fordi, jeg kan skrive det, jeg kan skrive ind som blok og jeg kan skære og pasta - plus en kunde kan bruge det som et redskab til at diagnosticere ser et problem.- for at sige det mildt for mig, at det har været nyttigt.,,,, jeg viste det til de lokale delphi interesse gruppe her i raleigh durham for et par måneder siden og alle syntes om det.nogle sagde, "hvad med en komponent version?"jeg havde tænkt på det, men jeg nåede aldrig at gøre det.indtil nu.hvis du er interesseret i en komponent version af denne, som de kan sætte ind i din ansøgning, så læs min kommende artikel, som hovedsagelig bygger på dette.,,, jeg håber, du finder det nyttigt, og jeg beder dem om at stille de spørgsmål, de måtte have om denne artikel.,,,,,,, oprigtigt,,, john. scalco, ideelt software, inc., raleigh durham, nc 27502,, mailto: jscalco @ idealsw. komhttp: //www.idealsw. kom,,,,,,,,,



Previous:
Next Page: