在delphi中使用MAPI的outlook profile .PST和.OST文件位置

时间:2014-07-03 11:40:39

标签: delphi outlook-2010 mapi

有人告诉如何在Delphi中使用MAPI查找特定配置文件的.PST和.OST文件位置吗?

代码:

我编写了以下代码来查找.PST路径。但我在“HrgetoneProps”

行中收到错误“2147221233”
 FMapiSession := nil;
  res := MAPILogonEx(0, 'Default Outlook Profile', nil, ulFlags, FMapiSession);
if res = S_OK then
  begin
    res := MAPIAdminProfiles(0, ProfAdmin);
    {$IFDEF DEBUG}CodeSite.Send('MAPIAdminProfiles'); {$ENDIF}
    if res = S_OK then
      begin
        res := FMapiSession.AdminServices(0, ServAdmin);
        if res = S_OK then
          begin
            res := ServAdmin.GetMsgServiceTable(0, Tbl);
            if res = S_OK then
              begin
                res := Tbl.SetColumns(PSPropTagArray(@sptCols), 0);
                if res = S_OK then
                  begin
                    sres.rt := RES_PROPERTY;
                    sres.res.resProperty.relop := RELOP_EQ;
                    sres.res.resProperty.ulPropTag := PR_SERVICE_NAME;
                    sres.res.resProperty.lpProp := @spv;
                    spv.ulPropTag := PR_SERVICE_NAME;
                    spv.Value.lpszA := 'MSUPST MS';
                    res := HrQueryAllRows(Tbl, @sptCols, @sres, nil, 0, pRow);
                    if res = S_OK then
                      begin
                        for I := 0 to pRow.aRow[0].cValues - 1 do
                          begin
                            if (pRow.aRow[0].lpProps[I].ulPropTag = PR_SERVICE_UID) then
                              begin
                                MsgStoreUID := PMAPIUID(pRow.aRow[0].lpProps[I].Value.bin.lpb);
                                break;
                              end;
                          end;
                        res := ServAdmin.OpenProfileSection(MsgStoreUID, TGUID(nil^),
                          MAPI_Force_ACCESS or MAPI_MODIFY, ProfSect);

                        if res = S_OK then
                          begin
                            {$IFDEF DEBUG}CodeSite.Send('HrGetOneProp'); {$ENDIF}
                            res := HrGetOneProp(ProfSect, PR_PST_PATH, propVal);
                            if res = S_OK then
                              begin
                                Result := propVal^.Value.lpszA;
                                MAPIFreeBuffer(propVal);
                              end
                          end
                        else
                          begin
                            // ...
                          end;
                        FreePRows(pRow);
                      end;
                  end;
              end;
          end;
      end;
  end

1 个答案:

答案 0 :(得分:1)

你可以

  1. 解析商店条目ID(其格式记录在MSDN上 - 查看OutlookSpy中的PR_STORE_ENTRYID)。

  2. 查看配置文件中的所有服务提供商(IMsgServiceAdmin.GetMsgServiceTable)。对于PR_SERVICE_NAME ==' MSPST MS' /' MSUPST MS' /' INTERSTOR'等,阅读服务提供商的表(IMsgServiceAdmin.AdminProviders),打开个人资料部分,阅读PR_ENTRYID。使用IMAPISession :: CompareEntryIDs将该条目id与相关商店的条目ID进行比较。如果匹配,请读取PR_PST_PATH属性。你可以在OutlookSpy中使用它 - 单击IMAPISession | AdminServices。

  3. 使用Redemption - 它公开RDOPstStore.PstPath和RDOExchangeStore.OstPath。