Rilevare se cartella pubblica (di scambio) esiste in Outlook
-
22-10-2019 - |
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
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.