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

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Vie 28 Nov, 2008 2:57 pm Asunto: mi dll no funciona ¿porque? dejo codigo |
|
|
Codigo de mi dll:
| Código: |
#include <vcl>
#include <windows>
#include <IdBaseComponent>
#include <IdComponent>
#include <IdSNTP>
#include <IdUDPBase>
#include <IdUDPClient>
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) double __stdcall getsntp(char * host)
{
TIdSNTP *sntp;
sntp->Host = host;
return (double)sntp->DateTime;
}
|
Mi objetivo es crear una dll con la que puedo consultar la hora en internet.
Al compilar todo bien, al principio, pero cuando lo puse en modo release y le quito los packages y el dynamic rtl, me salta el siguiente error:
| Código: |
[ILINK32 Error] Error: Unresolved external '__fastcall Idsntp::TIdSNTP::GetDateTime()' referenced from C:\DOCUMENTS AND SETTINGS\HUGO\ESCRITORIO\SNTPDLL\RELEASE\FILE1.OBJ
|
Asi que para que no me salte el error dejo en build with runtime packages indyProtocols , que no se porque en los ejecutables .exe funciona sin package, pero en la dll no. Evidentemente no quiero cargar con mas fichero que mi dll.
Estoy utilizando builder 2007 para hacer la dll, que es la unica version que he econtrado en que el indy sntp me funciona bien, asi lo tengo en una dll compilado que es el objetivo y lo puedo usar con cualquier version de builder.
En el codigo del ejecutable:
| Código: |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
typedef float (__stdcall *PFuncion)(char*);
PFuncion f;
HINSTANCE hLib = LoadLibrary("thsntp.dll"); //thsntp.dll
if (hLib)
{
f = reinterpret_cast<PFuncion>(GetProcAddress(hLib, "getSntp"));
// Comprobamos si no se ha cargado
if (!f)
throw Exception("No se pudo cargar la function");
// Probamos la funcion
TDateTime x = f("hora.uvigo.es");
ShowMessage(x.DateTimeString());
FreeLibrary(hLib);
}
} |
El problema es que hLib vale cero siempre, mi archivo se llama thsntp.dll, todas minusculas.
Ayuda pls.
Si alguien tiene alguna sugerencia de como crear un activex que se pueda usar para esto mismo u otra opcion que lo diga, mi primera opcion fue hacer un ejecutable que le pasas como parametro el serivdor de hora y te copia en el portapapeles la hora, pero me gustaria usar la dll u otra opcion valida.
GRACIAS. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 30 Nov, 2008 8:48 am Asunto: |
|
|
Te faltaría enlazar la librería Indy. En mi caso en el BCB6+Indy9:
| Código: | // ...a continuación del código generado por el IDE:
#include <IdSNTP.hpp>
#include <memory>
#pragma link "indy60.lib" // <--------
extern "C" __declspec(dllexport) double __stdcall getSntp(char* host)
{
std::auto_ptr<TIdSNTP> sntp(new TIdSNTP(0));
sntp->Host = host;
return (double)sntp->DateTime;
} |
En el caso de la versión 2007 tendrías que mirar en el subdirectorio donde lo tengas instalado "...\lib\release" y mirar ahí los archivos ".lib" que empiecen por "Indy..." y añadirlos como en el ejemplo de arriba.
De todas formas si quieres, en el siguiente enlace ya tienes la dll compilada. Para usarla solo tienes que poner el código que has puesto más arriba del botón:
http://telefonica.net/web/ljfg/temp/sntp_dll.zip |
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Lun 01 Dic, 2008 9:29 am Asunto: |
|
|
Muchas gracias leo, la verdad no sabia para que servia el pragma link, muy currado, gracias por dejarme la dll, aun asi voy a probar lo que me dices, 1000 millones de gracias.
¿Serias tan amable de explicarme esta linea?
std::auto_ptr<TIdSNTP> sntp(new TIdSNTP(0));
yo cuando se sale de lo normal y clasico me pierdo, no se que significa auto_ptr ni los "<>" y bueno supongo que std es un namespace o algo asi, si no tienes tiempo ya me buscaré yo la informacion, gracias. ¿pero donde declaras sntp? y porque no vale...
| Código: |
TIdSNTP *sntp;
sntp = new (TIdSNTP(0));// por cierto fallo garrafal que no tenia creada la instancia
sntp->Host = host;
|
De todas maneras me dan distintos errores:
#pragma link "Indy.lib" // unresolved external... (que desaparece este error al añadir una de las 2 siguientes lineas o las 2)
#pragma link "IndyCore.lib" //error no se encuentra idsyswin32.obj
#pragma link "IndyProtocols.lib" //idsysvcl.obj //este ultimo pragma creo q es el que me interesa.
Tu dll me funciona perfectamente, de todas maneras me gustaria conseguir hacer funcionar la mia, gracias. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 01 Dic, 2008 11:05 pm Asunto: |
|
|
| ZHAX1 escribió: | ¿Serias tan amable de explicarme esta linea?
std::auto_ptr<TIdSNTP> sntp(new TIdSNTP(0)); |
auto_ptr nos permite crear un puntero "inteligente" que nos asegura que cuando salgamos el ámbito actual (o sea la función) destruirá el puntero. En cualquier referencia actual de C++ encontraras más detalles..
Podrías hacerlo así, sin auto_ptr:
| Código: | extern "C" __declspec(dllexport) double __stdcall getSntp(char* host)
{
TIdSNTP* sntp = new TIdSNTP(0);
sntp->Host = host;
double ret = sntp->DateTime;
delete sntp;
return ret;
} |
pero si ocurriese una excepción antes de llegar al "delete" no se llegaría a liberar la memoria..
| ZHAX1 escribió: | | y bueno supongo que std es un namespace |
En efecto, "std" es el namespace principal que corresponde a la librería estándar de C++.
| ZHAX1 escribió: | De todas maneras me dan distintos errores:
#pragma link "Indy.lib" // unresolved external... (que desaparece este error al añadir una de las 2 siguientes lineas o las 2) |
No tengo la versión 2007, pero por si te da alguna pista, en la versión 2009 (que ya se que no te sirve por el error en TIdSNTP) he tenido que poner lo siguiente:
| Código: | #pragma link "IndyCore.lib"
#pragma link "IndySystem.lib"
#pragma link "IndyProtocols.lib" |
|
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Mar 02 Dic, 2008 9:21 am Asunto: |
|
|
| Pues si, efectivamente usando esas librerias a funcionado, odio los unresolved external, algunos son muy complicados de resolver. |
|
| 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.
|