备份outlook的pst文件的时候,遇到了一些问题,总结了一下。
要得outlook的pst文件的路径,先使用Outlook自带的.net COM组件,但最终发现该组件对于Outlook 2007以上的版本才提供了获得pst路径的方法,但程序要支持Outlook2003,所以就放弃了此办法。于是改用MAPI。
主程序是C#程序集, MAPI则是非托管的一套API,虽然C#代码可以访问MAPI的函数,但对于一些其中的COM接口,则没有想到好的办法访问,需要用托管的C++代码封装这些接口,这样会多出一个都来了,既然总要多出一个dll,于是索性用用非托管的C++代码生成一个名为MAPIWrapper.dll,该dll封装了对MAPI的操作,导出一些需要的函数,然后主程序中用C#代码封装这些C函数来调用。
注:之所以用非托管的C++代码做一个dll,是因为需要的这些功能都在我们的软件的以前的版本里实现了,代码可以直接移植过来用。而且该功能要得也紧。
问题一:
C#工程编译时,选择的platform target是Any CPU,生成的程序集可以运行在32位和64位系统上都没问题。但是MAPIWrapper只生成了Win32一个类型的dll。在64位系统上运行的时候,C#程序集就无法加载该dll,因为64位的程序无法加载32位的dll,反之亦然。
解决办法:
在vs2010里,可以添加x64的编译选项,生成64位的dll,在64位系统上安装程序的时候,会拷贝64位dll,32位系统则拷贝32的dll。
问题一解决了,但新的问题又来了。
问题二:
在64位系统上主程序会加载64位的MAPIWrapper.dll,64位的MAPIWrapper.dll会加载64位的mapi32.dll(别看名字里有个32,但其实是64位的dll,名字是那样是为了兼容性)来访问系统上安装的outlook的信息。但当该64位的系统上安装的是32位的outlook的话,64位的mapi32.dll不能获得32位outlook的信息,此时会弹出下面对话框:
显然,mapi32.dll认为outlook不是默认邮件系统客户端(如果没有安装outlook也会弹出此对话框)。因此,最终程序无法通过64位(或32位)MAPIWrapper.dll获得32位(或64位)的outlook的pst路径。
解决办法:
现在的做法是新增OutlookHelper工程,通过生成的OutlookHelper.exe和OutlookHelper64.exe来获得32位和64位的outlook的pst路径。将得到的pst路径存储到一个临时文件中,然后主程序等待OutlookHelper(64).exe执行完之后从临时文件里读取pst路径,最后删除临时文件。临时文件的文件名又主程序通过命令行传给OutlookHelper(64).exe。