Pregunta

Con el siguiente bloque de código, selecciona la carpeta pública que se establece en 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;

Se produce un error en la línea marcada si no hay carpeta pública en Outlook (no hay carpetas públicas establecidas en Outlook, sin servidor de Exchange).

La pregunta es cómo evitar ese error detectando previamente si hay una carpeta pública establecida o no.

Capturando el error con un intento ... finalmente/excepto que el bloque no funcionó como la excepción es causada externamente por la API de Microsoft (EoleException).

No puedo pensar en otra forma de detectar si la carpeta existe ya que la línea que causa el error es esencial para seleccionar la carpeta pública y, por lo tanto, obtener propiedades de ella.

saludos

¿Fue útil?

Solución

¿Por qué no intentaría/excepto trabajar? Delphi atrapa las excepciones de EolesySerror muy bien. Y la excepción es planteada por el Delphi RTL, no Outlook: todas las bibliotecas amigables con Idispatch devuelven un código de error, que el RTL convierte en una excepción OLE después de solicitar la descripción usando ierrorInfo.

Otros consejos

Como el mensaje indica, Outlook no sabe qué perfil usar. Debe iniciar sesión en el espacio de nombres MAPI antes de poder hacer algo con él. Debe hacer esto incluso si no hay información de inicio de sesión, por ejemplo, cuando se conecta a una instancia local de Outlook que no está conectada a un servidor de Exchange.

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

Este código de código funciona bien. Pensé que tenía otro problema que resolví. Gracias por tu tiempo.

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 tenía razón con su respuesta, simplemente confundí la EoleException del depurador con uno externo. Ejecutar el código sin el depurador no lleva a la excepción, ya que de hecho se ve atrapado por el bloque de try/excepción.

La respuesta de Marjan Venemas puede ser útil cuando se trabaja con múltiples cuentas en Outlook.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top