Domanda

Con questo codice-Block si seleziona la cartella pubblica che si trova in Outlook:

const
  olPublicContactsFolder = $00000012; //constant for the public folder
begin
Outlook := CreateOleObject('Outlook.Application');
// Get name space
NameSpace := Outlook.GetNameSpace('MAPI');
// Get root public folder
ContactsRoot := NameSpace.GetDefaultFolder(olPublicContactsFolder); //<-- Error
Contacts:= Contactsroot;

Un errore si verifica sulla linea segnata se non v'è alcuna cartella pubblica in Outlook (nessun set cartella pubblica in Outlook, senza Exchange Server).

La domanda è: come evitare tale errore da parte precedentemente rilevando se v'è un insieme di cartelle pubbliche o meno.

Facendo l'errore con una prova ... finalmente / tranne blocco non ha funzionato come l'eccezione è causata esternamente da API di Microsoft (EOleException).

Non riesco a pensare ad un altro modo per rilevare se la cartella esiste come la linea causa l'errore è essenziale per selezionare la cartella pubblica e quindi ottenere le proprietà di esso.

saluti

È stato utile?

Soluzione

Perché non avrebbe cercato / tranne il lavoro? Delphi cattura eccezioni EOleSysError bene. E l'eccezione è sollevata dalla Delphi RTL, non Outlook - tutte le librerie IDispatch-amichevoli restituiscono un codice di errore, che i convertiti ad RTL un'eccezione OLE dopo aver richiesto la descrizione utilizzando IErrorInfo

.

Altri suggerimenti

Mentre il messaggio indica, Outlook non sa quale profilo utilizzare. È necessario l'accesso allo spazio dei nomi MAPI prima di poter fare qualsiasi cosa con esso. Hai bisogno di fare questo, anche se non ci sono informazioni di accesso, ad esempio quando ci si connette a un'istanza di Outlook locale che non è connesso a un server Exchange.

FNameSpace := FOutlook.GetNamespace('MAPI');
FNameSpace.Logon('', '', False, False);
Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );

Questa codeblock funziona bene. Ho pensato che non avevo un altro problema che ho risolto. Grazie per il vostro tempo.

function DoesPublicFolderExist():Boolean;
const
  olFolderContacts = $00000012;
var
  Outlook, Namespace, ContactsRoot, Contactsfolder : OleVariant;
begin
  // Connect to outlook
  Outlook := CreateOleObject('Outlook.Application');
  // Get name space
  NameSpace := Outlook.GetNameSpace('MAPI');
  // Get root contacts folder
  try
    ContactsRoot := NameSpace.GetDefaultFolder(olFolderContacts);
    Result:= True;
  except
    Result:= False;
  end;
end;

Dmitry Streblechenko era giusto con la sua risposta, ho appena scambiato l'EOleException del debugger per uno esterno. L'esecuzione del codice senza il debugger non comporta l'eccezione in quanto effettivamente viene catturato dal / blocco try eccezione.

Marjan Venemas risposta potrebbe venire utile quando si lavora con più account in Outlook.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top