2

リストの連絡先をTListBoxに表示したい。DelphiXEを実行しているWindows7PCに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

代わりに使用するように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オブジェクトをインスタンス化する別の方法はありますか?または、Delphiから呼び出すために、別の言語でAPIのラッパーを作成します(この例はここにあります)

于 2012-04-16T15:51:37.193 に答える