I have started to write some documentation on the internal workings of GExperts. For now, it covers only a very small part of the IDE form enhancements that GExperts provides. It is meant mostly for myself to get an overview of that part of the tool which has grown too large to understand at a single glance. But it might also help if somebody wants to contribute to that part.
I just moved a Windows 8.1 installation in Virtual Box from one computer to another. When booting up, Windows told me:
This 64-bit application couldn’t load because your PC doesn’t have a 64-bit processor
The host computer is an Intel Xeon CPU which definitely is a 64 bit CPU (the previous computer was an older AMD 6 core CPU which was also 64 bit).
Oddly enough I could not find any solution on the interweb tubes (my Google fu seems to have weakened or maybe Google search isn’t as helpful as it used to be because it tries to guess what the user is searching for rather than simply searching for what he has typed).
It took me a while to figure out what the problem was: For some reason the virtual machine’s configuration had changed on the “General” -> “Basic” page from Version = “Windows 8.1 (64-bit)” to “Windows 7 (32-bit)”. Which apparently means that the CPU reported to the OS is a 32 bit CPU. Changing this back to the original value solved the problem.
Donations for GExperts keep coming in. It’s more a trickle than a flood but hey, I’m not in it for the money. And please remember that I prefer other kinds of contributions over money.
I have used that money in turn for donations to
- Pi-hole®: A black hole for Internet advertisements
- Rapid Environment Editor
- PDF Creator
(Yes, there is a donate link on the FileZilla SourceForge page but it doesn’t work.)
The method of changing the order of the TabSheets in a PageControl in Delphi is not obvious. Apparently there is no drag and drop support (at least not in Delphi 2007). You have to change the PageIndex property. So, if you want to insert a new page, add it and then change its PageIndex to the insert position.
I smell an opportunity for a new GExperts Expert. Any takers?
The issue was that a Macro Template
used on this code
// öäüß procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage('TEST'); end;
while TEST was selected
generated code like this
// öäüß procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(''); (TEST) end;
The reason again was improper use of positions and offsets into the editor buffer in conjunction with some Unicode characters above the code. So the insert position was calculated by 4 bytes too high, hence the macro code was inserted 4 characters behind the start of the original selection.
Note to self: Do not use a watch entry like this while debugging GExperts:
While this might seem very convenient it will sooner or later corrupt the current edit buffer or do something even worse, because, as a comment in ToolsApi states:
A IOTAEditReader should never be active at the same time as an IOTAEditWriter.
But having it as a disabled entry in the watch window, enable it to inspect the current content of the edit buffer, before disabling it again can be very useful.
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.
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.
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 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters] ; Enable NT-Domain compatibility mode ; Default: ; [value not present] ; "DomainCompatibilityMode"=- "DomainCompatibilityMode"=dword:00000001 ; Disable required DNS name resolution ; Default: ; [value not present] ; "DNSNameResolutionRequired"=- "DNSNameResolutionRequired"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters] ; 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 "RequireStrongKey"=dword:00000000
source: the answer from gigiga in the social.technet.microsoft.com forum.
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 [HKEY_CLASSES_ROOT\Folder\shell\GExpertsGrep] "Icon"="path\\to\\GExperts.dll" "MUIVerb"="GExperts Grep" [HKEY_CLASSES_ROOT\Folder\shell\GExpertsGrep\Command] @="\"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.