2010-09-29 10 views
12

¿Hay alguna manera de cargar dinámicamente y llamar dinámicamente funciones de D en D? Me gustaría que mi programa pueda cargar complementos al inicio y quizás también sobre la marcha.Cargando complementos (DLL) sobre la marcha

+0

Sí. Aquí hay una referencia rápida: http://www.digitalmars.com/d/2.0/dll.html –

+0

Eso es a lo que le tenía miedo ... básicamente estamos atrapados con el uso del método C para obtener la dirección del proceso y pasar de ahí. No es terrible, supongo, ya que puedo envolver todos mis objetos de complemento en una "fábrica maestra", pero no es óptimo. –

Respuesta

9

Depende de la dinámica que desee obtener. Si desea cargar dinámicamente un dll y ejecutar algunas funciones predefinidas, Wei Li tiene una envoltura muy bonita here. Gracias al poder de las plantillas, le permite hacer cosas como estas:

// 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); 

El código es D1. Para D2, debe reemplazar char[] con string, usar toStringz() y posiblemente eliminar scope. Editar:my D2 port de este código podría ser útil para que otros encuentren esta pregunta.

+0

Ojalá tuviera más puntos mod +1. Esto es exactamente lo que estaba buscando. ¡Gracias! –

+1

@Timothy: Me alegro de que haya ayudado. Para mí, el código es un buen ejemplo de cuánto puedes lograr con un par de líneas de código usando plantillas y mixins. Casi se siente como Python. – stephan

+0

Me doy cuenta de que esto tiene algunos meses, ¡pero muchas gracias por la actualización de D 2.0! ¡También me gustaría tener más votos para repartir! –

Cuestiones relacionadas