Newsgroup: it.comp.lang.delphi
Titolo: Creare un bottone sulla toolbar di IE

Ho la necessità di creare un bottone sulla toolbar standard di IE
utilizzando la modalità COM Object:
http://msdn.microsoft.com/workshop/browser/ext/tutorials/button.asp#details_com
Il problema è che non so bene come creare questo oggetto COM (che immagino
debba essere una DLL). Il problema è che non so di preciso da che parte
cominciare e non ho trovato molta documentazione per aiutarmi.
Al momento ho creato un nuovo progetto di tipo ActiveX Library (è giusto
un'ActiveX Library? L'ho visto in un post su google...) di cui ho messo il
sorgente alla fine del post
Ho seguito tutte le istruzioni indicate dalla pagina dell'msdn e il bottone
compare nella toolbar, però sembra che manchi l'aggancio alla mia dll, e
infatti non riesco a capire che passaggio mi manca:
- ho creato un mio GUID: MYGUID
- ho creato la chiave HKLM\Software\Microsoft\IE\Extensions\MYGUID
- sotto quella chiave ho creato l'elemnto ClsidExtension con valore MYGUID
(è giusto?)
e fin qui penso di esserci. Ora però mi chiedo una cosa: cosa se ne fa IE di
quel guid in ClsidExtension? Dovrà pure andare a recuperarlo da qualche
parte, no? Quindi, tirando ad indovinare, ho creato una chiave MYGUID sotto
HKCR_CLSID\MYGUID e sotto la chiave InProcServer32 ho messo il path alla mia
dll.
Avete dei suggerimenti o un sito da consultare?
library IEButtonTest;
uses
  ComServ, ComObj, ActiveX, Windows;
exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;
Type
  TIEButtonTest = class(TComObject, IOleCommandTarget)
  protected
    {Declare IOleCommandTarget methods here}
  public
    function QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
      prgCmds: POleCmd; CmdText: POleCmdText): HResult; stdcall;
    function Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
      const vaIn: OleVariant; var vaOut: OleVariant): HResult; stdcall;
  end;
{$R *.RES}
function TIEButtonTest.Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
  const vaIn: OleVariant; var vaOut: OleVariant): HResult;
begin
  OutputDebugString(PChar('IETest - exec'));
  Result := S_OK;
end;
function TIEButtonTest.QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
  prgCmds: POleCmd; CmdText: POleCmdText): HResult;
begin
  OutputDebugString(PChar('IETest - query status'));
  Result := S_OK;
end;
end.
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
Osserva i tuoi nemici, poiché essi sono i primi a scoprire i tuoi difetti
(Antistene)

 (è giusto?)
Temo di no: GUID è l'acronimo di Global User IDentifier (o qualcosa del 
genere), uno di qui super numeri tipo {F4BC4556-1FE8-4C43-9BD7-854E6D447FE7}
che sono ricavati con un algoritmo tale da non poter risultare mai 
duplicati.
Per fare quello che vuoi fare tu (far comparire un bottone nella toolbar 
di IE che lanci un mio programma
<promo id="autopromo">
   nella fattispecie il mio ContentO 
(
http://www.marcobortolani.it/prodotti/contento.asp
) che nella versione 
nuova si chiamerà DocOrg
</promo>
mi sono appoggiato agli IE5Tools forniti dal buon Per Linds Larsen:
 
http://www.euromind.com/iedelphi/
Un paio di quelle routine (AddExplorerBar e AddToolbarBtn) sono ciò che 
cerchi, complete di sorgenti.
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it

 cerchi, complete di sorgenti.
Mi sono accorto ora che non ho finito di scrivere il post tralasciando
alcune cose che volevo aggiungere: 
- abbiamo già un bottone funzionante sulla toolbar che però utilizza il
metodo che lancia un eseguibile, quindi le operazioni di base dovrebbero
essere ok e devo solo (solo..:-D) sistemare la dll
- anche usando il metodo della dll il bottone in IE appare correttamente
però "non funziona" ovvero è un bottone che non compie nessuna azione


 
Come indicato in privato, per recuperare l'URL direttamente dalla 
finestra di IE puoi riferirti a:
 
http://delphi.about.com/od/windowsshellapi/l/aa060303a.htm


 Avete dei suggerimenti o un sito da consultare?
Ecco la soluzione: mancava questa parte fondamentale
initialization
  //bDebugMode := True;
  TComObjectFactory.Create(ComServer, TIEButtonTest, MY_GUID,
         'TIEButtonTest', 'IE Button', ciMultiInstance
{$ifdef VER130}
        , tmApartment);
{$else}
        );
{$endif}
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
E' più facile spezzare un atomo che un pregiudizio (Albert Einstein)