Jump to content
Fórum Script Brasil
  • 0

WCF - Cliente Delphi / Service C#


Germanno

Question

Boa noite,

Estou estudando a estrutura WCF por conta própria, e até alguns dias atrás estava tudo funcionando conforme o planejado, no entanto, apareceu um problema que está há dez dias tirando meu sono e já não sei mais onde pesquisar.

Primeiramente, explicarei o projeto para que seja mais fácil o entendimento por parte dos colegas.

Inicialmente, criei um projeto WCF, com o cliente e o servidor desenvolvidos em C#, e tudo funcionou perfeitamente.

O cliente é uma console application, onde o usuário informa o número de registros que deseja retornar, passa essa informação como argumento chamando o método do serviço, que por sua vez consulta o banco de dados retornando um Array de produtos. Os produtos por sua vez, tem os campos Código, Descição e Valor.

Neste caso, consigo acessar normalmente as informações de cada objeto no cliente.

Para testar a integração com o Delphi, exportei a biblioteca DLL do cliente para um arquivo TLB (Type Library) usando a ferramenta "regasm" no prompt de comando do Visual Studio. No Delphi, importei essa TLB. Então criei um cliente no Delphi, onde o usuário também escolhe o número de registros a retornar, e aparentemente o cliente Delphi recebe os registros com sucesso.

No entanto, o método do serviço .NET retorna um array de Produtos, e no Delphi o tipo de retorno desse método aparece como "pSafeArray".

Aqui surge o problema. Como posso converter, transformar etc. esse "pSafeArray" em um array de produtos novamente? Ou, se não for possível converter, como posso acessar a informação de cada produto?

Lembrando que importei também no Delphi uma Type Library da classe "Produtos", ou seja, até consigo criar variáveis "Produto" no Delphi, no entanto não faço idéia de como fazer os dados do "pSafeArray" virarem produtos.

Me desculpem se houver algum erro crasso quanto aos termos aqui utilizados. É que não manjo muita coisa de Delphi mas gostaria muito de fazer esse projeto funcionar.

Agradeço desde já

Att.

Germanno Domingues

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Obrigado pela ajuda Jhonas.

Eu já havia visto estes links que você passou, porém não consegui tirar proveito, talvez pelo meu conhecimento um pouco limitado de Delphi.

Segue abaixo o código do cliente Delphi. Note que deve haver variáveis sem uso ou alguma outra grosseria, pois fiquei muitas horas tentando coisas diferentes e chegou uma hora que já não estava mais me preocupando para a apresentação do código...

Tem dois comentários que mostram os pontos-chave do problema. No caso, o método "RetornaProdutos" tem um tipo de retorno "pSafeArray", o qual não sei como acessar os elementos como se fossem uma variável TProduto.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WCFTeste_ClienteDll_TLB, WCFTeste_Contratos_TLB,
  StdCtrls, Activex, Grids;

type
  TForm1 = class(TForm)
    txtIpConsulta: TEdit;
    Button1: TButton;
    Label1: TLabel;
    txtLinhas: TEdit;
    Label2: TLabel;
    txtTempo: TEdit;
    Label3: TLabel;
    ckbCompactar: TCheckBox;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    {type TProduto = record
     Cod : integer;
     Descricao : ansistring;
     Valor : integer;
   end; }
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  c : ICliente;
  p : PSafeArray;
  ip_consulta : WideString;
  linhas_retorno : Integer;
  compactado : Boolean;
  inicio, final: TDateTime;
  dif : Extended;
  resultado: Integer;
  lim_inferior, lim_superior, i, valor: Integer;
  tmpProduto : TProduto;
  pProduto : TProduto;

begin

ip_consulta := txtIpConsulta.Text;
linhas_retorno := StrToInt(txtLinhas.Text);

compactado := ckbCompactar.Checked;

c := CoCliente.Create();

inicio := Now();


//Esse é o método do serviço C# que retorna um array de Produtos, 
//que aqui no Delphi vira um pSafeArray

p := c.RetornaProdutos(linhas_retorno, ip_consulta, compactado);


final := Now();

dif := (final-inicio)*24.0*60.0*60;

txtTempo.Text := FloatToStr(dif);

resultado:= MessageDlg('Deseja converter (PSafeArray - StringGrid) e exibir'
                      +'os resultados?',mtConfirmation, mbYesNoCancel, 0);

if resultado = 6 then begin

SafeArrayGetLBound(p, 1, lim_inferior);
SafeArrayGetUBound(p, 1, lim_superior);

for i := lim_inferior to lim_superior do

  begin

   //Aqui é onde "tento" pegar um elemento do pSafeArray
   //e colocá-lo na variável pProduto
    SafeArrayGetElement(p, i, pProduto);
    tmpProduto := TProduto(pProduto);

    MessageDlg(tmpProduto.Descricao,mtInformation, mbOKCancel, 0);
  end;

end;

end;

end.

Link to comment
Share on other sites

  • 0

exemplo de uso

procedure DecodeSafeArray(TheSafeArray: PSafeArray; TheStrings:
TStrings);
var
L, U, I: LongInt;
W: WideString;
begin
   SafeArrayGetLBound(TheSafeArray, 1, L);
   SafeArrayGetUBound(TheSafeArray, 1, U);
   for I := L to U do
   begin
      SafeArrayGetElement(TheSafeArray, I, W);
     TheStrings.Add(W);
   end;
end;

outros exemplos, a partir da pagina 5 dessa apostila

http://www.docstoc.com/docs/2246411/Inform...and-Safe-Arrays

abraço

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...