Jump to content


Photo

C++ Builder, Como hacer que una dll cargue un form?


  • Please log in to reply
6 replies to this topic

#1 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 30 April 2011 - 08:31 AM

Bueno disculpen esta pequeña preguntita pero es que hasta el momento no logro hacer esto, no logro que mi form este en la dll o cargue la ventana si carga de ahi me sale problemas de excepsiones los cuales mi no entender...

"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

  • 0

#2 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 30 April 2011 - 11:25 AM

Agrego la parte de mi dll basica que estoy empezando a realizar en C++ Builder.


cpp
  1. #include <vcl.h>
  2. #include <windows.h>
  3. #include "FormMain.h"
  4.  
  5. #pragma hdrstop
  6. #pragma argsused 
  7.  
  8. void ShowForm()
  9. {
  10.     Application->Initialize();
  11.     Application->CreateForm(__classid(TForm1), &Form1);
  12.     Application->Run();
  13. }
  14.  
  15. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
  16. {
  17.     DWORD threadID;
  18.     CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ShowForm, NULL, 0, &threadID);
  19.     return 1;
  20. }


Y cuando inyecto la dll compilada me salta este error
 

2011-04-30_122817.png

Es normal? o que hice mal? donde esta mi error. Gracias
 


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 30 April 2011 - 04:35 PM

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:
 


cpp
  1. void Init()
  2. {
  3.   TForm1* Form1 = new TForm1(0);  // Creamos el Form
  4.   Form1->ShowModal();            // Lo mostramos Modal
  5.   delete Form1;                  // Lo destruimos.
  6. }
  7.  
  8. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
  9. {
  10.   switch (reason){
  11.     case DLL_PROCESS_ATTACH:
  12.       Init();
  13.       break;
  14.     case DLL_PROCESS_DETACH:
  15.       break;
  16.   }
  17.   return 1;
  18. }

Adjunto un proyecto muy básico para que lo tomes como referencia.


Saludos.

Attached Files


  • 0

#4 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 01 May 2011 - 08:00 PM

Si ps teneis toda la razon, pero encontre un detalle que no me cuadra o nose si mi metodo no es el correcto para inyectar la dll construida o hecha de esta manera.

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?
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 02 May 2011 - 02:04 AM

El problema que tienes es independiente de que la dll contenga un formulario o no, en otras palabras, si la dll está bien construida se cargará bien en cualquier proceso.

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.
  • 0

#6 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 02 May 2011 - 06:40 AM

Pero cual seria el metodo de inyeccion correcto para este tipo de dlls? Ya que e inyectando la dll que tu haz construido con mi inyector normal e igual y use un inyector acp mediante drivers e igual es el mismo error?
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 02 May 2011 - 10:49 AM

Pues yo he realizado una prueba con CreateRemoteThread y me inyecta sin problemas.

Si tratas de inyectar código 32 bits en un proceso de 64 bits, fallará. Quizás este sea tu caso.


Saludos.
  • 0




IP.Board spam blocked by CleanTalk.