动态加载插件(DLL)

动态加载插件(DLL),d,D,是否有一种方法可以在D中动态加载和调用DLL中的函数?我希望我的程序能够在启动时加载插件,或者在运行中加载插件。这取决于您希望获得的动态效果。如果您想动态加载dll并运行一些预定义的函数,Wei Li提供了一个非常好的包装器。由于模板的强大功能,它允许您执行以下操作: // define functions alias Symbol!("MessageBoxW", int function(HWND, LPCWSTR, LPCWSTR, UINT)) mbw; alias Symbol!("Me

是否有一种方法可以在D中动态加载和调用DLL中的函数?我希望我的程序能够在启动时加载插件,或者在运行中加载插件。

这取决于您希望获得的动态效果。如果您想动态加载dll并运行一些预定义的函数,Wei Li提供了一个非常好的包装器。由于模板的强大功能,它允许您执行以下操作:

// define functions
alias Symbol!("MessageBoxW", int function(HWND, LPCWSTR, LPCWSTR, UINT)) mbw;
alias Symbol!("MessageBoxA", int function(HWND, LPCSTR, LPCSTR, UINT)) mba;
// load dll
auto dll = new Module!("User32.dll", mbw, mba);
// call functions
dll.MessageBoxW(null, "Hello! DLL! ", "Hello from MessageBoxW", MB_OK);
dll.MessageBoxA(null, "Hello! DLL! ", "Hello from MessageBoxA", MB_OK);

代码是D1。对于D2,您必须将
char[]
替换为
string
,使用
toStringz()编辑:此代码对其他人查找此问题可能有用。

是。这里有一个快速参考:这就是我所担心的…基本上,我们坚持使用C方法来获取proc地址并从那里开始。我想这并不可怕,因为我可以把我所有的插件对象包装成一个“主工厂”,但不是最优的。我希望我有更多的mod+1分。这正是我想要的。谢谢@提摩太:很高兴这有帮助。对我来说,这段代码是一个很好的例子,您可以通过使用模板和mixin的几行代码实现多少。我知道这已经有几个月的历史了,但是非常感谢D2.0的更新!我也希望我有更多的选票可以分发@马克:谢谢你提醒我,我必须修复这段代码的单元测试中的一个错误:-)。我将在周一回到办公室(在一个窗口前)时这样做。所以你可能想在周二回来看看。@stephan:谢谢你的提醒,我会的!我仍在尝试解决这个问题(不确定如何将字符串转换为LPC(W)STR),但它看起来非常有用!