Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Formularios en Dlls

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Formularios en Dlls Responder citando

Muy buenas, tropa.
Necesito urgentemente ayuda para compilar formularios MDIchild en dll y llamarlos desde un ejecutable MDI padre:

Tengo un MDI padre que es el exe. Compilo un Mdichild dentro de una dll con sus frames, y demás del VCL.

No consigo:
1º Instanciar el mdichild desde el ejecutable (Me dice que no hay ningún MDI padre)
2º Si lo hago con formularios SDI me dice "access violation of adress ..."
3º Funciona además como si se ejecutaran dos proyectos independientes.
4.º En otras ocasiones, con el enlace dinámico me dice el liker "unresolved external..." .
5º También produce, en uno de mis 3 millones de pruebas: invalid OMF record.
6º No encuentro tampoco ningún tipo de información sobre la metodología de programación de dll's.... quizá, por fin, tenga que ponerme a estudiar c++... o como se hacen las paellas y cambiar la profesión, xDDD;
_________________
Un saludo
Rayder


Ultima edición por rayder el Vie 18 Mar, 2005 9:51 am, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, lo que te recomiendo que hagas es que en la funcion del DLL le mandes como parametro la forma padre y a la hora de crear la hija, la pongas como parametro en el constructor para que sea la Owner de la forma Child, y para evitgar quer te lo tome como dos proyectos dikstintos, creo que eso se soluciona enviando tambien en Handle de la aplicacion al dll
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por responder.

Te comento, lo he puesto como me dices y funciona si los dos formularios son normales, sin ser Mdi. Me sale el mismo error, en cuanto los pongo como Mdi, me dice que el formulario hijo no se ha podico crear porque no encuentra un formulrio padre.

¿Alguna otra sugerencia?
_________________
Un saludo
Rayder
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Siento tener que insistir, pero me urge alguna opinión que me permita avanzar con mi proyecto, por lo que mando mi pregunta otra vez para arriba.
_________________
Un saludo
Rayder
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola... tal vez si nos pusieras un ejemplo de como la estas creando y como le estas pasando los parametros a la funcion en DLL te podamos ayudar mas facil, ya que yo lo intente aqui (pero sin DLL) y me ha funcionado bien....
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Existe una pagina en frances, que te indica la manera de hacer un TForm desde una DLL

te paso el link, para que lo cheques, ya que sin tener algo de codigo tuyo, es muy dificil, poder ayudarte..

http://lfe.developpez.com/DLL/#L1

y en esta otra, viene un codigo, para manejar, una DLL, como MDI, espero te sirva, puedes poner el codigo y la linea, donde te arroja, para que entre todos te podamos ayudar

http://bcbjournal.com/articles/vol2/9809/MDI_child_forms_in_a_DLL.htm

saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola.

Ante todo agradecer la molestia de responder y disulparme por la tardanza en contestar, ya que estoy muy liado.

Estoy revisando los enlaces que comentais y de momento me va bien, como entiendo que este es un tema que puede interesar a mucha gente, en cuanto lo tenga funcionando lo pongo en la sección de Tips & Tricks.

Nuevamente gracias a todos.
_________________
Un saludo
Rayder
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pues despues de una buena temporada esto sigue sin funcionar.
Lo que hago es lo siguiente, compilo una dll que contiene un formulario de tipo
Código:

 fsMDIChild


La dll solo contiene un formulario y un boton (es una prueba),
Unit1.cpp
Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "Unit2.h"  //lo incluyo manualmente

//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) __stdcall int LoadForm();

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
int __stdcall LoadForm()
{
    TForm2 *Form2;

    Form2 = new TForm2(NULL);
    Form2->ShowModal();
    delete Form2;
    return 1;
}
//---------------------------------------------------------------------------

Unit2.cpp (el formulario)
Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button1Click(TObject *Sender)
{
ShowMessage("Esto sale desde la dll");
}
//---------------------------------------------------------------------------

unit2.h
Código:

//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:   // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:   // User declarations
public:      // User declarations
        __fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif


Despues lo compilo e inicio un nuevo proyecto que sería donde pretendo llamar al formulario que contien la dll

Unit1.cpp
Código:


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

