Skip to content

rjalarvo/CPas

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LMEngine

Chat on Discord Twitter Follow

CPas

Static C Libraries for Delphi

Current list of static C libraries available. More will be added by myself and hopfully other people in the community. If you wish to contribute, submit a PR. Follow the project format in this repo.

Name Latest Version Category Description
Print 1.0.0 Console Print colored text to the console
SQLite 3.46.0 Database Local SQL database library

Overview Utilizing C code in Delphi app

From Delphi 12.1 onwards compiled C code can be incorporated into Delphi EXE without the need to use or include a DLL.

In short

  1. Including the .o file from C++ Builder {$L Unit1.o}.
  2. Exposing all the calls the C code relies on, and referencing them in Delphi (long list already exists, figuring out more is easy). See CPas.CRuntime unit.
  3. Defining Delphi headers for the actual C routines in the .o file.

Explanation

  • The trick is to build a CRuntime unit to reference all the missing functions the C code needs.
  • C++ Builder's Win64 Modern platform is Clang based and links against the UCRT runtime, making a dll/exe in C, with TDUMP to show all the C runtime routines it references.
  • It is ‘trivial’ to add to the CRuntime unit and build up a unit of routines in Delphi.
  • Since Win64 Modern platform links only to the dynamic UCRT, only the routine address is needed, not a proper definition. i.e. procedure wprintf; external ucrt; is enough since the host app does not need to call it directly. As long as the code in the .o can reference wprintf, it will compile.

Instructions

  • Compile the project C++ builder, take the .o file and add it to the Delphi wrapper unit {$L Unit1.o}, with reference to CRuntime unit.
  • Any C library that one would normally have to use via a .dll, can be attempted to be compiled in C++Builder Win64 Modern, and if so, then it's likely possible to statically link that into Delphi without having a DLL.

For example:

  1. Compile sqlite3.c and take the sqlite3.o.
  2. In the uses section add CRuntime unit, used by the C runtime routines.
  3. In a sqlite3 unit, declare all the routines inside sqlite3.o.
  4. Add {$L sqlite3.o} in the implementation section.
  5. Add this sqlite3 unit to your project and compile.

sqlite3 C lib is now statically linked inside your Delphi EXE.

Prerequisites and other notes

  • RAD Studio 12.1 or higher.
  • __chkstk_ms is needed, which is located not in api-ms-win-crt-stdio-l1-1-0.dll but in kernalbase.dll and it is not named chkstk_ms inside that DLL, but only as chkstk, while the code inside the .o file references it as __chkstk_ms and is solved by procedure _chkstk_ms; stdcall; external kernelbase name 'chkstk';. This has been added to CPas.CRuntime unit.
  • All these things must be "visible" in Delphi in order for the project to compile.

Expanding

  • May work with other clang based compilers, but using C++ Builder to compile the C sources will work best with Delphi.
  • Adding more references:
Imports from api-ms-win-crt-convert-l1-1-0.dll:
_strtod_l
_strtoi64_l
_strtoui64_l
atof
atoi
atol
mbrtowc
mbsrtowcs
strtof
strtol
strtoll
strtoul
strtoull
wcrtomb
wcrtomb_s
  • Take all those references and go to ChatGPT and say: “Create a Delphi unit called CRuntime and export these routines from api-ms-win-crt-stdio-l1-1-0.dll define as a const ucrt:” and paste the above references. => ChatGPT will generate a CRuntime unit.
  • If for example wprintf in UCRT complain that _wprintf is not found, an underscore prefix will help, it’s a c linkage thing.
  • Target 64 bit
  • CPas.CRuntime unit exists in the repo, just add any new references to it.

Support Support

Our development motto:

  • We will not release products that are buggy, incomplete, adding new features over not fixing underlying issues.
  • We will strive to fix issues found with our products in a timely manner.
  • We will maintain an attitude of quality over quantity for our products.
  • We will establish a great rapport with users/customers, with communication, transparency and respect, always encouraging feedback to help shape the direction of our products.
  • We will be decent, fair, remain humble and committed to the craft.

Links Links

License License

LMEngine is a community-driven project created by tinyBigGAMES LLC.

BSD-3-Clause license - Core developers:

Acknowledgments Acknowledgments

LMEngine couldn't have been built without the help of wonderful people and great software already available from the community. Thank you!

People

  • John Claw
  • Robert Jalarvo

Contributors

About

Static C Libraries for Delphi

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 98.8%
  • Pascal 1.1%
  • Other 0.1%