Как вызвать метод интерфейса COM, если у вас есть IntPtr? - PullRequest
0 голосов
/ 01 марта 2020

В Windows я хочу получить FileOpenDialog, который уже существует в другом процессе, как дочерний элемент другого приложения и заставить его перейти в указанную папку c. Я надеюсь, что COM-взаимодействие может помочь в этом. Поскольку я делаю некоторые исследования, я пытаюсь сначала просто открыть новый диалог с помощью COM, но я застрял в какой-то момент. Я могу получить IntPtr для экземпляра диалога и IntPtr для его интерфейса, в котором есть метод, который я хочу вызвать, но я не знаю подходящего метода для его вызова. Вот мой код:

static void Main(string[] args)
{            
    // the implementation COM object: FileOpenDialog
    var classId = new Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7");
    var fileOpenDialogType = Type.GetTypeFromCLSID(classId, true);
    var fileOpenDialog = Activator.CreateInstance(fileOpenDialogType);            
    IntPtr pUnknown = Marshal.GetIUnknownForObject(fileOpenDialog);

    // the COM interface: IFileOpenDialog
    var interfaceId = new Guid("d57c7288-d4ad-4768-be02-9d969532d960");
    var result = Marshal.QueryInterface(pUnknown, ref interfaceId, out IntPtr pIFileOpenDialog);

    // at this point:
    // result = 0
    // pIFileOpenDialog = some non-zero value (for a memory address, I assume)

    // But how can I invoke the "Show" method of the dialog? Something like this:
    //Invoke("Show", pIFileOpenDialog);

    Marshal.Release(pUnknown);
    Marshal.Release(pIFileOpenDialog);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...