UserProperties.Add в Outlook2007 получает ошибку Invalid Function

Я работаю с Delphi2010. Когда я запускаю код с Outlook 2003 SP3, я не получаю ошибок, но на другом компьютере с Outlook2007 я получаю сообщение об ошибке «Недопустимая ошибка функции».

const
  olMailItem = 0;
  olFolderInbox = $00000006;

var  
  Outlook: OleVariant;
  oNameSpace:  OleVariant;
  oFolder: Olevariant;
  oMailItem: Variant;
  oUserProperty: Olevariant;
begin

  try
    Outlook := GetActiveOleObject('Outlook.Application');
  except
    Outlook := CreateOleObject('Outlook.Application');
  end;

  oNameSpace := Outlook.GetNamespace('MAPI') ;
  oFolder:= oNameSpace.GetDefaultFolder(olFolderInbox);


  oMailItem := Outlook.CreateItem(olMailItem);
  ...
  oUserProperty:= oMailItem.UserProperties.Add('RetrieveCode', 1); //--> get error on Outlook2007
  oUserProperty.Value:=ARetrieveCode;
  ...
end;

Когда я использую выкуп, я получаю ту же ошибку для Outlook2007. Может ли кто-нибудь указать правильное направление для решения этой проблемы?

Я ловлю ошибку с помощью eurekalog:

; ComObj (Line=0 - Offset=0)
; --------------------------
00538469  mov     eax, dword ptr [EOleSysError]
0053846E  call    ComObj
00538473  mov     esi, eax
00538475  cmp     dword ptr [ebp-$04], +$00
00538479  jz      ComObj
0053847B  push    dword ptr [ebp-$04]
0053847E  mov     eax, esi
00538480  jmp     System
00538485  jmp     ComObj
00538487  mov     eax, esi
00538489  call    System                         ; <-- EXCEPTION
0053848E  xor     eax, eax
00538490  pop     edx
00538491  pop     ecx
00538492  pop     ecx
00538493  mov     fs:[eax], edx
00538496  push    $005384B0                      ; '^[‹å]Â.'
0053849B  lea     eax, [ebp-$10]
0053849E  mov     edx, $00000003                 ; ''...
005384A3  call    System
005384A8  ret

person Ravaut123    schedule 24.08.2012    source источник
comment
Отладка поздней привязки COM может быть сложной задачей. Вы пробовали раннее связывание вместо этого. Может получить больше информативных ошибок.   -  person David Heffernan    schedule 24.08.2012
comment
Почему вы используете Redemption на 2007? Там это не нужно.   -  person David Heffernan    schedule 24.08.2012
comment
В компании мы используем outlook2003 и некоторые люди outlook2007. Мы используем искупление, потому что я получаю диалоговое окно безопасности Outlook.   -  person Ravaut123    schedule 24.08.2012
comment
ранняя привязка - это затем CreateOleObject('Outlook.Application'), а поздняя привязка - это импорт библиотеки Outlook?   -  person Ravaut123    schedule 24.08.2012
comment
Да, я знаю, для чего нужен Redemption. Вам это не нужно в 2007 году. По крайней мере, это то, что показал мой веб-поиск.   -  person David Heffernan    schedule 24.08.2012
comment
Верно, ранняя/поздняя граница   -  person David Heffernan    schedule 24.08.2012
comment
Хорошо, я импортирую библиотеку Outlook в Outlook_tlb.pas.   -  person Ravaut123    schedule 24.08.2012
comment
Вместо того, чтобы редактировать вопрос, вы должны добавить разрешение в качестве ответа.   -  person David Heffernan    schedule 27.08.2012


Ответы (1)


Я изменил свой код с поздней привязки на раннюю, чтобы проверить, получаю ли я ту же ошибку. Я импортировал библиотеку в OutLook_TLB.pas и добавил Outlook_TLB в использование устройства.

uses
  ...,
  Outlook_TLB;

function SendOutLookMail ...
var
  ...
  MyOutlook: Outlook_TLB.OutlookApplication;
  MyMailItem: Outlook_TLB.MailItem;
  MyUserProperty: Outlook_TLB.UserProperty;
begin
  ...
  MyOutlook:= Outlook_TLB.CoOutlookApplication.Create;
  MyMailItem:= MyOutlook.CreateItem(olMailItem)as MailItem;
  MyUserProperty:= MyMailItem.UserProperties.Add('RetrieveCode', 1, EmptyParam, EmptyParam) as UserProperty;
  MyUserProperty.Value:= ARetrieveCode;
  MyMailItem.Recipients.Add(AFrom);
  MyMailItem.To_:= ATo;
  MyMailItem.Subject := ASubject+' early/late-bound';
  MyMailItem.Body := ABody;
  MyMailItem.Send;
end;

Когда я запускаю код, у меня нет ошибок на компьютере с Outlook2007. Итак, ранняя привязка к объекту устранила мою проблему.

person Ravaut123    schedule 27.08.2012