The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,854 other subscribers

Archive for the ‘Delphi’ Category

“Unknown function at TMethodImplementationIntercept”

Posted by jpluimers on 2018/06/01

Reminder to self: when you get Unknown function at TMethodImplementationIntercept in a Delphi stack trace from the Exception.StackTrace property or FastMM memory report:

  1. Ensure you generate a .MAP or .TDS file with full debug information
  2. Copy the .MAP or .TDS files to directory of your EXE.

Via:

The Exception.StackTrace was introduced in Delphi 2009 that extended these [WayBackException Members:

Some notes:

  • Fields where you can put hooks in; if there is no hook in place, they won’t be used:
    • [WayBackException.GetExceptionStackInfoProc Field GetExceptionStackInfoProc: function (P: PExceptionRecord): Pointer;
      • This function is called to return an opaque data structure that contains stack information for the given exception information record. This function will be called when the exception is about to be raised or if this is an external exception such as an Access Violation, called soon after the object is created.
    • [WayBackException.CleanUpStackInfoProc Field CleanUpStackInfoProc: procedure (Info: Pointer);
      • This function is called when the destructor is called to clean up any data associated with the given opaque data structure.
    • [WayBackException.GetStackInfoStringProc Field GetStackInfoStringProc: function (Info: Pointer): string;
      • This function is called to return a string representation of the opaque data structure returned by GetExceptionStackInfoProc

TMethodImplementationIntercept was introduced in the System.Rtti unit of Delphi XE6 [WayBack]:

–jeroen

Example code:


unit ExceptionHelperUnit;
interface
uses
System.SysUtils;
type
ExceptionHelper = class helper for Exception
public
function Describe: string;
class procedure RaiseNotImplementedException(const aClass: TClass; const aMethodName: string);
class function GetStackTrace: string;
end;
implementation
uses
System.RTLConsts,
System.SysConst;
type
EStackTraceException = class(Exception); // EProgrammerNotFound to make it really clear this is only to be used in very limited places ??
{ ExceptionHelper }
function ExceptionHelper.Describe: string;
var
lStackTrace: string;
begin
Result := inherited ToString();
if Self is EInOutError then
if Result = System.RTLConsts.SInvalidFileName then
Result := System.SysConst.SInvalidFileName;
if Assigned(StackInfo) then
lStackTrace := StackTrace
else
lStackTrace := 'empty';
Result := Format('Exception'#13#10'%s at $%p: %s'#13#10'with StackTrace'#13#10'%s', [ClassName, ExceptAddr, Result, lStackTrace]);
end;
class function ExceptionHelper.GetStackTrace: string;
begin
try
Result := 'Get StackTrace via Exception.';
raise EStackTraceException.Create(Result) at ReturnAddress;
except
on E: EStackTraceException do
Result := E.StackTrace;
end;
end;
class procedure ExceptionHelper.RaiseNotImplementedException(const aClass: TClass; const aMethodName: string);
begin
raise ENotImplemented.CreateFmt('Method %s.%s is not implemented.', [aClass.ClassName, aMethodName]);
end;
end.

Posted in Delphi, Development, FastMM, Software Development | Leave a Comment »

Delphi needs a few more wizards – verify dpr against dproj and check both against files on disk

Posted by jpluimers on 2018/05/31

There are a few experts Delphi needs for project management:

  • verify the .dproj against the .dpr as these get out of sync often, especially in multi-person or multi-branch projects
  • verify .dproj and .dpr against files on disk (often there are files on disk not in the Project Manager; Visual Studio has this nice [WayBack“Show All Files” button that helps fixing this there)

via [WayBackIs there a way to export the file structure of a Project from the Project Manager view to a txt file? – John Kouraklis – Google+

Atilla Kovaks posted a small bash script to get started: [WayBackhttp://pisil.de/prfiles.sh.txt

–jeroen

Read the rest of this entry »

Posted in Delphi, Development, Software Development | 3 Comments »

Class Constructors/Destructors are special initialization/finalization sections – via Popping the hood. – Community Blogs – Embarcadero Community

Posted by jpluimers on 2018/05/30

I wasn’t sure what the order of class constructors/destructors was with respect to initialization/finalization sections. [WayBackClass Constructors. Popping the hood. – Community Blogs – Embarcadero Community explains that there is more to it than below summary, but it is a good start:

If a given class constructor is eligible to be invoked (ie. it was linked into your application), it will run immediately before the initialization section for the unit in which the class is implemented. The class destructors will be invoked immediately after the finalization section for the unit in which the class is implemented.

–jeroen

Posted in Delphi, Development, Software Development | Leave a Comment »

Via G+: I’m having some trouble with high DPI support and popup menus…

Posted by jpluimers on 2018/05/29

Hopefully Uwe Raabe will publish his VCL patches soon: [WayBack] I’m having some trouble with high DPI support and popup menus (using Delphi 10.2.3). Everything scales correctly except for the popup menus which still … – Dominic De Chasteigner Dumée – Google+

HiDPI with VCL still needs quite a bit of work, even on running one monitor (mixing regular DPI and HiDPI monitors will likely always be a pain for any pixel based environment)…

Note figuring out errors is not always easy, as Delphi 2009 introduced the System.TMonitor record for thread synchronisation, next to the existing Forms.TMonitor class that had monitor settings.

Related:

–jeroen

Posted in Delphi, Development, Software Development | Leave a Comment »

Use DelphiAST – via TPersistent.com » Blog Archive » The Parsing Problem

Posted by jpluimers on 2018/05/29

Stefan Glienke Says:

FWIW DelphiAST is the most up to date parser for Delphi (at least that is open source) because Roman Yankovsky is fixing bugs in a timely manner and is using it for his own plugin (FixInsight) that needs to parse all kinds of source code. It is also derived from the Castalia parser but many fixes and changes have been applied since.

In addition, TestInsight (by Stefan Glienke) also uses DelphiAST and Stefan is quite well at bugging people fixing bugs in open source projects.

DelphiAST works from Delphi XE and up (parts might work in Delphi 2010 and 2009), so ancient Delphi is out.

--jeroen

via: [WayBackTPersistent.com » Blog Archive » The Parsing Problem

Posted in Castalia, Delphi, Development, Software Development | Leave a Comment »

Indy Sockets and getting a description on the connection depends on the direction

Posted by jpluimers on 2018/05/29

From my Indy gitter archive:

@jpluimers
From a TIdIOHandlerSocket or TIdSocketHandle: is it possible to see who has initiated the connection? i.e. if it’s Binding.Peer that initiated to Binding.IP or the other way around?

@rlebeau
A socket is bidirectional, it doesn’t know or care which direction the connection was initially established. You will have to keep track of that yourself based on whether the socket is coming from a client component or a server component.

@jpluimers
I was afraid so. No problem: thanks for confirming.

So I made a helper class for TIdSocketHandle that gets you a SummaryString based on a direction enumeration: TIdSocketHandleHelper.

Notes:

–jeroen

Read the rest of this entry »

Posted in Delphi, Development, Indy, Software Development | Leave a Comment »

Fixing the WSDLImp command-line Delphi WSDL importer to parse WSDL files including XSD files using xsd:group at the top level

Posted by jpluimers on 2018/05/24

I finally found out the cause of the Delphi WSDL Importer generating wrong .pas files when the WSDL file includes an XSD file that uses an xsd:group (see below) at the top-level.

The resulting access violation was caused by forgetting a nil check for a Context (at the top-level it is nil because there is no encompassing type yet; xsd:group can be at the top-level).

There might also be other WSDL/XSD constructs leading to the same code path: a good set of WSDL/XSD combination would be needed for proper integration testing on this. Hopefully, Embarcadero has such a set.

Patches

All patches are at https://gist.github.com/jpluimers/2824c03ae816229a53ffa4830b2d6208. If you need a binary build that includes the patches, drop a comment below.

Before fixing, I had to get it building which required modifying the search path and output path (both see Delphi WSDL importer compiler defines). This is the first patch below (which results includes a huge .dproj change as that’s what the IDE does to a project when you change just a few simple things).

The second patch below is the fix.

The fix is to replace if (TypeDef.IsAnonymous) then by if (TypeDef.IsAnonymous) and Assigned(Context) then in side the function TWSDLTypeImporter.AddComplexType of WSDLImpWriter.pas.

After careful checking of the group handling (around etElementGroup, cmGroupRef,  xtiElemGroupIXMLElementGroup, IXMLElementGroups), no other fixes are needed as the rest of the xsd:group handling functions correctly at least for the WSDL/XSD combinations I had to import.

During fixing, I found some compiler defines would produce much more output. That output tremendously helped finding out if xsd:group handling was indeed correct.

In the third patch, I have added another modification that introduces a new -logall command-line parameter that enables all these in one go.

I have handed over the patches through internal channels in order to circumvent a long and tedious QC/QualityPortal process. Hopefully they will make it in the next major Delphi version.

Related

Patches generated by following the steps in [WayBack] Generate a git patch for a specific commit – Stack Overflow:

git format-patch -1 <<commit-SHA>>

Command-line parameters

The WSDLImp has many command-line parameters, some of which are not accessible from the IDE expert. More information on these at:

xsd:group

An xsd:group contains a group of definitions. It is similar to a list of fields in a record/class/interface in Delphi that you can use in multiple record/class/interface definitions. The group only has a name at the XSD level, but not at the Delphi generated code level: there the group is expanded in each place it is used.

More information: [WayBack] xsd – How to use the xml schema group element – Stack Overflow

–jeroen

Read the rest of this entry »

Posted in Conference Topics, Conferences, Delphi, Development, Event, Software Development | 12 Comments »

Indy repo URLs and nightly builds

Posted by jpluimers on 2018/05/24

For my link archive:

Password embedded Indy SVN repository URLs

Based on [WayBack] Indy Subversion Source Access

This might come in handy: [WayBackCreating a two way sync between a Github repository and Subversion – Ben Lobaugh Online

Nightly Indy builds

Via [WayBack] Indy DevSnapshot and https://gitter.im/IndySockets/Indy

–jeroen

Posted in Delphi, Development, Indy, Software Development | 2 Comments »

Getting the new MMX from Raabe Software to work when installing it as separate Administrative user

Posted by jpluimers on 2018/05/24

I have a policy to install software with a separate Administrative user, but develop with a normal non-Administrative user.

For some software, this creates problems, either because it cannot cope while running as a non-UAC user, or because they write their configuration (either on disk or in the registry) to the user that installed the software as opposed to:

  • write the configuration as a template to a generic place (like %ProgramData% or HKLM) then
  • apply that template when a user first runs the software

ModelMaker Code Explorer does the latter, of which I earlier wrote about in Fixing Unable to create ModelMaker Tools Shared Directory and Cannot create file “C:\HungarianTypeLookup.txt”. Access is denied..

Uwe Rabbe (who now maintains MMX) will fix this, but until then, you either will see no MMX menu entry at all, or get errors like the ones below.

Others have ran into them as well, so hopefully these steps will provide a fix for them as well, see

I think the best fix is for the installer to detect if it is being run as regular user or administrator, then decide upon those where to write in the registry. I’m not sure though how other Delphi experts handle this, so I am open on input from other parties.

Steps below are based on

No MMX in the Delphi menu at all

This likely means MMX is not registered in the registry for the current user.

Read the rest of this entry »

Posted in Delphi, Development, ModelMaker Code Explorer, Software Development | 3 Comments »

MMX – speed up your Delphi development, now maintained by Raabe Software

Posted by jpluimers on 2018/05/23

New home [WayBackMMX – speed up your Delphi development

Old home [WayBack] ModelMaker Tools

Thanks a lot to Gerrit Beuze for al the efforts and insights while he created and maintained MMX for such a long time

Thanks a lot to Uwe Raabe for taking over the maintenance and providing the binaries for free.

I have posted links to some archived site pages below, just in case anybody needs them (when QC went off-line after a while the Google Search failed to show search results for this; hopefully this will keep some of the information retrievable).

As a follow up to:

–jeroen

Archived links (in semi-random order) hopefully they survive the shutdown of the links:

Read the rest of this entry »

Posted in Delphi, Development, Diagram, History, ModelMaker Code Explorer, Software Development, UML | 2 Comments »