 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 29 Dic, 2008 12:39 pm Asunto: Problema de Herencia |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 29 Dic, 2008 5:00 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 29 Dic, 2008 6:17 pm Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 29 Dic, 2008 8:15 pm Asunto: |
|
|
| 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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 29 Dic, 2008 11:41 pm Asunto: |
|
|
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 |
|
 |
|
|
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.
|