
एक न्यूनतम PE मैपर जो DLLs को सीधे मेमोरी से लोड करता है और एक साफ़ प्लगइन इंटरफ़ेस में कॉल करता है, LoadLibrary की आवश्यकता नहीं।
Windows x64 के लिए एक न्यूनतम रिफ्लेक्टिव PE मैपर, जिसमें हॉट-स्वैपेबल प्लगइन इंटरफ़ेस है। यह मेमोरी में एक बाइट बफ़र से सीधे DLL को मैप करता है, उसके एक्सपोर्ट्स को रिज़ॉल्व करता है, और LoadLibrary को छुए बिना एक साफ़ IPlugin ABI में कॉल करता है। रिफ्लेक्टिव लोडर्स और मॉड्यूलर प्लगइन आर्किटेक्चर पर ब्लॉग पोस्ट के लिए सहयोगी कोड।
पूरा लेख देखें: Using Reflective Loaders to Replace LoadLibrary for Hot-Swappable Modules in C++
# Configure
cmake -B build
# Build
cmake --build build --config Release
# The build produces:
# build/Release/cmdplugin.dll (example plugin)
# build/Release/harness.exe (test harness)
# Map cmdplugin.dll from disk, run "dir C:\"
harness.exe cmdplugin.dll "dir C:\"
# Default: loads cmdplugin.dll, runs "whoami"
harness.exe
हार्नेस DLL को एक बाइट बफ़र में पढ़ता है, उसे रिफ्लेक्टिव लोडर से मैप करता है, प्लगइन एक्सपोर्ट्स को रिज़ॉल्व करता है, और IPlugin इंटरफ़ेस के माध्यम से कमांड को डिस्पैच करता है।
ReflectivePluginLoader/
├── CMakeLists.txt # Root build
├── Include/
│ ├── IPlugin.h # Plugin ABI (TaskApi, IPlugin, helpers)
│ └── ReflectiveLoaderEngine.h # PE mapper + export resolver
├── Modules/
│ └── CmdPlugin/
│ ├── cmdplugin.cpp # Example: command execution plugin
│ └── CMakeLists.txt
├── Testing/
│ ├── main.cpp # Test harness (loads DLL from file)
│ └── CMakeLists.txt
└── Tools/
└── file2hex.py # Convert a DLL to a C byte array
Modules/ के अंतर्गत एक नई डायरेक्टरी बनाएँ।IPlugin.h को इन्क्लूड करें और IPlugin इंटरफ़ेस को इम्प्लीमेंट करें:#include "IPlugin.h"
class MyPlugin : public IPlugin {
public:
void init() const override { /* setup */ }
void execute(TaskApi* task) const override { /* do work */ }
void cleanup() const override { /* teardown */ }
};
पाँच एक्सपोर्टेड फ़ंक्शन्स (create_plugin, destroy_plugin, plugin_init, plugin_exec, plugin_cleanup) को इम्प्लीमेंट करें, CRT-सुरक्षित क्रॉस-मॉड्यूल एलोकेशन के लिए HeapAlloc/placement new का उपयोग करते हुए।
एक CMakeLists.txt जोड़ें और इसे रूट CMakeLists.txt में add_subdirectory() के साथ रजिस्टर करें।
होस्ट को यह जानने की आवश्यकता नहीं है कि आपका मॉड्यूल आंतरिक रूप से क्या करता है। यह मैप करता है, रिज़ॉल्व करता है, init -> execute -> cleanup को कॉल करता है, और आगे बढ़ जाता है।
मैपर बुनियादी बातों को संभालता है और जानबूझकर वहीं रुक जाता है:
यदि किसी मॉड्यूल को इनमें से कोई भी चाहिए, तो या तो मैपर को बढ़ाएँ या मॉड्यूल को स्पष्ट त्रुटि के साथ जल्दी अस्वीकार करें। मौन अर्ध-समर्थन सबसे बुरा विफलता मोड है।