GARANTIR DESCONTO

Fórum Instanciar uma Interface, alguém me explica direito? #294652

06/09/2005

0

Ae galera, baseado numa dúvida de um colega o [b:40626c7fb8]dcpleal[/b:40626c7fb8] fui atrás de mais informações sobre como fazer download usando Delphi. Hoje uso a função [b:40626c7fb8]UrlDownloadToFile[/b:40626c7fb8] da unit UrlMon, que na verdade é uma chamada a urlmon.dll. Pois bem, até ai muito tranquilo.

//declaração UrlMon
function URLDownloadToFile(Caller: IUnknown; URL: PChar; FileName: PChar; Reserved: DWORD; StatusCB: IBindStatusCallback): HResult; stdcall;

//chamada
function URLDownloadToFile;              external UrlMonLib name ´URLDownloadToFileA´;


Daí acontece que vaculhando um pouco descobri que dá pra pegar o status de download, mas para isso é necessário instanciar uma interface vejam:

  {$EXTERNALSYM IBindStatusCallback}
  IBindStatusCallback = interface
    [´{79eac9c1-baf9-11ce-8c82-00aa004ba90b}´]
    function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
    function GetPriority(out nPriority): HResult; stdcall;
    function OnLowResource(reserved: DWORD): HResult; stdcall;
    function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
      szStatusText: LPCWSTR): HResult; stdcall;
    function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
    function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
    function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
      stgmed: PStgMedium): HResult; stdcall;
    function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
  end;


Aqui tem tudo, mas como faço pra usar esta interface?

Achei o artigo abaixo, mas confesso que fiquei um pouco confuso:
[url=http://www.activedelphi.com.br/print.php?sid=256]Entendendo Interfaces[/url]
Consegui chegar somente até aqui, mas dá erro no CreateOleObject. Como não entendo nada, não consigo solucionar...valeu

procedure TForm1.Button2Click(Sender: TObject);
//const
  //CGUID :  TGUID = ´79eac9c1-baf9-11ce-8c82-00aa004ba90b´;
  //IID_IBindStatusCallback: TGUID = ´79eac9c1-baf9-11ce-8c82-00aa004ba90b´;
var
  MeuEstatus : IBindStatusCallback;
  MeuEstatusGuid : TGuid;
begin
  GetInterface(IID_IBindStatusCallback, MeuEstatusGuid);
  MeuEstatus := CreateComObject(MeuEstatusGuid) as IBindStatusCallback;
  //MeuEstatus.OnProgress(
  UrlDownloadToFile(nil, PChar(Edit1.Text), PChar(Edit2.Text), 0, MeuEstatus);
//  CLSID_ActiveDesktop) as IActiveDesktop;
end;



Adriano Santos

Adriano Santos

Responder

Posts

06/09/2005

Michael

Olá colega!

Até onde eu sei, para vc usar uma interface, vc deve criar uma classe, que derive de outra, e da interface que vc quer usar.

No artigo que vc citou isso é explicado, usando a classe nativa do Delphi [b:36c7496c62]TInterfacedObject[/b:36c7496c62]. Esta classe é interessante. Veja: ´Para facilitar a implementação das classes que definem interfaces, podemos utilizar a classe [b:36c7496c62]TInterfacedObject [/b:36c7496c62]como classe ancestral, pois ela implementa os métodos da interface [b:36c7496c62]IInterface[/b:36c7496c62], facilitando de forma significativa a construção do código.´

Não entendi pq usar [b:36c7496c62]CreateComObject[/b:36c7496c62]...

[]´s


Responder

Gostei + 0

06/09/2005

Adriano Santos

Olá colega! Até onde eu sei, para vc usar uma interface, vc deve criar uma classe, que derive de outra, e da interface que vc quer usar. No artigo que vc citou isso é explicado, usando a classe nativa do Delphi [b:b81b289f0c]TInterfacedObject[/b:b81b289f0c]. Esta classe é interessante. Veja: ´Para facilitar a implementação das classes que definem interfaces, podemos utilizar a classe [b:b81b289f0c]TInterfacedObject [/b:b81b289f0c]como classe ancestral, pois ela implementa os métodos da interface [b:b81b289f0c]IInterface[/b:b81b289f0c], facilitando de forma significativa a construção do código.´ Não entendi pq usar [b:b81b289f0c]CreateComObject[/b:b81b289f0c]... []´s


Então [b:b81b289f0c]Michael[/b:b81b289f0c], eu não tenho que criar um objeto derivado da interface para poder acessar seus métodos e etc? Por isso tentei desta foram.


Responder

Gostei + 0

06/09/2005

Michael

Sim, vc deve criar um objeto derivado de [b:d6d442c9e9]uma classe[/b:d6d442c9e9] e de [b:d6d442c9e9]uma ou mais interfaces[/b:d6d442c9e9]. E para criar este objeto, vc deve proceder como uma classe qualquer:

TMeuObjetoInterface = class(TInterfacedObject, IBindStatusCallback)
(...)
end;


Qualquer coisa é só postar.

[]´s


Responder

Gostei + 0

06/09/2005

Adriano Santos

Sim, vc deve criar um objeto derivado de [b:4cd43072a7]uma classe[/b:4cd43072a7] e de [b:4cd43072a7]uma ou mais interfaces[/b:4cd43072a7]. E para criar este objeto, vc deve proceder como uma classe qualquer:
TMeuObjetoInterface = class(TInterfacedObject, IBindStatusCallback)
(...)
end;
Qualquer coisa é só postar. []´s


Então ao tenho que redeclarar todos os métodos desta Inteface, acredito.


Responder

Gostei + 0

06/09/2005

Bruno Belchior

até onde eu sei você deve implementar esses métodos na sua classe... pois uma [b:96e1c4bcc8]interface[/b:96e1c4bcc8] é utilizada mais ou menos como uma classe abstrata...


Responder

Gostei + 0

06/09/2005

Adriano Santos

Eita Fórum porreta da muléstia, rs.

Ae, deu certo...consegui criar um exemplo de download com progresso.
Vou dar uma melhorada e enviar a Dica para o ClubeDelphi pra ver se eles postam, daí menciono os créditos na dica beleza?

Valeu.

Obs. Não é tão difícil assim como eu pensava. :D


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar