Jul 022017

dzFeedReader started as a proof of concept, but became actually a usable tool. So, why not make a release available to others?

There you go:
dzFeedReader 1.0.0 is available from SourceForge.

dzFeedReader is a program that can display rss feeds from websites in RSS 1.0, RSS 2.0 and Atom 1.0 format. Its UI is similar to that of Netvibes. It started as a Delphi program but I recently switched it to Lazarus just to see whether that development environment has become any better. Turned out Lazarus is quite usable nowadays.

Jul 012017

Since it became rather cumbersome to find the information on my Delphi IDE Explorer expert, which was scattered through multiple blog posts, I have now added a static page for it to my blog which I will keep up to date whenever I change anything in the expert. The sourceforge page now also points to this new page.

Jun 262017

Note to self: If adding a Windows 8.1 computer to a SAMBA domain fails with the error “The specified domain either does not exist or could not be contacted” the following changes to the Registry might help:

Windows Registry Editor Version 5.00

; Enable NT-Domain compatibility mode
; Default:
; [value not present]
; "DomainCompatibilityMode"=-

; Disable required DNS name resolution
; Default:
; [value not present]
; "DNSNameResolutionRequired"=-

; Disable requirement of signed communication
; My Samba (3.0.33) works with signed communication enabled, so no need to disable it.
; Default:
; "RequireSignOrSeal"=dword:00000001
; Disable the usage of strong keys
; Default:
; "RequireStrongKey"=dword:00000001

source: the answer from gigiga in the social.technet.microsoft.com forum.

Jun 182017

GExperts so far comes with a special stand alone executable GExpertsGrep that does nothing else but load the GExperts dll and call the entry point ShowGrep. Having this additional executable isn’t really necessary because Windows already comes with a tool that does exactly that: Load a DLL and call an entry point: rundll32.exe

rundll32 path\to\your.dll,EntryPoint additional parameters go here

In order for a dll to be called in this manner it needs to export an entry point with the following definition:

procedure EntryPoint(_HWnd: HWND; _HInstance: HINST; _CmdLine: PAnsiChar; CmdShow: integer); stdcall;

Note that the calling convention must be stdcall otherwise bad things happen.

Since Windows NT (so for all modern versions of Windows) there are two additional ways to declare the entry point:

procedure EntryPointA(_HWnd: HWND; _HInstance: HINST; _CmdLine: PAnsiChar; CmdShow: integer); stdcall;
procedure EntryPointW(_HWnd: HWND; _HInstance: HINST; _CmdLine: PWideChar; CmdShow: integer); stdcall;

Note that EntryPoint and EntryPointA are still assumed to have a PAnsiChar parameter, while EntryPointW is assumed to have a PWideChar parameter. A Dll only needs to export one of these entry points.

If RunDll32 is called with “EntryPoint”, it will look for “EntryPointW” first, “EntryPointA” second and “EntryPoint” last. Note that you don’t have to specify the “A” or “W” suffix, it is automatically added by RunDll32.

For a change, we even have an advantage when writing the DLL in Delphi rather than in MS Visual C++: Delphi does not do any name mangling, so the entry point will be called exactly what you write in the source code.

So, assuming the GExperts DLL exports the following procedure:

procedure ShowGrepEx(_HWnd: HWND; _HInstance: HINST; _CmdLine: PAnsiChar; CmdShow: integer); stdcall;

RunDll32 could be called like this:

rundll32 path\to\GExperts.dll,ShowGrepEx Some\Directory\here

The DLL would take the _CmdLine parameter, use it as the base directory for a directory search and show you the dialog as above. Pretty cool, eh?

We could even go a step further and write the following to the registry to add an entry to the context menu of each folder in Windows Explorer.

Windows Registry Editor Version 5.00

"MUIVerb"="GExperts Grep"

@="\"c:\\windows\\system32\\rundll32.exe\" path\\to\\GExperts.dll,ShowGrepEx %1"

(Note: Don’t just copy that to a .reg file! You need to replace both instances of “path\\to\\GExperts.dll” with the actual absolute path to your GExperts DLL. And don’t forget that the current release does not even export the entry point ShowGrepEx at all.)

And this is what you’d get:

Unfortunately there is a drawback: RunDll32 must be given the correct path and file name of the DLL to load. That’s fine if you only have one GExperts version installed. The current GExpertsGrep stand alone executable searches for the first GExperts DLL in descending order, so it will always load the one for the latest Delphi version it can find. So I am not sure whether I want to drop the stand alone executable in favor of RunDLL32 right now.

Jun 142017

Various people have reported an error message regarding rtl240.bpl not being found when calling the stand alone version of GExperts Grep. I could never reproduce it but my recent insight on SaveLoadLibrary now also solved that one:

The stand alone version of GExperts Grep tries to load any GExperts dll, regardless which version. The idea being that I don’t have to maintain multiple versions of the executable just to load the dll which does all the work anyway. So it tries to load the dlls in descending order, starting with the latest Delphi 10.1 (Berlin) one (I added 10.2 yesterday). But since GExperts is an IDE expert and therefore needs to use the rtl and various other packages, it of course requires them even if it is being used stand alone. And if you for whatever reason have GExperts installed for a Delphi version which you don’t have installed (or for which the packages are not in the search path), it fails to load and the error dialog described in the linked article was displayed.

It no longer does, thanks to David Heffernan’s hint.

There is no new release yet, not sure when I will have one ready.

Jun 132017

Note to self: Do not call SafeLoadLibrary simply as a replacement for LoadLibrary. It has a second parameter witch is used to call SetErrorMode. That parameter is optional and defaults to SEM_NOOPENFILEERRORBOX which is NOT always what you want. E.g. if the DLL you are loading depends on other DLLs which cannot be loaded, you will get a system error dialog like this one:

