 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Pugile Ens

Registrado: 26 Dic 2006Mensajes: 29Ubicación: Mexico
|
Publicado: Lun 05 Sep, 2011 3:44 am Asunto: Problemas con DLL, ADO, DBExpress y Visual C++ |
|
|
Hola que tal. Estoy trabajando con ADO en Builder C++ XE y creé una DLL para que sea consumida por un programa de Visual C++ 2010. El problema que tengo es que al momento de usar la DLL (que hice en Builder) en Visual C++ marca un error de memoria.
La DLL la cargo dinámicamente y no tengo problemas al llamar a las funciones. El problema es que en la DLL instancio un Objeto ADO y al parecer Visual C++ no lo quiere instanciar. El código de la DLL es este:
| Código: |
#include <vcl>
#include <windows>
#pragma hdrstop
#include <ADODB>
#include <DB>
#define BAD_ALLOC -1
#define BAD_CONNECTION -2
#define BAD_QUERYEXECUTE -3
#pragma argsused
TADOQuery *Query;
TADOConnection *Connector;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) short __stdcall ConnectDB(wstring ConnectionString)
{
try {
Connector = new TADOConnection(false); // Visual C++ no instancia la clase ADO, siempre se ejecuta el Catch retornando BAD_ALLOC.
} catch (bad_alloc &) { return BAD_ALLOC; }
Connector->LoginPrompt = False;
Connector->ConnectionString = ConnectionString.c_str();
Connector->DefaultDatabase = DTInfo.DataBase.c_str();
try {
Connector->Connected = true;
}
catch (EADOError *e) { return BAD_CONNECTION; }
return 0;
}
//---------------------------------------------------------------------------
|
La DLL la probé con otra aplicación hecha en Builder C++ y funciona perfectamente. Visual C++ de plano no quiere instanciar la clase ADO. También lo probé con QT y sucede lo mismo que con Visual C++.
Si alguien sabe cuál puede ser el problema se lo agradeceré eternamente.
Información agregada recientemente:
Ahora estoy intentando crear la DLL con DBExpress y surge el siguiente problema:
Al igual que con ADO tengo bloques try catch. Tengo un elemento de la clase TSQLConnection y lo instancio sin problemas. Al momento de establecer la conexión tengo lo siguiente:
| Código: |
try {
dbConn->Open();
} catch (Dbxcommon::TDBXError* Error) {
wprintf(L"%s",Error->Message.c_str());
return 0;
}
|
Aquí se genera una excepción y se me indica lo siguiente:
| Cita: | | DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, or of the wrong version. |
Esto solo sucede cuando intento utilizar la DLL con visual C++. Si la uso con Builder no tengo ningún problema.
Entonces por tanto, todos mis problemas se presentan al intentar usar la DLL que tiene elementos DBExpress o ADO con Visual C++.
Si alguien con experiencia en el uso de DLLs creadas con builder y consumidas por Visual C++, tiene idea de como resolver estos problemas, le pido por favor me indique la forma de hacerlo. Ya sea para ADO, DBExpress o ambos.
Gracias.
Ultima edición por Pugile el Mar 06 Sep, 2011 8:49 pm, editado 1 vez |
|
| Volver arriba |
|
 |
Bitman Lt

Registrado: 30 Mar 2004Mensajes: 80
|
Publicado: Lun 05 Sep, 2011 12:56 pm Asunto: |
|
|
Hola,
has probado desde una aplicacion hecha en BCC haber si funciona?
Al compilar la DLL te has asegurado que linke todo lo necesario? Prueba a quitar la opcion en linker (use dinamic rtl) y packages (build with runtime packages)
Saludos, |
|
| Volver arriba |
|
 |
Pugile Ens

Registrado: 26 Dic 2006Mensajes: 29Ubicación: Mexico
|
Publicado: Lun 05 Sep, 2011 5:28 pm Asunto: |
|
|
Hola, gracias Bitman por tu respuesta. Efectivamente la DLL ya la probé con una aplicación hecha en Builder C++ y funciona perfectamente. El problema se presenta al usarla con Visual C++.
Al compilar la DLL no hay problemas de linkado. La opción: No usar dynamic RTL y los Packages ya están configurados.
Es muy raro este problema, pues solo se presenta con la clase TADO. Utilizo un también un elemento TIdHTTP y con dicho elemento no tengo problemas. Al elemento TIdHTTP si se crea la instancia sin problemas.
Repito el problema se presenta con TADO y sus derivados (TADOConnection, TADOQuery ...). No se instancian. |
|
| Volver arriba |
|
 |
Pugile Ens

Registrado: 26 Dic 2006Mensajes: 29Ubicación: Mexico
|
Publicado: Mar 06 Sep, 2011 9:20 pm Asunto: |
|
|
Que tal, hola a todos.
Después de buscar un buen rato he dado con la solución para poder utilizar la DLL creada con Builder C++ en Visual C++.
De momento he resuelto el problema con dbExpress. Falta encontrar el problema con ADO (seguiré buscando para encontrar una solución).
El problema con dbExpress radica en que según leí, se utilizan capas OLE/COM. Al parecer RadStudio 2010 y XE No efectúan el llamado a:
| Código: | CoInitializeEx(NULL, COINIT_MULTITHREADED); |
La solución es efectuar el llamado, antes de activar la conexión con la base de datos. Así:
| Código: |
try {
CoInitializeEx(NULL, COINIT_MULTITHREADED);
dbConn->Open();
} catch (Dbxcommon::TDBXError* Error) {
wprintf(L"%s",Error->Message.c_str());
return 0;
}
|
Solo me queda decir, que según leía; en versiones anteriores de Builder sea necesario agregar la siguiente línea en la siguiente ruta:
Ruta:
| Cita: | | Project->Settings-> Pestaña C++ ->Preprocessor definitions |
Agregar:
Gracias a aquellos que intentaron solucionar el problema y seguiré buscando para solucionar el problema con ADO. En cuanto lo resuelva lo publicare (Si alguien lo resuelve antes, bienvenido). |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|