| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Mie 02 Mar, 2005 10:17 pm Asunto: Formularios en Dlls |
|
|
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 |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Jue 03 Mar, 2005 12:52 am Asunto: |
|
|
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 |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Vie 18 Mar, 2005 10:03 am Asunto: |
|
|
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 |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Lun 28 Mar, 2005 12:22 pm Asunto: |
|
|
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 |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Lun 28 Mar, 2005 5:42 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 29 Mar, 2005 6:42 am Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Mar 05 Abr, 2005 9:29 am Asunto: |
|
|
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 |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Mar 25 Oct, 2005 10:10 am Asunto: |
|
|
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
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 |
|
 |
Toni Invitado
|
Publicado: Mie 26 Oct, 2005 1:39 pm Asunto: |
|
|
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:
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 |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Jue 27 Oct, 2005 8:50 am Asunto: |
|
|
Gracias por contestar.
He provado lo que me comentas y el resultado es el mismo, sigo como al principio
Si le pongo
ni compila. ¿Alguna otra sugerencia?
Gracias anticipada _________________ Un saludo
Rayder |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
|
| Volver arriba |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Jue 03 Nov, 2005 7:54 am Asunto: |
|
|
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 |
|
 |
seth Cmdr

Registrado: 16 Nov 2003Mensajes: 129
|
Publicado: Mie 22 Nov, 2006 7:13 pm Asunto: pero no deberia funcionar |
|
|
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 |
|
 |
CRISVENUA2 Cdt

Registrado: 17 Abr 2007Mensajes: 3Ubicación: TUDELA
|
Publicado: Mar 17 Abr, 2007 5:53 pm Asunto: Re: pero no deberia funcionar |
|
|
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 |
|
 |
CRISVENUA2 Cdt

Registrado: 17 Abr 2007Mensajes: 3Ubicación: TUDELA
|
Publicado: Mar 17 Abr, 2007 5:55 pm Asunto: SOLUCION MENSAJE ANTERIOR |
|
|
SI LO COPIAS EN SU TOTALIDAD DEL EJEMPLO NO TE DARA DICHO ERROR.
SALUDOS |
|
| Volver arriba |
|
 |
|