
مُخطِّط PE بسيط يقوم بتحميل ملفات DLL مباشرة من الذاكرة ويستدعي واجهة إضافات نظيفة، دون الحاجة إلى LoadLibrary.
أداة تعيين PE انعكاسية بسيطة مع واجهة إضافات قابلة للتبديل الساخن لنظام Windows x64. تقوم بتعيين DLL مباشرة من مخزن بايتات في الذاكرة، وتحل صادراته، وتستدعي واجهة IPlugin نظيفة دون لمس LoadLibrary. كود مرافق لمنشور المدونة حول المحمّلات الانعكاسية ومعماريات الإضافات المعيارية.
اطلع على الشرح الكامل: 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
يقرأ الـ harness ملف 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) باستخدام HeapAlloc/placement new لتخصيص آمن عبر الوحدات مع CRT.
أضف CMakeLists.txt وسجّله في CMakeLists.txt الجذري باستخدام add_subdirectory().
لا يحتاج المضيف إلى معرفة ما تفعله وحدتك داخلياً. يقوم بالتعيين، والحل، والاستدعاء init -> execute -> cleanup، ثم يمضي قدماً.
تتعامل أداة التعيين مع الأساسيات وتتوقف عند ذلك عمداً:
إذا احتاجت أي وحدة إلى أي من هذه، فإما توسّع أداة التعيين أو ارفض الوحدة مبكراً بخطأ واضح. الدعم النصفي الصامت هو أسوأ نمط فشل.