Как найти членов динамически загружаемого com-объекта - PullRequest
1 голос
/ 05 октября 2011

Я пытаюсь использовать объект OLE COM, для которого у меня нет документации. Я загружаю com объект динамически:

dynamic comObj = Activator.CreateInstance(Type.GetTypeFromProgID("The Program ID"));

Идентификатор программы в реестре указывает на какой-то exe (или, по крайней мере, это то, что я думаю, я не могу сказать наверняка. Есть ли способ узнать, на что именно он указывает). Я попытался загрузить исполняемый файл в OLE COM Viewer, но я не смог получить какую-либо полезную информацию из него. Например, я не смог найти метод, который я точно знал, был там. На самом деле, после загрузки comObject я могу вызвать этот метод без каких-либо проблем, но я хотел бы знать, есть ли способ, которым я могу перечислить / просмотреть все члены этого COM-объекта.

Ответы [ 3 ]

0 голосов
/ 05 октября 2011

Учитывая ProgID, вы можете использовать функции API и / или искать реестр (например, ключ HKEY_CLASSES_ROOT) для COM-сервера CLSID и двоичный файл, в котором размещен класс, включая полный путь к исполняемому файлу.

Если у вас есть ссылка на библиотеку типов, вы также можете загрузить ее и проверить информацию о реализованном интерфейсе и интерфейсе.Вы также можете получить эту информацию из экземпляра COM-объекта, при условии, что он реализует интерфейсы, такие как IDispatch, IDispatchEx, IProvideClassInfo.

0 голосов
/ 05 октября 2011

Я не помню, где я скопировал этот источник. Прошу прощения у автора.

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.InteropServices.CustomMarshalers;

namespace ConsoleApplication1
{
    [
       ComImport,
       Guid("00020400-0000-0000-C000-000000000046"),
       InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
    ]
    public interface IDispatch
    {
        void Reserved();
        [PreserveSig]
        int GetTypeInfo(uint nInfo, int lcid,
           [MarshalAs(
              UnmanagedType.CustomMarshaler,
              MarshalTypeRef = typeof(TypeToTypeInfoMarshaler))]
           out System.Type typeInfo);
    }

    class Program
    {
        static void Main(string[] args)
        {
            Type t1 = Type.GetTypeFromProgID("WbemScripting.SWbemDateTime");
            Object o1 = Activator.CreateInstance(t1);

            IDispatch disp2 = o1 as IDispatch;
            if (disp2 != null)
            {
                Type t3;
                disp2.GetTypeInfo(0, 0, out t3);

                MemberInfo[] mlist3 = t3.GetMembers();
            }
        }
    }
}

Файл CustomMarshalers.dll можно найти в C: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \

0 голосов
/ 05 октября 2011

Вы можете перечислить все методы через интерфейс IDispatch, если он его поддерживает.

Вот статья MSDN, использующая IDispatch для получения информации об участнике

...