Results 1 to 9 of 9

Thread: CPas - C for Delphi

  1. #1

    CPas - C for Delphi


    What if you were able to load and use C99 sources directly from Delphi? There is a vast quantity of C libraries out there and being able to take advantage of them, without being a pain would be nice. You could even compile a bunch of sources and save them as a library file, then load them back in from disk, a resource or even from a stream. You can get the symbols, map to a C routine, and execute from the Delphi side all from a simple API.


    Releases - These are the official release versions.


    • Free for commercial use. See License agreement.
    • Allow C integration with Delphi at run-time.
    • Support Windows 64-bit platform.
    • Support for C99.
    • Fast run-time compilation.
    • Can run C sources directly or compile them to a library file (.LIB).
    • Library files can be loaded and used at run-time from a file, a resource or stream.
    • Import symbols directly from a dynamic linked library (.DLL) or module-definition (.DEF) file.
    • You can reference the symbols from Delphi and directly access their value (mapping to a routine and data).
    • Your application can dynamically or statically link to CPas.
    • Direct access to the vast quantity of C99 libraries inside Delphi.

    Minimum System Requirements

    • Delphi 10
    • Microsoft Windows 10, 64 bits
    • 10MB of free hard drive space

    How to use in Delphi

    • Unzip the archive to a desired location.
    • Add installdir\sources, folder to Delphi's library path so the CPas source files can be found for any project or for a specific project add to its search path.
    • Add installdir\bin, folder to Windows path so that CPas.dll file can be found for any project or place beside project executable.
    • See examples in installdir\examples for more information about usage.
    • You must include CPas.dll in your project distribution when dynamically linked to CPas. See CPAS_STATIC define in the CPas unit file.
    • See installdir\docs for documentation.

    NOTE: For your assurance and peace of mind, all official executables in the CPas distro that were created by us are code signed by tinyBigGAMES LLC.

    A Tour of CPas

    CPas API

    You access the easy-to-use API in Delphi from the CPas unit.

    {.$DEFINE CPAS_STATIC} //<-- define for static distribution
      { TCPas }
      TCPas = type Pointer;
      { TCPasOutput }
      TCPasOutput = (cpMemory, cpLib);
      { TCPasErrorMessageEvent }
      TCPasErrorEvent = procedure(aSender: Pointer; const aMsg: WideString);
    { Misc }
    function cpVersion: WideString;
    { State management }
    function  cpNew: TCPas;
    procedure cpFree(var aCPas: TCPas);
    procedure cpReset(aCPas: TCPas);
    { Error handling }
    procedure cpSetErrorHandler(aCPas: TCPas; aSender: Pointer; aHandler: TCPasErrorEvent);
    procedure cpGetErrorHandler(aCPas: TCPas; var aSender: Pointer; var aHandler: TCPasErrorEvent);
    { Preprocessing }
    procedure cpDefineSymbol(aCPas: TCPas; const aName: WideString; const aValue: WideString);
    procedure cpUndefineSymbol(aCPas: TCPas; const aName: WideString);
    function  cpAddIncludePath(aCPas: TCPas; const aPath: WideString): Boolean;
    function  cpAddLibraryPath(aCPas: TCPas; const aPath: WideString): Boolean;
    { Compiling }
    procedure cpSetOuput(aCPas: TCPas; aOutput: TCPasOutput);
    function  cpAddFile(aCPas: TCPas; const aFilename: WideString): Boolean;
    function  cpCompileString(aCPas: TCPas; const aBuffer: string): Boolean;
    procedure cpAddSymbol(aCPas: TCPas; const aName: WideString; aValue: Pointer);
    function  cpLoadLibFromFile(aCPas: TCPas; const aFilename: WideString): Boolean;
    function  cpLoadLibFromResource(aCPas: TCPas; const aResName: WideString): Boolean;
    function  cpLoadLibFromStream(aCPas: TCPas; aStream: TStream): Boolean;
    function  cpSaveLibToFile(aCPas: TCPas; const aFilename: WideString): Boolean; 
    function  cpLink(aCPas: TCPas): Boolean;
    function  cpRun(aCPas: TCPas): Boolean;
    function  cpGetSymbol(aCPas: TCPas; const aName: WideString): Pointer;
    { Stats }
    procedure cpStartStats(aCPas: TCPas);
    function  cpEndStats(aCPas: TCPas; aShow: Boolean): WideString;
    If you want CPas to be statically bound to your application, enable the {$CPAS_STATIC} define in the CPas unit.

    How to use

    A minimal implementation example:
      c: TCPas;
    // CPas error handler
    procedure ErrorHandler(aSender: Pointer; const aMsg: WideString);
      // create a CPas instance
      c := cpNew;
        // setup the error handler
        cpSetErrorHandler(c, nil, ErrorHandler);
        // add source file
        cpAddFile(cp, 'test1.c');
        // link and call main
        // destroy CPas instance
    See the examples for more information on usage.




    If this project has been useful to you, please consider sponsoring to help with its continued development. Thank You!

    ❤ Made in Delphi
    Last edited by drezgames; 08-03-2022 at 08:33 PM.

  2. #2
    Version 1.0.stable has been released.

  3. #3
    What are some libraries that work well with this, is there freepascal compatibility?
    This is my game project - Top Down City:

    My OpenAL audio wrapper with Intelligent Source Manager to use unlimited:

  4. #4
    Quote Originally Posted by JernejL View Post
    What are some libraries that work well with this, is there freepascal compatibility?
    Hi, yes, the DLL version will work with 64bit FPC in the upcoming update.

    Some libraries that I've tested so far include:

    • miniaudio
    • stb_image
    • stb_image_write
    • stb_truetype
    • stb_vorbis
    • enet
    • sfml

  5. #5
    Version 1.1.stable released! 😎

    • Added output_exe example
    • Added ouput_dll example
    • Added updated existing examples to use new/updates functions
    • Added cpSetExe, set the EXE subsystem type
    • Added cpGetExe, return the EXE subsystem type
    • Added cpGetOutput, return output type
    • Added TCPasExe (cpConsole, cpGUI) enum
    • Added cpAddLibrary
    • Added cpEXE, cpDLL to TCPasOutput enum
    • Renamed cpSaveLibToFile to cpSaveOutputFile
    • CPas can now output .LIB, .EXE and .DLL files
    • Renamed cpLink to cpRelocate
    • Patched CPas.pas to work with FreePascal (ppcx64)

  6. #6
    Version 1.2.stable released! 😯

    • Added updated existing examples to use new/updates functions
    • cpGetVersionInfo, get version information
    • cpSetVersionInfo, set version information
    • cpGetAddVersionInfo, get add version info
    • cpSetAddVersionInfo, set add version info
    • Added cpGetExeIcon, get EXE icon filename
    • Added cpSetExeIcon, set EXE icon filename
    • Miscellaneous enhancements

  7. #7
    Started a curated repo of compatible libraries for CPas. Pull requests welcome!
    Last edited by drezgames; 10-03-2022 at 04:21 AM.

  8. #8
    CPas v1.3.stable released.

    Big update, code refactor, win32 support and much more. Reworked all examples to support 32/64-bits and more.

    Reworked all examples to support 32/64-bits
    Update cpLoadLibFromResource to include an instance (THandle) parameter
    Added a runtime check to make sure CPas and CPas.Static are not used simultaneously
    FPC can now build static releases also
    Add CPas.Static unit now for static builds
    Reformated CHM help format
    Added cpCompile with project directives support
    Replaced cpLoadLibFromStream with cpLoadLibFromMemory
    Refactored codebase and added 32-bit support
    Updated cpAddLibrary to support (.LIB) files
    Updated cpSetVerionInfo to validate FileVersion as SemVer format (major.minor.patch)
    Miscellaneous fixes and enhancements

  9. #9
    I had a look at this project earlier and without testing it myself I think it really sounds impressive! - Unfortunately, it seems to be gone as the SDL2 repo. I would have really liked to try it out with FPC.


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts