سؤال

أنا أعمل على تطبيق Out Out Out Silverlight يوفر بعض أدوات التحكم في MS Office Communicator 2007. أنا أستخدم الأتمتة SDK. المستندات التي تم تثبيتها مع حالة SDK أن هناك خاصية MyGroups في واجهة iMessenger2 ، والتي ستعيد المجموعات التي حددها المستخدم ، لكن عندما أحاول استخدامها ، أحصل على ملف 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 مميزة على أنها غير محتملة ، مما يعني أنه لا يمكنك تسميتها بالطريقة التي تقوم بها باستخدام AutomationFactory. لأسباب أمنية ، فإن بعض الخصائص والأساليب في واجهة برمجة تطبيقات الأتمتة غير قابلة للنص - هذا لتجنب الصفحات الخبيثة التي تتم أتمتة التواصل وتنفيذ بعض المهام دون أن تعرف.

يبدو أن com interop في Silverlight يتم التعامل معها بنفس طريقة إنشاء API واتصالها من VBScript ، لذلك لن تتمكن من الوصول إلى أي من الخصائص والأساليب غير القابلة للتصفية. انظر المرجعي للحصول على تفاصيل عن الخصائص والأساليب غير قابلة للنص.

أظن أن هذا سيعزى بجدية تطبيقك. أعتقد أن ما يؤلمك هو قرار الذهاب مع Silverlight OOB. هل هناك أي طريقة يمكنك استخدام WPF (أو حتى WinForms) بدلاً من Silverlight؟ إذا قمت بذلك ، فيمكنك الرجوع إلى واجهة برمجة التطبيقات مباشرة ، ولديك وصول كامل إلى جميع الخصائص/الأساليب.

خلاف ذلك ، لا يمكنني التفكير في العديد من الخيارات. لا يمكنك فخ OnContactAddedToGroup الحدث ، لأن هذا غير قابل للنص.

هو - هي قد يكون من الممكن لف واجهة برمجة التطبيقات بتجميع .NET ، وفضحها عبر com ، ثم قم بتثبيتها بنفس الطريقة - ولكن قد لا يزال يتم احترامها في هذه الحالة ، لذلك لن يشتري لك أي شيء. من الصعب القول دون تجربتها ، ولا يزال حلاً فظيعًا إلى حد ما.

يحرر: لقد أعطيت للتو طريقة Wrapper (بحاجة إلى القيام بشيء مماثل كدليل على المفهوم للعميل) ، ويبدو أنه يعمل. هذه هي الطريقة التي فعلت بها:

إنشاء مكتبة فئة .NET جديدة. حدد واجهة com:

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

حدد فئة تنفذ تلك الواجهة (ستحتاج إلى الرجوع إلى communicatorapi.dll من SDK):

[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());

لاحظ أن نفس التقنية تعمل أيضًا باستخدام API Lync:

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

على الرغم من أن هذا يعمل ، لا أستطيع حقًا أن أقول ما إذا كانت هذه ممارسة جيدة ، حيث إنها تعمل حول تقييد أمني كان هناك لسبب وجيه. أظن أن الأسوأ الذي يمكن أن يحدث هو أن صفحة ويب ضارة يمكن أن تستخدم المكون ، إذا كانت تعرف progid من عنصر التحكم.

تحرير: أيضًا ، باستخدام هذه الطريقة ، يجب أن تكون حذراً بشأن تسرب الذاكرة ، على سبيل المثال ، تأكد من إطلاق كائنات COM عند الانتهاء منها - من السهل بما يكفي للقيام بها ، فقط تحتاج إلى القليل من الانضباط ؛ O)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top