PDA

Ver la Versión Completa : Problemas TDBGrid En DLL con 10.4...


blancasma
13-08-2020, 04:06:04
Buenas noches,

Espero que me puedan ayudar con un problema con el que llevo 2 semanas!!!

Tengo una aplicación la cual tiene varios DLLs y son llamados por un EXE en la versión 10.1 y todo funciona Excelente...

Pero ahora que estoy migrando a la 10.4 me ha salido un error bastante extraño a la hora de ejecución... he debugeado, eliminado componentes y he encerrado el error, pero no se como corregirlo... el problema es ¡¡¡¡¡ TDBGridColumns !!!!!

Ya cree una nueva aplicación con un DLL y en ésta he puesto el siguiente código:

void Proceso(void)
{
TColumn *colx;
TDBGridColumns *columX;
colx = columX->Items[0];
}

y agrego la DLL de forma estática al ejecutable.. ¡muy simple!... se compila y liga sin problemas...
pero al ejecutar la aplicación, mientras se cargan librerías aparece este problema:


Module Load: IMM32.dll. No Debug Info. Base Address: $767C0000. Process Project2.exe (3836)
Module Load: MSCTF.dll. No Debug Info. Base Address: $75BA0000. Process Project2.exe (3836)
Module Load: UxTheme.dll. No Debug Info. Base Address: $70CE0000. Process Project2.exe (3836)
Debug Output:
onecore\com\combase\objact\objact.cxx(826)\combase.dll!768B6819: (caller: 768B540B) ReturnHr(1) tid(211c) 800401F0 No se ha llamado a CoInitialize.

Process Project2.exe (3836)
First chance exception at $50CDB74D. Exception class $C0000005 with message 'access violation at 0x50cdb74d: read of address 0x00000000'. Process Project2.exe (3836)


y no continua con la ejecución ... es más nunca inicio

Debugeando un poco más me encuentro que el TDBGrid intenta cargar unas imagenes, pero al parecer no se ha inicializado algo que bota No se ha llamado a CoInitialize.

1.-No puedo llamar al CoInitialize porque aún no llega ni al WinMain (además debería ser responsabilidad de algún BPL)
2.-Pensé que faltaba algún BPL, los he agregado todos.
3.-He jugado con parametros de las opciones de compilación y ligado
4.-He agregado todos los componentes visuales que se me han ocurrido en el DLL (en un TForm) para 'forzar' a que se cargue la librería que hace falta
5.-He reinstalado de nuevo la versión 10.4 sobre un Win10 recién instalado sin ningún componente extra (Sin FastReport, etc)
6.-Tiene todos los parches que hasta hoy han salido de ésta versión.

Alguna idea?

De antemano gracias por leer :)

Saludos

Neftali [Germán.Estévez]
13-08-2020, 10:16:02
¿Has probado a llamar a CoInitialize en alguna de las inicializaciones dentro de la DLL?
Lo que habría que saber es quien o qué en la DLL necesita esa inicialización. ¿Seguro que es el TDBGrid?

Para estos casos creo que lo más recomentable es hacer un proyecto "mínimo" que genere el error. Y a partir de ahí intentar encontrar el error. DPR vacío (o casi) solo con la llamada a la DLL y el proyecto de la DLL con lo mínimo para que se genere.

blancasma
13-08-2020, 19:35:22
Gracias por responder German, te comento...


;538291']¿Has probado a llamar a CoInitialize en alguna de las inicializaciones dentro de la DLL?
Si, lo he puesto en el DllEntryPoint el CoInitialize, pero no llega nunca a ese punto... ya que se encuentra cargando aún las dependencias.


;538291'] Lo que habría que saber es quien o qué en la DLL necesita esa inicialización. ¿Seguro que es el TDBGrid?
Yo sospecho que es vcldb es el que necesita esa inicialización y no, no es TDBGrid sino cuando utilizo la propiedad de Columns (de TDBGridColumns) cuando se presenta el problema.


;538291'] Para estos casos creo que lo más recomentable es hacer un proyecto "mínimo" que genere el error. Y a partir de ahí intentar encontrar el error. DPR vacío (o casi) solo con la llamada a la DLL y el proyecto de la DLL con lo mínimo para que se genere.
Y es lo que hice, un DLL un unit con una función, el cual es llamado por un ejecutable con una forma y un boton para llamar a la función... y esta función es:


void Proceso(void)
{
TColumn *colx;
TDBGridColumns *columX;
colx = columX->Items[0];
}

El problema que genera todo este show es esta línea
colx = columX->Items[0];

La verdad, no le veo por donde...

blancasma
24-08-2020, 03:32:59
Ya descarte todo, excepto si es mi computadora...

Alguien que tenga Sydney puede probar este pequeño proyecto???

Tiene un ejecutable y llama a una forma, la cual solo tiene un TDBGrid.

Si les sale el mismo error que a mi, entonces para reportarlo.. sino, entonces tendré que formatear mi maquina :P

De nueva cuenta, gracias por la ayuda

blancasma
25-08-2020, 23:32:43
Reporte el caso a Embarcadero y tenía razón... es un bug de VCL, pongo la contestación del soporte...

This is a bug VCL, you can report bug on the Quality Portal, the bug will be public and you will receive notifications when it is fixed. I can report the issue internally but then you will not get any notifications.

You can resolve the problem in two ways..

1) delay load the DLL, so in the EXE project
Project | Options | Building | C++ Linker | Advanced | Delay load DLLs
2) add the name of the DLL in your example it is "Project1.dll" (without the quotes)
3) use a package rather than a DLL, a package is a DLL but with more type information. This is the best solution as it is not a good idea to have DLLs and EXEs that have packages, the reason is that DLLs will initialise unit differently to packages, and this can cause problems in some cases where a framework depends on a specific initialisation order.

And your application will run as expected.

The reason this problem is occurring is that a class constructor (for TDBNavigator) tries to load some bitmaps using COM based APIs this means it needs to have CoInitialize called BEFORE they can be used. Because the class constructors are called very early on in the DLL initialising, before any other code can be called at DLL load time, therefore CoInitialize cannot be called either by the EXE or any of the packages used, and hence the failure. So the VCL will have to be fixed.

Aplique lo que comenta y funciono, lo que sigue es reportarlo para su corrección y ver en que parche se libera.


Saludos