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 

Problema de Herencia

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema de Herencia Responder citando

Hola comunidad, bien explico de rápido, intento usar el evento OnReply del Componente TIdcmpClient , por lo que he realizado una clase de la siguiente manera.

Archivo.h
Código:

#include <IdIcmpClient.hpp>
#ifndef ccsgPingH
#define ccsgPingH
class DELPHICLASS TccsgPing;
class PASCALIMPLEMENTATION TccsgPing : public TIdIcmpClient
{
private:
public:
   #pragma option push -w-inl
   inline __fastcall virtual ~TccsgPing(void) { }
   inline __fastcall virtual TccsgPing(Classes::TComponent* AOwner);
   #pragma option pop
   void __fastcall OnReply(TComponent *ASender,const TReplyStatus &AReplyStatus);
public:
   void __fastcall Probar(String ccsgAddressIp, int ccsgPort);
   bool Exito;
};
extern PACKAGE TccsgPing *ccsgPing;
//---------------------------------------------------------------------------
#endif


Archivo.cpp
Código:

//---------------------------------------------------------------------------
#pragma hdrstop
#include <vcl.h>
#include "ccsgPing.h"
#include <IdIcmpClient.hpp>
//---------------------------------------------------------------------------
void __fastcall TccsgPing::Probar(String ccsgAddressIp, int ccsgPort)
{
   this->Host = ccsgAddressIp;
   this->Port = ccsgPort;
   this->ReceiveTimeout = 3000;
   this->IPVersion = ::Id_IPv4;
   this->Ping("ccsgPinger",0);

}
//---------------------------------------------------------------------------
void __fastcall TccsgPing::OnReply(TComponent *ASender,const TReplyStatus &AReplyStatus)
{
   if(AReplyStatus.BytesReceived > 0)
   {
      this->Exito = true;
   }
   else
   {
      this->Exito = false;
   }
}
//---------------------------------------------------------------------------
#pragma package(smart_init)


y la forma de usarlo es dentro de otro archivo aclarando que dadas las condiciones de la programación no requiero el componete padre sea visible (TIdcmpClient) pues donde voy a usar dicho componente es en una librería que solo tiene funciones y nada de la VCL, aún cuando dentro del archivo.cpp la ponga por aquello que deba usarla mas adelante.

El código que uso para generar el objeto de la clase que estoy heredando viene dado de la siguiente manera.
Código:

      std::auto_ptr<TccsgPing> test( new TccsgPing(0));
      test->Probar(ccIP,55123);
      ShowMessage((int)test->Exito);


Creo que es entendible lo que quiero realizar, intento usar el componente de la paleta INDY Ver 9.0 por que requiero hacer un ping pasando la dirección del Host como una direccion Web y no como una direccion IP, indicándo también el puerto de conexion

ccIP: es la direccion que puede ser "www.hola.com", el puerto y dentro del evento Probar, uso el método Ping heredado para poder usar el evento OnReply.

El problema está en que me ha estado marcando los siguientes errores de Linkeado y no he podido dar con la solución.

Cita:
[ILINK32 Error] Error: Unresolved external 'TccsgPing::' referenced from D:\CESAR.SALAZAR\DOCUMENTOS\ARCHIVOS.PROGRAMACION\ARCHIVOS.CBUILDER\SISTEMA...\DEBUG_BUILD\CCSGBASEDATOS.OBJ
[ILINK32 Error] Error: Unresolved external '__fastcall TccsgPing::TccsgPing(Classes::TComponent *)' referenced from D:\CESAR.SALAZAR\DOCUMENTOS\ARCHIVOS.PROGRAMACION\ARCHIVOS.CBUILDER\SISTEMA....\DEBUG_BUILD\CCSGBASEDATOS.OBJ


Por su atención a este tema, muchas gracias y en espera de una respuesta que me indique por donde debo seguir, aclaro que no es un Componente Derivado es una clase derivada de un componente, pues como anteriormente he comentado, NO requiero el componente de manera Visual pero si usar el Evento OnReply del mismo.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Cesar. En primer lugar, debes implementar el constructor de tu clase derivada, éste no se hereda. TccsgPing::TccsgPing. Debería ser algo como:
Código:
TccsgPing::TccsgPing(Classes::TComponent *C): TIdIcmpClient (C)
{
  //.......
}

