即时加载插件(DLL)

时间:2010-09-29 01:45:01

标签: d

有没有办法在D中动态加载和动态调用DLL中的函数?我希望我的程序能够在启动时加载插件,也许还可以在运行中加载插件。

1 个答案:

答案 0 :(得分:10)

这取决于你想要的动态。如果你想动态加载一个dll并运行一些预定义的函数,那么Wei Li here就有了一个非常好的包装器。由于模板的强大功能,它允许您执行以下操作:

// 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()并可能删除scope编辑: my D2 port此代码可能对其他人发现此问题很有用。