C++ Builder, Como hacer que una dll cargue un form?
#1
Escrito 30 abril 2011 - 08:31
"Form inside dll", es asi como intento buscar en la red pero referente a c++ builder o similare sy nada.. si alguien tiene un ejemplo que me brinde se le agradeceria mucho.
Gracias y Saludos. xD
#2
Escrito 30 abril 2011 - 11:25
Agrego la parte de mi dll basica que estoy empezando a realizar en C++ Builder.
#include <vcl.h> #include <windows.h> #include "FormMain.h" #pragma hdrstop #pragma argsused void ShowForm() { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { DWORD threadID; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ShowForm, NULL, 0, &threadID); return 1; }
Y cuando inyecto la dll compilada me salta este error
Es normal? o que hice mal? donde esta mi error. Gracias
#3
Escrito 30 abril 2011 - 04:35
Estas tratando de emular la como Builder inicia un Form de una Aplicación. No lo puedes hacer asi.
Un Form es un puntero a un TForm. Cuando lo creas dinámicamente, igual que en delphi, lo tienes que hacer explicitamente. En C++ para crear un puntero se usa el operador new. Esto provoca una llamada al constructor de la clase que usemos (puede haber varios).
Un ejemplo básico práctico:
void Init() { TForm1* Form1 = new TForm1(0); // Creamos el Form Form1->ShowModal(); // Lo mostramos Modal delete Form1; // Lo destruimos. } int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { switch (reason){ case DLL_PROCESS_ATTACH: Init(); break; case DLL_PROCESS_DETACH: break; } return 1; }
Adjunto un proyecto muy básico para que lo tomes como referencia.
Saludos.
Archivos adjuntos
#4
Escrito 01 mayo 2011 - 08:00
Ocurre que cuando inyecto normalmente con un metodo comun y corriente el proceso al cual inyecto se cuelga y el inyector igual, y el form de la dll o la dll normal... Porque?
Cual seria la solucion a dicho problema?
#5
Escrito 02 mayo 2011 - 02:04
Una dll mal construida puede colgar el proceso.
Deberás aislar el problema de tu método de inyección y de tu dll para poder darle una solución.
Saludos.
#6
Escrito 02 mayo 2011 - 06:40
#7
Escrito 02 mayo 2011 - 10:49
Si tratas de inyectar código 32 bits en un proceso de 64 bits, fallará. Quizás este sea tu caso.
Saludos.