Wednesday, 16. November 2005Interessantes neues Blog
Habe heute einen Link zu einem interessanten, relativ neuen Blog bekommen, den ich hier nur weiterempfehlen kann:
http://www.hexblog.com/ Beinhaltet interessante Artikel rund um das Debuggen mit IDA Pro. Sunday, 13. November 2005Zugriff auf COM-Funktionen mittels plain-C
Alles begann damit, dass ich mir in den Kopf gesetzt habe, das Windows Adressbuch auszulesen, um Telefonnummern für mein Miranda WebSMS - Adressbuch zu sammeln.
Durch kurzes Suchen bin ich dann auch recht schnell auf die Funktion WABOpen gestoßen, um gleich darauf aufzuschrecken: Oh, was haben wie denn da? COM? Hilfe! Nachdem ich am liebsten in plain C entwickle hat mich das zurückgegebene Interface gleich etwas verunsichert. Sieht verdächtig nach C++ aus. Ein näherer Blick auf das Interface hat diesen Verdacht noch verhärtet. Also habe ich nach Alternativen gesucht, aber die einzige Möglichkeit, das Adressbuch auszulesen ist über COM. Na gut, dann muss das Teil aber über C auch ansprechbar sein, schließlich baut die ganze WIN32-API darauf auf. Daher habe ich mich etwas über COM schlau gemacht. Wo ist der beste Ort hierfür? Klar, in Raymond Chens Weblog The Old New Thing. Ich habe auch gleich eine kurze Erklärung des COM Interfaces gefunden, was meinen Verdacht, dass das Zeugs doch mittels C ansprechbar ist, bestätigt hat. Na juhu, dann auf ans Werk! Die Beispiele, die man zum Windows-Adressbuch im Internet so findet sind leider so gut wie alle C++. Und in C++ kann man die COM-Interfaces wie Klassen ansprechen, mittels iInterface->Function(Param1, Param2, ...) Wer das jedoch in C versucht, wird schnell feststellen, dass die COM-Struktur nicht einfach direkt Function-Pointer auf die entsprechenden Funktionen enthält und das damit auf dieselbe Weise auch in C funktioniert. Viel mehr baut COM die C++ Klassenfunktionalität mithilfe von sogenannten VTABLEs nach. Diese enthalten die entsprechenden Function Pointer auf die Startadressen der jeweiligen Funktionen . Die Funktionen ihrerseits bekommen als ersten Parameter den aus C++ bekannten this-pointer mit übergeben. In C++ wird dies entsprechend automatisch aufgelöst, in C muss man jedoch manuell auf dien vTable zugreifen. Um das Ganze kurz zu fassen, wie man nun auf COM-Funktionen in C zugreift, zeige ich das Ganze anhand der Funktion IAddrBook::GetPAB :
Also ein C einfach die Funktion innerhalb des Strukturmembers lpVtbl suchen und als ersten PArameter das Interface mitübergeben. Das ist alles. Saturday, 12. November 2005frische gameboy tunes auf dotmatrix.at
auf dotmatrix.at finden sich nun unter anderem auch tracks, die auf der bigbrother awards gala gespielt wurden!
Serious Sam II VS. Quake IV"Mit Quake IV und Serious Sam II treffen sich zwei Subgenres auf unerwartete Art und Weise. David gegen Goliath? In Quake IV zeigen sich die Schwächen, in Serious Sam II jedoch die unerwarteten Stärken des Genres Egoshooter" Zurück zur Sturm-und-Drang-Zeit der Egoshooter @ telepolis Sunday, 6. November 2005leitfaden.at - Ratgeber, Leitfäden usw.
ein kleiner hinweis in eigener sache: seit gestern gibt es die seite www.leitfaden.at.
das ganze ist ein wiki das eben für ratgeber, anleitungen und leitfäden jeglicher art gedacht ist, mitarbeit ist jederzeit willkommen, alle arten von ratgebern sind erwünscht - beteiligt euch! Halloween Chiptunes
per zufall bin ich auf der homepage vom schaua auf einen link zu einer chipstyle halloween compilation gestossen. hört's auch an!
downtime
hardwarefetish.com war zwischen gestern abend und jetzt für die meisten user nicht erreichbar, der grund war eine serverumstellung und nun auch neuinstallation des blog-scripts.
bis auf einen großteil der kommentare konnten alle einträge und benutzerdaten übersiedelt werden, diese seite sollte jetzt wieder den vollen funktionsumfang bieten. Tuesday, 1. November 2005Windows Standarddialoge anpassen
Auch wenn es darüber schon etliche Artikel im Netz gibt, möchte ich hier dennoch eine Technik präsentieren, wie man Standarddialoge, wie z.B. die MessageBox - Dialoge modifizieren und für seine Zwecke anpassen kann.
Das Ganze hat folgenden Hintergrund: Ich habe in der Arbeit ein Programm geschrieben, welches eine Erfolgsmeldung ausgibt, wenn es abgeschlossen ist: "Generierung erfolgreich abgeschlossen" [OK] Nun wollte der Programmauftraggeber aber auch die Möglichkeit haben, die generierte Datei aus diesem Dialog heraus zu öffnen, also selbigen Dialog, nur neben dem [OK] sollte ein [Datei öffnen] stehen. Nun gibt es mehrere Ansätze, das Problem zu Lösen. 1) Der naheliegendste Ansatz: OK - Dialog im Resource-Editor nachbauen, entsprechendes Icon reinladen und Dialog entsprechend umgestalten. Dies bringt allerdings den Nachteil einer zusätzlichen Resource und sollte sich der Standard-Dialog einmal ändern, hat man immer noch seinen fix definierten Dialog 2) Statt als Resource würde sich der Dialog auch "on the fly" nachbauen. Raymond Chen beschreibt dies recht gut in seinem Blog. 3) Man nutzt die bestehende Dialogbox und baut sie nach seinen Wünschen um. Ich habe mich hier für Ansatz 3 entschieden, da er meines Erachtens nach die einfachste Möglichkeit darstellt und sicherstellt, dass immer die Standard-Dialogbox von Windows verwendet wird. Um also oben genannte Dialogbox zu realisieren, verwende ich einfach eine OK/Abbrechen ( MB_OKCANCEL ) Dialogbox. Diese hat bereits 2 Buttons und ich brauche somit eigentlich nur den Abbrechen-Button neu beschriften.Um dies zu erreichen, muss man einen WindowHook setzen, um in das System eingreifen zu können. Dies geschieht mittels der Funktion SetWindowsHookEx .Von allen möglichen Hook-Möglichkeiten nehmen wir hier den WH_CBT , da dieser am wenigsten Overhead generiert und unsere Hook-Procedure damit möglichst wenig oft in Anspruch nimmt (siehe auch CBTProc ).In der Hook-Procedure müssen wir darauf achten, immer mittels CallNextHookEx an den nächsten Haken weiterzugeben.Der Rest sollte dann ansich nur noch eine Formalität sein: SetDlgItemText ((HWND)wParam, IDCANCEL, pszText); Das funktioniert zwar soweit ganz gut, kann jedoch je nach Text und verwendeter Windows-Sprachversion schnell ins Auge gehen. Die Sache hat nämlich einen Haken: Die Größe der Buttons und deren Ausrichtung wird schon bei der Erstellung die Dialogbox kalkuliert und ist dementsprechend an den originalen Texten der Buttons ausgerichtet. Im Englischen ist der Text "Abort" z.B. denkbar kurz, sodass man keinen vernünftigen Text auf diesem Button unterbringt. Die einzige Abhilfe hier scheint zu sein, dass man die Buttons selbst nochmals neu ausrichtet. Zur Berechnung der Buttongröße kann man die Defaultgröße des verwendeten Fonts heranziehen. Das wäre: LOWORD(GetDialogBaseUnits()) Daraus lässt sich dann ungefähr eine Buttongröße berechnen. Sehr genau ist dies aber leider nicht, da der verwendete Font meistens keine gleichmäßige Zeichengröße besitzt. Dennoch geht es sich meistens mit der unten gezeigten Methode gut aus. Nach der Größenberechnung des 2. Buttons werden die beiden Knöpfe kurzerhand verschoben. Und das war's dann auch schon. Minutenlange Wartezeit beim Öffnen von Arbeitplatz
Ich habe mich heute zufällig an ein ganz interessantes Problem erinnert, welches sich vor 1 1/2 Monaten bei einem Kunden zugetragen hat:
Dieser hatte das Problem, dass er nach dem Doppelklick auf das "Arbeitsplatz" - Symbol in Windows etliche Minuten (!) warten musste, bis endlich die Laufwerke erschienen. Der Kunde berichtete außerdem, dass er das System schon mehrfach neu installiert hatte, das Problem aber immer wieder nach einiger Zeit von selbst auftrat. Also habe ich das Ereignisprotokoll seiner Windows-Installation durchforstet und bin dabei auf den Eintrag: "Der Server "{A1F4E726-8CF1-11D1-BF92-0060081ED811}" konnte innerhalb des angegebenen Zeitabschnitts mit DCOM nicht registriert werden." Also mal in der Registry geforscht, was sich hinter dieser CLSID verbirgt. Siehe da, es ist der WIA-Dienst. WIA steht für Windows Image Acquisition und ist der Windows-Bilderfassungsdienst. Stellt sich die Frage, warum gerade dieser Dienst sich anscheinend nicht mit DCOM registrieren kann. Nach einigem Herumsuchen im Internet konnte ich das Problem schließlich auf seinen Scanner zurückführen: Er besitzt einen Scanner von HP (Precision Scan, wenn ich mich jetzt richtig erinnere) und der Treiber dieses Scanners scheint die WIA teilweise zu blockieren, insbesondere, wenn der Scanner abgeschaltet ist. Der Grund, dass der Arbeitsplatz so lange blockiert ist, dass dieser normalerweise einen Ordner für "Scanner und Kameras" enthält, welcher wiederum vom WIA-Dienst abhängt. Nach einiger Suche im Internet habe ich dann schließlich doch noch die Problemlösung gefunden: Folgender Registry-Key gehört entfernt: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ Der Artikel, dem ich diese nützliche Information entnehmen konnte, ist hier zu finden (letzter Eintrag).
(Seite 1 von 1, insgesamt 10 Einträge)
|
SucheBlog abonnierenTop ReferrerVerwaltung des Blog |