【问题标题】:Why do I get an access violation when I call Microsoft Communicator 2007's IMessengerContacts.Count method?为什么我在调用 Microsoft Communicator 2007 的 IMessengerContacts.Count 方法时会遇到访问冲突?
【发布时间】:2014-04-05 06:28:55
【问题描述】:

我想将列表中的联系人显示到 TListBox 上。我在运行 Delphi XE 的 Windows 7 PC 上安装并运行了 Communicator。我正在使用 CommunicatorAPI_TLB 和 CommunicatorPrivate_TLB。

我单击登录和注销按钮,程序按预期运行:我的 Communicator 登录和注销。很酷。

问题是当我尝试单击列表用户按钮时。 Contacts.Count 方法似乎给我带来了访问冲突。我在小组中尝试过,结果相同。谁能发现我做错了什么?

  { This IMessenger3 Class Inherits from the IMessenger2 interface -> IMessenger... }
  Communicator : IMessenger3;
  Contacts     : IMessengerContacts;
  Contact      : IMessengerContact;
  Groups       : IMessengerGroups;
  Connected    : Boolean;

End;

Var
  frmMain: TfrmMain;

Implementation

{$R *.dfm}

{ ---------------------------------------------------------------------------- }

Procedure TfrmMain.FormCreate(Sender: TObject);
Begin    
  Communicator := CoMessenger.Create;      
End; { FormCreate Procedure }

Procedure TfrmMain.btnSignInClick(Sender: TObject);
Begin    
  Communicator.AutoSignin;
  Connected := True;        
End;  { btnSignInClick Procedure }

Procedure TfrmMain.btnSignOutClick(Sender: TObject);
Begin    
  Communicator.Signout;
  Connected := False;      
End;  { btnSignOutClick Procedure }


Procedure TfrmMain.btnLoadContactsClick(Sender: TObject);
Var
  ContactIndex : Integer;                                                       
Begin      
  { Load my contacts into a listbox }
  Contacts := IMessengerContacts (Communicator.MyContacts);
  Groups   := IMessengerGroups (Communicator.MyGroups);

  If (Contacts <> Nil) Then Begin

    try
      showmessage (inttostr(Groups.Count));
      showmessage (inttostr(Contacts.count));
    except    
    end;
  (*
    For ContactIndex := 0 To (Contacts.Count) Do Begin

     Contact := IMessengerContact (Contacts.Item (ContactIndex));

     { Add the contact to the list }
     lbxContacts.AddItem (Contact.FriendlyName, Nil);

    End; { For }
  *)
  End; { If <> Nil }

End;

【问题讨论】:

  • 欢迎来到 StackOverflow。 “似乎给我一个访问冲突”给我们绝对没有什么可以帮助你。请编辑您的问题并添加 exact 错误消息,包括所有内存地址。如果您向我们提供有关问题的信息,它会让您更容易(和更快)获得帮助,并且细节很重要,因为我们无法从这里看到您的屏幕来自己获取它们。 :) 谢谢。
  • 非常感谢肯!没错...通过将其从 Hard Type Cast 更改为 AS 可以解决问题...谢谢!!!!!
  • 别忘了接受最佳答案,请参阅faq#howtoask

标签: delphi pascal office-communicator


【解决方案1】:

将这两种类型转换改为使用as。如果问题是接口不可用,您至少会收到一条有意义的错误消息。

改变

Contacts := IMessengerContacts(Communicator.MyContacts); 
Groups   := IMessengerGroups (Communicator.MyGroups);

Contacts := Communicator.MyContacts as ImessengerContacts; 
Groups   := Communicator.MyGroups as IMessengerGroups;

您可能应该对其他要进行类型转换以获取接口的地方执行相同的操作。尽可能礼貌地要求他们总是比强行抓住他们更好。 :)

【讨论】:

    【解决方案2】:

    自从我编写任何 Delphi(大约 14 年)以来,已经过了很长时间了,但我会冒险猜测一下。

    出于安全原因,IMessenger 接口中的某些方法被标记为 NotScriptable。我的猜测是,界面将您的 Delphi 应用程序视为脚本语言,即不是本机 C++ 代码,这会导致访问冲突。您可以通过查看reference 来证明这一点,以确定哪些是可编写脚本的,哪些不是,并查看哪些引发访问冲突。

    至于修复它 - 正如我所说,我不是 Delphi 专家,但还有其他方法可以实例化 IMessenger 对象吗?或者用另一种语言围绕 API 创建一个包装器,以便从 Delphi 调用(有一个 here 的示例)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多