外部应用程序:检查是否存在Outlook文件夹

时间:2010-09-17 07:51:20

标签: delphi outlook directory exists

以下解决方案

我一直在网上寻找解决方案,但在Delphi中找到答案似乎很难......

如果您熟悉Outlook

,请跳过此处

之前的一些解释: Outlook中的“联系人”文件夹的组织方式类似于Windows中的foldertree。联系人存储在“联系人”文件夹本身或子文件夹中。

我的代码确实将外部数据库中的联系人添加到Outlook联系人数据库中。为了防止双重输入,程序应该检查所有联系人并查看它是否可以找到联系人条目的“旧”版本并更新它,如果没有,则创建一个新联系人。 因此,我写了一个递归,循环遍历文件夹并检查联系人。

在文件夹中,您可以获取子文件夹(除了下一个,上一个和上一个)

Contacts:= Contacts.Folders.Getfirst

//现在选择的文件夹是上一个选定文件夹中的第一个子文件夹

如果我试图获取此子文件夹的任何属性,如“Items.Count”或其他任何内容,则会出现错误,因为此文件夹不存在。
因此,我想检查文件夹是否存在,并跳过循环浏览此子文件夹,因为否则循环将在此处中断并且程序停止。

如果您熟悉Outlook工作方式,请跳至此处
问题:

在调试程序中,此联系人/文件夹变量(OleVariant,指向当前所选文件夹的指针)包含与此类似的值:'$ 0074974C'。
如果没有子文件夹,则此值返回'$ 00000000'。这似乎是一个指针。

我应该如何检查文件夹是否存在?

const
  olFolderContacts = $0000000A;
var
  outlook, NameSpace, Contact, ContactsRoot, Contacts: OleVariant;

begin
Outlook := CreateOleObject('Outlook.Application');
NameSpace := Outlook.GetNameSpace('MAPI');
ContactsRoot := NameSpace.GetDefaultFolder(olFolderContacts);
Contacts:= ContactsRoot;
//We're now in the Contacts Folder
Contacts:= Contacts.folders.getfirst;
//First Subfolder

什么行不通: 检查是否

Contacts ='$ 00000000'(作为字符串)

Contacts ='$ 00000000'(作为OleVariant)

变种
VAL:TVarRec;
代码:
VAL:=联系人;
string(Contacts.VWideChar)='$ 00000000'

变种
vntNothing:OLEVariant;
代码:
TVarData(vntNothing).VType:= varDispatch;
TVarData(vntNothing).VDispatch:= Nil;
Contacts = vntNothing

Contacts =未分配
...
......

在VBA中,此问题有一个简单的解决方案

如果Contacts = Nothing

但是Delphi中没有'没什么'......

想法?

3 个答案:

答案 0 :(得分:4)

您可以先检查文件夹集合上的计数:

if Contacts.Folders.Count = 0 then

Contacts := Contacts.Folders.GetFirst;
if VarIsClear(Contacts) then

答案 1 :(得分:1)

你可以试试这个:

if IUnknown(Contacts) = nil then
  //

答案 2 :(得分:0)

var  
x: string;  

代码:

x:= format('%p%',[Pointer(TVarData(contacts).VDispatch)]);
if x = '00000000' then  
   'New Contact'  
else  
   'open folder and search within this one'

同事有解决方案..感谢您的时间:)