Ir al contenido


Foto

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


  • Por favor identifícate para responder
6 respuestas en este tema

#1 c0lo

c0lo

    Advanced Member

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

Escrito 30 abril 2011 - 08:31

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 mensajes
  • LocationLima-Peru

Escrito 30 abril 2011 - 11:25

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
  • 4.107 mensajes
  • LocationMadrid - España

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:
 


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.

Archivos adjuntos


  • 0

#4 c0lo

c0lo

    Advanced Member

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

Escrito 01 mayo 2011 - 08:00

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
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 mayo 2011 - 02:04

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 mensajes
  • LocationLima-Peru

Escrito 02 mayo 2011 - 06:40

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
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 mayo 2011 - 10:49

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.