В 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);
}