Ir para conteúdo
Fórum Script Brasil
  • 0

WCF - Cliente Delphi / Service C#


Germanno

Pergunta

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 para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...