extern "C" __declspec(dllimport) __stdcall int LoadForm();

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int iRet;
    iRet = LoadForm();       
}
//---------------------------------------------------------------------------

Unit1.h
Código:

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:   // User declarations
public:      // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Añado el .lib de la dll al proyecto y copio la dll fisicamente al directorio del proyecto, compilo y todo parece que va bien.

Los dos formulario tiene un boton cada uno.
El formulario contenido en el proyecto es de tipo fsMDIForm.
El formulario contenido en la dll es de tipo fsMDIChild.

Al ejecutar el poyecto, me dice lo siguiente Exception EInvalidOperation in module Project1.dll at 0001BF65.

Si cambio el tipo de formulario a fsNormal en ambos formularios, todo funciona correctamente.

Haber si alguien me puede ayudar, ya que me correo algo de prisa y gracias anticipadas.
_________________
Un saludo
Rayder
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola,

Yo probaria a pasarle en la función LoadForm como parametro el manejador del formulario MDI padre.

Desde el proyecto MDI padre lo llamas asi:

Código:

LoadForm(this) ;


Y en la DLL de esta otra manera:

Código:

int __stdcall LoadForm(TComponent* Owner)
{
    TForm2 *Form2;

    Form2 = new TForm2(Owner);
    // Form2->ShowModal();  // no funciona en formularios MDI
    // delete Form2;
    return 1;
}


Pruebalo y ya nos comentaras.

saludos,
Volver arriba
Mensaje    Asunto: Responder citando

Gracias por contestar.

He provado lo que me comentas y el resultado es el mismo, sigo como al principio

Si le pongo
Código:
LoadForm(this)

ni compila. ¿Alguna otra sugerencia?

Gracias anticipada
_________________
Un saludo
Rayder
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola rayder, en el segundo enlace que te ha puesto más arriba Cesar tienes la solución:

http://bcbjournal.com/articles/vol2/9809/MDI_child_forms_in_a_DLL.htm
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola a todos.

Efectivamente, en la respuesta de cesar estaba la solución, al seguir el enlace desde el foro, no me funcionaba, pero el probrema estaba en mi pc.

Bueno, el caso es que ya tengo funcionando los formularios mdiChild desde dll. Como entiendo que esto es seguro que le interesará a mucha gente, estoy preparando un pequeño tutorial que espero que resuelva las dudas de mucha gente y que colgare en Tips & Tricks.

Nuevamente gracias a todos por la ayuda.
_________________
Un saludo
Rayder
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: pero no deberia funcionar Responder citando

Buenas Tardes.

el link de la Pagina que da Cesar explica como se puede hacer para crear dll y invocarlas de diferentes formas "Estatica y Dinamicica" ... la primera de estas formas "Estatica" es la que muestra el codigo de rayder asi esta el ejemplo de esta pagina donde esta error ... a mi se sale
[Linker Error] Unresolved external 'LoadForm' Referenced from c:\curso dll\UNIT1.OBJ..
si alguien quiere ver el codigo
http://www.geocities.com/c_a_soft/Curso.zip

Traduccion de la Pagina.
http://www.geocities.com/c_a_soft/hola.htm

saludos seth
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Re: pero no deberia funcionar Responder citando

SI LO COPIAS EN SU TOTALIDAD DEL EJEMPLO NO TE DARA DICHO ERROR.

SALUDOS

seth escribió:
Buenas Tardes.

el link de la Pagina que da Cesar explica como se puede hacer para crear dll y invocarlas de diferentes formas "Estatica y Dinamicica" ... la primera de estas formas "Estatica" es la que muestra el codigo de rayder asi esta el ejemplo de esta pagina donde esta error ... a mi se sale
[Linker Error] Unresolved external 'LoadForm' Referenced from c:\curso dll\UNIT1.OBJ..
si alguien quiere ver el codigo
http://www.geocities.com/c_a_soft/Curso.zip

Traduccion de la Pagina.
http://www.geocities.com/c_a_soft/hola.htm

saludos seth
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: SOLUCION MENSAJE ANTERIOR Responder citando

SI LO COPIAS EN SU TOTALIDAD DEL EJEMPLO NO TE DARA DICHO ERROR.

SALUDOS
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.