]> localhost Git - pldh.git/commitdiff
Load functions lazily
authormisomosi <[email protected]>
Tue, 7 May 2024 05:48:38 +0000 (01:48 -0400)
committermisomosi <[email protected]>
Tue, 7 May 2024 05:48:38 +0000 (01:48 -0400)
examples/multipld.c [new file with mode: 0644]
examples/writefile.c
examples/writefile.cpp [new file with mode: 0644]
pld.h

diff --git a/examples/multipld.c b/examples/multipld.c
new file mode 100644 (file)
index 0000000..d0850a7
--- /dev/null
@@ -0,0 +1,19 @@
+#include "../pld.h"\r
+\r
+#define PLDH k32\r
+PLD("KERNEL32.DLL");\r
+static DWORD MyWriteFile(void)\r
+{\r
+       DWORD dummy;\r
+       PFN(h, WriteFile);\r
+       return h(GetStdHandle(STD_OUTPUT_HANDLE), "Hello World!\n", 13, &dummy, NULL);\r
+}\r
+#undef PLDH\r
+#define PLDH u32\r
+PLD("USER32.DLL");\r
+\r
+int main(void) {\r
+       MyWriteFile();\r
+       PFN(MessageBoxA)(NULL, "Hello!", "Hello!", MB_OK);\r
+       return 0;\r
+}\r
index 5f6e4b3eb59d774cf7df8df1fb69da7e52722300..6134773f0dc1d630abcca1de8528e0d03acfc147 100644 (file)
@@ -2,7 +2,8 @@
 \r
 PLD("KERNEL32.DLL")\r
 int main(void) {\r
+       PFN(h, WriteFile);\r
        DWORD dummy;\r
-       PFN(WriteFile)(GetStdHandle(STD_OUTPUT_HANDLE), "Hello World!\n", 13, &dummy, NULL);\r
+       h(GetStdHandle(STD_OUTPUT_HANDLE), "Hello World!\n", 13, &dummy, NULL);\r
        return 0;\r
 }\r
diff --git a/examples/writefile.cpp b/examples/writefile.cpp
new file mode 100644 (file)
index 0000000..2b92926
--- /dev/null
@@ -0,0 +1,8 @@
+#include "../pld.h"\r
+\r
+PLD("KERNEL32.DLL")\r
+int main(void) {\r
+       DWORD dummy;\r
+       PFNFIND(WriteFile)(GetStdHandle(STD_OUTPUT_HANDLE), "Hello World!\n", 13, &dummy, NULL);\r
+       return 0;\r
+}\r
diff --git a/pld.h b/pld.h
index 706865327b78e9c5e920c50e8aeebfae51b3abde..d0d1db927c0d5d032fd7a22713f2d6937047bdb6 100644 (file)
--- a/pld.h
+++ b/pld.h
@@ -199,7 +199,6 @@ static PLD_LibHandle PLD_Private_dlopen_wrapper(const char *name)
        return handle;\r
 }\r
 \r
-\r
 #define PLD(name) \\r
        static PLD_LibHandle PLDH(void) { \\r
                static PLD_LibHandle handle = NULL; \\r
@@ -209,7 +208,13 @@ static PLD_LibHandle PLD_Private_dlopen_wrapper(const char *name)
 \r
 // For importing by ordinal on Windows or just using\r
 // another name in a library for whatever reason\r
-#define PFNALT(name, alt) ((PLDTYPEOF(&name))PLD_Private_dlsym_wrapper(PLDH(), alt))\r
-#define PFN(name) PFNALT(name, #name)\r
+#define PFNALTFIND(name, alt) ((PLDTYPEOF(&name))PLD_Private_dlsym_wrapper(PLDH(), alt))\r
+#define PFNFIND(name) PFNALTFIND(name, #name)\r
+\r
+// Lazily load functions\r
+#define PFNALT(h, name, alt)  \\r
+       static PLDTYPEOF(&name) h = NULL; \\r
+       if (h == NULL) h = PFNALTFIND(name, alt)\r
+#define PFN(h, name) PFNALT(h, name, #name)\r
 \r
 #endif // COOL_PLD_H\r