Creo que por ese motivo tienes el error, sencillamente no encuentra el constructor.

También me gustaría recordarte que un ping no usa puertos, y que tienes un ejemplo de código puro, sin componentes ni clases derivadas en la sección de trucos: https://cppbuilder.es/viewtopic.php?t=13064.

El truco mencionado usa una dirección IP numérica, pero para lo que tu quieres, es decir no usar la IP sino una dirección Web, se puede adaptar con facilidad:

Código:

#include <winsock2.h>

//------------------------------------------------------------------------------
//  Obtener la IP a partir del Host
//  Entrada Host en formato Web (google.com)
//  Devuelve IP en formato 64.233.167.99
//------------------------------------------------------------------------------
AnsiString HostToIP(AnsiString Host)
{
  WSADATA wsaData;
  hostent* He;
  in_addr InAddr;

  AnsiString Result = "";
  if(WSAStartup(MAKEWORD(1, 1), &wsaData) == 0){
    He = gethostbyname(Host.c_str());
    if(He){
      Move(*He->h_addr_list, &(InAddr.S_un.S_addr), He->h_length);
      Result = AnsiString(inet_ntoa(InAddr));
    }
    WSACleanup();
  }

  return Result;
}



Espero que mis comentarios te sirvan de ayuda.
Saludos, Feliz Navidad y un fuerte abrazo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

bien para contestar las preguntas pues aun que tu observación es correcta aqui estan las 2 cosas que requiero.

1.- Necesito que una Direccion IP me "conteste" en un puerto Espesifico, pues requiero saber si la direccion existe y tiene el puerto al cual quiero conectarme.

2.- El Constructor es heredado, por lo tanto la opcion anterior es correcta, al parecer el Componente TIdcmpCliente No permite su herencia como estamos acostumbrados o al menos no como se piensa

pero al hacerlo asi funciona correctamente
Código:
public:
   #pragma option push -w-inl
   __fastcall TccPing(Classes::TComponent* AOwner) : TIdIcmpClient(AOwner) { }
   #pragma option pop


Aun que el resultado en el Ping y la variable Exito es 0, puede que requiera mas tiempo, para verificar la existencia de los datos.

Saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

César C. Salazar González escribió:

Código:
public:
   #pragma option push -w-inl
   __fastcall TccPing(Classes::TComponent* AOwner) : TIdIcmpClient(AOwner) { }
   #pragma option pop



Claro que funciona, estás declarando e implementando en constructor como función inline.

Respecto al tema del ping, podrías utilizar un componente shocket o con las API librerías winsock y winsock2 pero si el uso de las indy te resuelve el tema, adelante.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pensando en lo que decías:
César C. Salazar González escribió:
...Necesito que una Direccion IP me "conteste" en un puerto Espesifico, pues requiero saber si la direccion existe y tiene el puerto al cual quiero conectarme.


Mira a ver si esto te sirve de ayuda, sólo usando socket:

Código:
#include <winsock2.h>

bool IsOpen(char *Host, int Puerto)
{
  WSADATA     WSAData;
  DWORD       InAddr;
  hostent     *HostEnt;
  sockaddr_in Addr;
  SOCKET      Socket;

  bool Result = false;
  if(WSAStartup(MAKEWORD(1, 1), &WSAData) == 0){
    InAddr = inet_addr(Host);
    if(InAddr == INADDR_NONE){
      HostEnt = gethostbyname(Host);
      if(HostEnt != NULL)
        InAddr =  ((in_addr*)HostEnt->h_addr)->s_addr;
    }
    if(InAddr != INADDR_NONE){
      Socket = socket(AF_INET, SOCK_STREAM, 0);
      if(Socket != INVALID_SOCKET){
        Addr.sin_family = AF_INET;
        Addr.sin_addr.s_addr = InAddr;
        Addr.sin_port = htons(Puerto);
        Result = (connect(Socket, (sockaddr*)&Addr, sizeof(Addr)) != SOCKET_ERROR);
        closesocket(Socket);
      }
    }
    WSACleanup();
  }
  return Result;
}



Saludos.
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.