Fórum Instanciar uma Interface, alguém me explica direito? #294652
06/09/2005
0
//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
Curtir tópico
+ 0Posts
06/09/2005
Michael
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
Gostei + 0
06/09/2005
Adriano Santos
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.
Gostei + 0
06/09/2005
Michael
TMeuObjetoInterface = class(TInterfacedObject, IBindStatusCallback) (...) end;
Qualquer coisa é só postar.
[]´s
Gostei + 0
06/09/2005
Adriano Santos
TMeuObjetoInterface = class(TInterfacedObject, IBindStatusCallback) (...) end;
Então ao tenho que redeclarar todos os métodos desta Inteface, acredito.
Gostei + 0
06/09/2005
Bruno Belchior
Gostei + 0
06/09/2005
Adriano Santos
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)