Howto create C-Header for Delphi/Free Pascal/Lazarus DLL – data types – Stack Overflow
Posted by jpluimers on 2021/09/23
From a long time ago, but got a request for it a while ago is [WayBack/Archive.is] Howto create C-Header for Delphi/Free Pascal/Lazarus DLL – data types – Stack Overflow:
I have used the below construct to generate header files compatible with the C-mode compiler of Visual C++ 6 from Delphi 5 code when Delphi had the -JPH switch (see notes below).Note that I have not used this since Delphi 5, but the switch has since then been expanded:Somewhere along the line, the [WayBack] JPHNE switch has been added to thedcc32
command-line compiler:-JPHNE = Generate C++ .obj file, .hpp file, in namespace, export all
Rudy Velthuis has a [WayBack] nice article using the JPHNE switch.It certainly does not handle all types, and you will need quite a bit of [Archive.is] HPPEMIT and [Archive.is] EXTERNALSYM directives.I uploaded my [Archive.is] Delphi 5 to Visual C++ 6 HPP conversion from back then to BitBucket.It generates the .hpp files to import the DLL that was written in Delphi.Notes from the Delphi 5 era:{ Visual C++ 6 does not like nested structs/unions the way that BC++ can handle them. Visual C++ 6 requires the "typedef" to be present AND the typename AFTER the struct definition. You will see this when defining TConversationId, TReturnKey and other types that depend on nested structs/unions The trick is to perform these steps each and every time this unit changes: - Generate this unit once with all the EXTERNALSYM disabled. - Then the DCC32 -JPH will generate the basic structs for them. - Copy all the nested struct and union definitions to this file - Embed the definitions with (*$HPPEMIT '' *) - Append the typename at the end of the struct definition - Enable all the EXTERNALSYM again - Regenerate the HPP files by using DCC32 -JPH To make this process easier, we have introduced two new conditional defines: - BCB - disable EXTERNALSYM, disable HPPEMIT - VC6 - enable EXTERNALSYM, enable HPPEMIT A similar thing is with these constructions that VC6 does not like those either: - short strings (BCB defines them as "SmallString<##>" which VC6 does not like). - short integers (BCB defines them as "Shortint" so we have included an HPPEMIT for that) } {$ifdef win32} { important! Makes sure that the all enumerated types fit in exactly one byte each! } {$Z1} { force the C/C++ HPP header files to have the C/C++ compiler pack structure elements on byte boundaries } {$ifdef BCB} {$HPPEMIT '#pragma option push -a1' } {$endif BCB} {$endif win32}
And the download (hopefully I have converted it to git by then):
The link to the converter is now [Archive.is] bitbucket.org/jeroenp/wiert.me/src/default/Native/… – Delphi Coder
–jeroen
Leave a comment