--- /dev/null
+#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
\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
--- /dev/null
+#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
return handle;\r
}\r
\r
-\r
#define PLD(name) \\r
static PLD_LibHandle PLDH(void) { \\r
static PLD_LibHandle handle = NULL; \\r
\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