2012-04-16 15 views
2

私のリストからTListBoxに連絡先を表示したい。私はCommunicatorをWindows 7 PCにインストールして実行しており、Delphi XEを実行しています。 CommunicatorAPI_TLBとCommunicatorPrivate_TLBを使用しています。Microsoft Communicator 2007のIMessengerContacts.Countメソッドを呼び出すと、アクセス違反が発生するのはなぜですか?

私はログインボタンとログアウトボタンをクリックすると、プログラムは正常に動作します。私の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; 
+0

ようこそStackOverflow。 "私にアクセス違反を投げかけているようだ"あなたを助けるために行くことは絶対にありません。質問を編集し、メモリアドレスを含む**正確**エラーメッセージを追加してください。問題についての情報を私たちに伝えれば、助けを得るのがはるかに簡単に(そして速く)なります。ここからスクリーンを見ることができないので、詳細は重要です。 :)ありがとう。 –

+0

ありがとうケン!それは正しいです...ハードタイプのキャストからASに変更することによって問題を解決します...ありがとう!!!!! –

+0

そして、最良の答えを受け入れることを忘れないでください。[faq#howtoask](http://stackoverflow.com/faq#howtoask)を参照してください。 –

答えて

2

代わりにasを使用するように2つのタイプキャストを変更します。インタフェースが利用できないという問題がある場合は、少なくとも意味のあるエラーメッセージが表示されます。

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

変更

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

あなたはおそらく、あなたがインターフェイスを取得するために型キャストしている他の場所に同じことを行う必要があります。彼らを強制的につかむよりも、丁重に頼むことが可能なときはいつもより良いです。 :)

0

私はデルファイ(約14年)を書いて以来、ずっと時間がかかりましたが、私はこれを推測する危険があります。

セキュリティ上の理由から、IMessengerインターフェイスの一部のメソッドはNotScriptableとマークされています。私の推測では、あなたのDelphiアプリケーションはインターフェイスによってスクリプト言語、つまりネイティブのC++コードではなく、アクセス違反の原因となっているということです。 referenceを調べることでこれを証明することができます。これはスクリプト可能であり、スクリプトではないものがあり、どのスクリプトがアクセス違反をスローするかを確認します。

私が言ったように、私はDelphiのエキスパートではありませんが、IMessengerオブジェクトをインスタンス化する別の方法がありますか?または、別の言語でAPIのラッパーを作成して、Delphiから呼び出すことができます(この例はhereです)

関連する問題