3ENGINE

Programación y otros cachivaches

Etiqueta: programacion

Página 11/21

Tecnologia

Invocando un Servicio Web WCF desde Delphi 7


Para que Delphi 7 importe el WSDL y genere el stub correctamente de un Servicio Web implementado en WCF (Windows Communication Foundation) hay que actualizar previamente D7 y añadir una línea de código.

Pasos a seguir.

1. Bajarse de la Web de Embarcadero el zip Delphi SOAP Runtime and Importer Update
2. Descomprimir el zip en una carpeta
3. Realizar previamente una copia de $(DELPHI)\Source\soap y copiar dentro el contenido de la carpeta src del zip
4. Realizar previamente una copia de $(DELPHI)\Bin\WSDLImp.exe y reemplazarlo por el que se encuentra en el zip
5. Abrir D7 y generar el stub.
6. Editar el stub generado y añadir, dentro de la sección initialization, la siguiente línea:

InvRegistry.RegisterInvokeOptions(TypeInfo([Nombre del servicio]),ioDocument);

7. Añadir las directivas de compilación CLEANUP_SOAP_HEADERS;FIX_ELEM_NODE_NS al proyecto
8. Añadir al Search Path del proyecto $(DELPHI)\Source\soap

Con estos pasos se solucionan, al menos, tres problemas:

1. Al invocar un método con parámetros D7 devuelve un error:

The formatter threw an exception while trying to deserialize the
message: Error in deserializing body of request message for operation ‘Testing’. End element ‘Body’ from namespace ‘http://schemas.xmlsoap.org/soap/envelope/’
expected. Found element ‘parameters’ from namespace

2. Al invocar un método con parámetros primitivos string, WCF recibe parámetros nulos
3. Al invocar un método con parámetros de instancia de una clase, WCF devuelve un error:

System.NullReferenceException: Object reference not set to an instance of an object




Tecnologia

Averiguar MAC


Si deseas averiguar la MAC de un equipo puede mediante el comando:

arp -a IP

Así por ejemplo:

C:\>arp -a 10.21.2.1

Interfaz: 10.21.15.66 — 0x4
Dirección IP Dirección física Tipo
10.21.2.1 00-00-0c-07-bc-04 dinámico




Tecnologia

Cómo obtener el nombre de una máquina a partir de una IP


Para obtener el nombre de una máquina a partir de una IP, podemos utilizar el siguiente comando:

> ping -a IP

así por ejemplo si ponemos:

> ping -a 10.120.238.17

recibimos como respuesta algo parecido a esto, donde el texto marcado en rojo es el nombre de la máquina:

Haciendo ping a 3engine.local [10.120.238.17] con 32 bytes de datos:

Respuesta desde 10.120.238.17: bytes=32 tiempo=1ms TTL=123
Respuesta desde 10.120.238.17: bytes=32 tiempo=1ms TTL=123
Respuesta desde 10.120.238.17: bytes=32 tiempo=1ms TTL=123
Respuesta desde 10.120.238.17: bytes=32 tiempo=1ms TTL=123

Estadísticas de ping para 10.120.238.17:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 1ms, Máximo = 1ms, Media = 1ms




Tecnologia

RTTI: reflection para Delphi.


Esto del RTTI (Runtime Type Information) existe hace muchos años, permite obtener en run-time la información de los objetos cargados en memoria.

Una de mis intenciones es conseguir serializar / deserializar como XML mediante el uso de RTTI. Deseadme suerte.

Un ejemplo rudimentario. Para obtener la lista de propiedades (published) y eventos de un Tform:

procedure TForm1.FormCreate(Sender: TObject);
var
  lista : TPropList;
  count, I : integer;
begin
   count := GetPropList(Sender.ClassInfo, tkAny, @lista);
   for I := 0 to count – 1 do begin
     showmessage(lista[I]^.Name);
   end;
end;

Una desventaja que yo le veo al RTTI es que sólo puedes obtener información de las propiedades marcadas como published. Por suerte a partir de Delphi 7 existe una extensión del RTTI que compilando el código mediante la directiva $METHODINFO ON es posible obtener información de métodos y propiedades marcadas como public, en éste enlace mas información.

Mas información:

http://www.orlandobrea.com.ar/2006/02/reflection-en-delphi.html
http://delphi.about.com/od/oopindelphi/a/delphirtti.htm
http://chris.lichti.org/Lab/RTTI_Lib/RTTI_Lib.shtml
http://homepages.borland.com/jedi/jcl/