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.