2010-09-29 3 views
12

Есть ли способ динамически загружать и вызывать функции из DLL динамически в D? Я хочу, чтобы моя программа могла загружать плагины при запуске и, возможно, «на лету».Загрузка плагинов (DLL) на лету

+0

Да. Вот краткая ссылка: http://www.digitalmars.com/d/2.0/dll.html –

+0

Вот чего я боялся ... в основном мы застряли с использованием метода C получения адреса проса и перехода от там. Не страшно, я полагаю, так как я могу обернуть все мои объекты плагина в «мастер-фабрику», но не оптимально. –

ответ

9

Это зависит от динамичности, которую вы хотите получить. Если вы хотите динамически загружать 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 этого кода могут быть полезными другим лицам, которые могут найти этот вопрос.

+0

Хотелось бы, чтобы у меня было больше модов +1 очков. Это именно то, что я искал. Благодаря! –

+1

@ Тимоти: Рад, что это помогло. Для меня код - хороший пример того, насколько вы можете достичь с помощью пары строк кода с использованием шаблонов и микшинов. Это почти похоже на Python. – stephan

+0

Я понимаю, что это несколько месяцев, но спасибо за тонну за обновление D 2.0! Я также хочу, чтобы у меня было больше рук, чтобы раздавать! –

Смежные вопросы