質問

私は、MS Office Communicator 2007コントロールを提供するブラウザSilverlightアプリに取り組んでいます。私は使用しています Automation SDK. 。 SDKにインストールされたドキュメントは、IMESSENGER2インターフェイスにMyGroupsプロパティがあると述べています。これにより、ユーザーが定義したグループが返されますが、使用しようとすると、 NotImplementedException. 。これが私が使用しているコードです:

dynamic communicator = AutomationFactory.CreateObject("Communicator.UIAutomation");
communicator.AutoSignin();
foreach (dynamic g in communicator.MyGroups)
{
    //Do something with the group
}

mygroupsをmyContactsに置き換えると、連絡先リストを正常に取得できます。 imessenger2インターフェイスでプロパティにアクセスするには、何か違うことをしなければなりませんか?私はウェブ上で、MyGroupsがWindows Messengerのために廃止されたと言っているいくつかのことを見てきましたが、ドキュメントからは、MS Office Communicatorが利用できるように思われます。

MyGroupsを使用できない場合、ユーザーが作成したグループを取得する別の方法はありますか?

役に立ちましたか?

解決

ここでの問題は、MyGroupsプロパティがnotscriptableとしてマークされていることです。つまり、AutomationFactoryを使用して行う方法で呼び出すことはできません。セキュリティ上の理由から、Automation APIの一部のプロパティとメソッドはスクリプト不可能ではありません。これは、コミュニケーターの自動化を避け、知らないうちに特定のタスクを実行することを避けるためです。

Silverlightのcom Interopは、たとえばvbscriptからAPIを作成および呼び出すのと同じ方法で扱われているように見えるため、スクリプト不可能なプロパティと方法にアクセスすることはできません。を参照してください 参照 どのプロパティとメソッドがスクリプト不可能であるかの詳細については。

私はこれがあなたのアプリを真剣に妨げるだろうと推測しています。あなたを傷つけているのは、Silverlight OOBと一緒に行くという決断だと思います。 Silverlightではなく、WPF(またはWinforms)を使用できる方法はありますか?これを行った場合は、APIを直接参照し、すべてのプロパティ/メソッドに完全にアクセスできます。

そうでなければ、あまりにも多くのオプションを考えることはできません。トラップすることはできません OnContactAddedToGroup これはスクリプト不可能ではないため、イベントです。

それ そうかもしれない APIを.NETアセンブリでラップし、COMを介して露出し、同じ方法でインスタンス化することができますが、スクリプト不可能な人はまだ尊重されている可能性があるため、何も購入しません。それを試さずに言うのは難しく、それでもかなり恐ろしい解決策です。

編集: :ラッパーの方法を試してみました(顧客の概念実証として同様のことをするために必要なことが必要です)、それは機能しているようです。これが私がやった方法です:

新しい.NETクラスライブラリを作成します。 comインターフェイスを定義します。

[ComVisible(true)]
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")]
public interface IComm
{
    string GetMyGroups();
}

そのインターフェイスを実装するクラスを定義します(SDKからCommunicatorapi.dllを参照する必要があります):

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")]
[ProgId("Test.Comm.1")]
public class Comm : IComm
{
    public string GetMyGroups()
    {
        var comm = new CommunicatorAPI.MessengerClass();

        var groups = comm.MyGroups as IMessengerGroups;
        return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray());
    }
}

ビルドし、使用して登録します レゴスム. 。次に、OOB Silverlightアプリから電話してください。

dynamic communicator = AutomationFactory.CreateObject("Test.Comm.1");
MessageBox.Show(communicator.GetMyGroups());

同様に、同じ手法がLync APIを使用して機能します。

public string GetMyGroups()
{
    var comm = LyncClient.GetClient();
    return string.Join(", ", comm.ContactManager.Groups.Select(g => g.Name).ToArray());
}

これはうまくいきますが、おそらく正当な理由でそこにあったセキュリティ制限を中心に取り組んでいるので、それが良い習慣であるかどうかは本当に言うことはできません。起こりうる最悪の事態は、コントロールのprogidを知っていれば、悪意のあるWebページがコンポーネントを使用できる可能性があることだと思います。

編集:また、この方法を使用すると、メモリリークに注意する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top