2

我想将列表中的联系人显示到 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;
4

2 回答 2

2

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

改变

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

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

您可能应该对其他要进行类型转换以获得接口的地方做同样的事情。尽可能礼貌地要求他们总比强行抓住他们要好。:)

于 2012-04-16T18:03:58.590 回答
0

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

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

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

于 2012-04-16T15:51:37.193 回答