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 

mi dll no funciona ¿porque? dejo codigo

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: mi dll no funciona ¿porque? dejo codigo Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pues si, efectivamente usando esas librerias a funcionado, odio los unresolved external, algunos son muy complicados de resolver.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
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.