Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
libraries:machine_code:mcl [2023-12-17 02:27] – [AutoHotkey v1] Add example "Import DLL with Headers" geek | libraries:machine_code:mcl [2023-12-17 03:08] (current) – Fix broken markup geek | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== MCL [v1][v2] ====== | ====== MCL [v1][v2] ====== | ||
- | |||
- | A new kind of machine code library for AutoHotkey. | ||
THIS IS ALPHA SOFTWARE | THIS IS ALPHA SOFTWARE | ||
- | Currently only supports | + | MCL is a new kind of machine code library for AutoHotkey, which takes a no-nonsense approach to converting compiled code to AutoHotkey embedded machine code. It requires a GCC-based cross-compiler installed under PATH (named as gcc.exe/%%g++%%.exe or x86_64-w64-mingw32-gcc.exe/ |
+ | |||
+ | It was designed to work with mingw-w64 installed via [[https:// | ||
+ | |||
+ | Once your C or %%C++%% code has been compiled to a standalone function or class, that standalone class will have no dependency back to MCL. Scripts using your compiled code will need to include //just// the compiled code, and nothing else. You can check the releases of [[libraries: | ||
+ | |||
+ | MCL has a few extra features compared to other machine code tools, the big ones being: | ||
+ | |||
+ | * Support for both C and %%C++%% | ||
+ | * Includes some basic hand-written replacements for some of the most common standard headers | ||
+ | * Support for both 32 and 64 bit | ||
+ | * Allows very large constants (and Doubles, which GCC tends to promote to being a global constant, breaking code under other tools) | ||
+ | * Allows exporting one or more functions to AutoHotkey | ||
+ | * Allows exporting one or more global variables to AutoHotkey | ||
+ | * Generates a wrapper with all the DllCalls/ | ||
+ | * Allows importing functions from external DLLs into the C/%%C++%% code, such as from the Windows API or any other DLL you have laying around | ||
+ | * Generates standalone AutoHotkey code with the compiled machine code and wrappers, so you can include compiled code without including the MCL library. | ||
+ | |||
+ | Altogether, MCL has just enough features that a solid subset of standard C code can be compiled under it, and run (more or less) fine. | ||
+ | |||
+ | The primary goal of MCL is to enable much more complex machine code functions/ | ||
+ | |||
+ | MCL also supports a tiny subset of %%C++%% (no STL, exceptions, or RTTI). For example, see [[https:// | ||
+ | |||
+ | MCL also adds the ability for code to " | ||
+ | |||
+ | And a (low level) warning for this feature: There is a bug with mingw-w64 compilers which results in the stack being misaligned, which will cause a crash the next time a Windows API (or standard library) function is called from your C/%%C++%%. This bug can be tracked [[https:// | ||
+ | |||
+ | For an example of " | ||
+ | |||
+ | ---- | ||
- | Requires a gcc-based Windows %%C/C++%% compiler (for example, mingw-w64). MSVC is not supported. | + | If you have any questions about the library, please feel free to join [[https:// |
If you run into any problems, please report them as GitHub issues. | If you run into any problems, please report them as GitHub issues. | ||
Line 56: | Line 84: | ||
In AHK, MCL provides all functionality through the '' | In AHK, MCL provides all functionality through the '' | ||
- | Any method which is described as " | + | Any method which is described as " |
Now, for the API: | Now, for the API: | ||
Line 67: | Line 95: | ||
For any method which takes an '' | For any method which takes an '' | ||
- | * '' | + | * '' |
* '' | * '' | ||
* '' | * '' | ||
Line 409: | Line 437: | ||
MsgBox % FileOpen(" | MsgBox % FileOpen(" | ||
</ | </ | ||
+ | <tabbox AutoHotkey v2> | ||
+ | <runner ahk2> | ||
+ | #Include <MCL> | ||
+ | |||
+ | lib := MCL.FromC(" | ||
+ | ( | ||
+ | #include < | ||
+ | #include < | ||
+ | MCL_EXPORT(Call, | ||
+ | void Call(int value) { | ||
+ | FILE* f = fopen(" | ||
+ | |||
+ | fputs(" | ||
+ | fprintf(f, "The number is: %i\n", value); | ||
+ | |||
+ | fclose(f); | ||
+ | } | ||
+ | |||
+ | )") | ||
+ | |||
+ | lib(2931) | ||
+ | MsgBox FileRead(" | ||
+ | </ | ||
+ | </ | ||
==== Import DLL with Headers (Lua) ==== | ==== Import DLL with Headers (Lua) ==== | ||
Line 458: | Line 510: | ||
lib.close() | lib.close() | ||
</ | </ | ||
- | |||
- | <tabbox AutoHotkey v2> | ||
- | <runner ahk2> | ||
- | #Include <MCL> | ||
- | |||
- | lib := MCL.FromC(" | ||
- | ( | ||
- | #include < | ||
- | #include < | ||
- | MCL_EXPORT(Call, | ||
- | void Call(int value) { | ||
- | FILE* f = fopen(" | ||
- | |||
- | fputs(" | ||
- | fprintf(f, "The number is: %i\n", value); | ||
- | |||
- | fclose(f); | ||
- | } | ||
- | |||
- | )") | ||
- | |||
- | lib(2931) | ||
- | MsgBox FileRead(" | ||
- | </ | ||
- | </ |