(My question on StackOverflow)

This might not be what you want if you are loading a DLL dynamically and want to show your own error message if it fails.

So you might want to pass a second parameter, e.g.

  Res := SafeLoadLibrary('dllname.dll', SEM_FAILCRITICALERRORS);

There might, however be a reason to call SafeLoadLibrary instead of LoadLibrary. It safes and restores the FPU Control Word. Some DLLs change it in DllMain which might cause your program to misbehave if it isn’t restored.

I remember spending days tracking down such a problem in the late 1990ies so I made it a habit calling SafeLoadLibrary rather than LoadLibrary.

On the other hand that could also happen in any other call into the DLL. So maybe it is time to revise that habit.

Jun 112017

Es wird gerne die Behauptung aufgestellt, dass es, wenn man alle Kosten mit einbezieht, teuerer sei mit dem Auto zu fahren als mit der Bahn und öffentlichen Verkehrsmitteln.

Da ich kein Auto besitze, sollte das auf mich ganz besonders zutreffen, denn ich muss mir ja jedes Mal einen Mietwagen nehmen. Trotzdem ist meine Erfahrung, dass diese Behauptung nicht stimmt. Zumindest dann, wenn man mit mehr als einer Person unterwegs ist.

Dazu ein aktuelles Beispiel (Nur das letzte von vielen, die ich schon vorher durchgerechent hatte):

Zwei Personen, von Essen nach Schaprode (auf Rügen) und dann weiter nach Hiddensee und zurück.

(Map provided by Google Maps)

Mit der Bahn:
Man fährt von Essen über Dortmund (Umsteigen) nach Bergen auf Rügen mit dem Zug. Von dort mit dem Bus nach Schaprode und dann mit dem Schiff weiter nach Hiddensee. Insgesamt muss man also dreimal umsteigen und jedes Mal besteht die Gefahr, dass man die Anschlußverbindung nicht erreicht.

Zurück geht es wieder mit dem Schiff von Hiddensee nach Schaprode, mit dem Bus nach Bergen und dann mit der Bahn über Hamburg Haarburg (Umsteigen) zurück nach Essen. Erneut muss man dreimal umsteigen.

Eine Person hat eine Bahncard 50, die andere nicht. Sitzplatzreservierung für beide Richtungen ist bei dieser Strecke wichtig.

Gesamtkosten: 424 Euro


Wie schon geschrieben, habe ich kein eigenes Auto und lege die alltäglichen Strecken dem Fahrrad zurück. Spart Geld und hält wenigstens halbwegs fit. Außerdem spart man sich die nervige Parkplatzsuche.

Mietwagen miete ich immer von Europcar. Das ist zwar vielleicht nicht das günstigste Angebot, aber die Verleihstation ist 10 Minuten zu Fuß von meiner Wohnung entfernt. (Und zumindest Sixt ist teurer.)

Mietwagen der kleinsten Kategorie für eine Woche, dazu Sprit für 1400 km bei einem großzügig geschätzten Verbrauch von 8l/100km und 1,50 Euro pro Liter. Das Auto steht dann in Schaprode auf einem gebührenflichtigen Parkplatz für 2,50 Euro pro Tag rum und wir fahren wie oben mit dem Schiff nach Hiddensee.

Gesamtkosten: 429 Euro

Alternativ hätte ich auch zweimal Einwegmiete nach Bergen nehmen können und statt des Parkplatzes den Bus bezahlen können. Preislich wäre das egal, aber nochmal unbequemer. Also dann lieber bequem.

Wenn ich jetzt statt des Mietwagens einen eigenen PKW hätte, also die 198 Euro für die Woche Miete sparen würde, käme ich nochmals günstiger weg. Das Auto kostet sowieso Geld, auch wenn ich mit dem Zug fahre, also darf ich diese Unterhaltskosten nicht aufrechnen.

Gesamtfahrzeit tut sich auch nicht viel.

Und das ist wohlgemerkt inklusive Mietwagen! Auch beim Spritverbrauch und -preis habe ich großzügig aufgerundet (aktuell hier in Essen: ca. 1,30 pro Liter Super E5).

Kein Wunder, dass keiner mit der Bahn fährt, der sowieso einen PKW hat. Und wenn dann noch Kinder dazu kommen, ist der PKW eindeutig billiger.

Die Aussage, dass es günstiger ist mit der Bahn zu fahren als mit einem Mietwagen stimmt schlichtweg nicht. Zumindest nicht signifikant. Und wenn es schon für einen Mietwagen nicht stimmt, dann stimmt es für den eigenen PKW schon mal gar nicht.

Wenn jemand glaubt mir meinen Denkfehler / Rechenfehler nachweisen zu können, kann er gerne einen Kommentar im zugehörigen Post auf Goggle+ oder Twitter hinterlassen.

Jun 032017

The Delphi Open Tools API introduced Debug Visualizers with Delphi 2010, so people stuck with a pre-Unicode Delphi IDE can not use them. Until now that is.

An answer on StackOverflow by MartynA provided me with a starting point, but I used a different approach because I didn’t like how getting the value overwrote the clipboard.

Here is what it looks like

Please note that these experts are not very well tested. You use them at your own risk. As any IDE expert they are quite capable of crashing the IDE and making you lose your work.

Also, for now, I won’t provide source code for them. I haven’t yet decided whether I want to make them yet another open source project or maybe a commercial product.

This ZIP file contains three experts, one for Delphi 2005, 2006 and 2007 respectively that allow you display a watch window entry formatted as Date/Time inline or as multi line text in a separate window.

%d bloggers like this: