Это COM-объект.Вам просто нужно создать его и передать его интерфейсам (с достаточной реализацией), чтобы он заработал.
Исследователь (т.е. вы) попросит расширение оболочки добавить элементы в другие HMENU.Затем Explorer (то есть вы) вызывает пункт меню в ответ пользователю.
К счастью, все в оболочке является интерфейсом - так что вы можете притворяться, что хотите.Вам просто нужно прочитать контракт SDK с другой стороны .
Помните : Расширение оболочки не имеет дляразмещаться в Проводнике .Многие нет.Многие размещаются в диалоговом окне «Сохранить как» в CommCtrl.
В вашем случае это даже проще .
- Создайте запрос COM-объекта
- для его
IShellExtInit
интерфейса и вызовите .Initialize
. - запрос для его
IContextMenu
интерфейса - вызов
IContextMenu.QueryContextMenu
, что позволяет ему добавлять элементы в HMENU
- вызов
IContextMenu.Invoke
Опять случай чтения контракта с другой стороны.
Какой-то псевдокод:
var
ClassID: TGUID;
unk: IUnknown;
shellext: IShellExtInit;
dataObject: IDataObject;
hkeyProgID: HKEY;
contextMenu: IContextMenu;
commandInfo: CMINVOKECOMMANDINFO;
begin
ClassID := ProgIDToClassID('PDFTransformer3.PDFTContextMenu');
unk := CreateComObject(ClassID);
shellExt := unk as IShellExtInit;
{
For shortcut menu extensions,
pdtobj identifies the selected file objects,
hkeyProgID identifies the file type of the object with focus, and
pidlFolder is either NULL (for file objects) or specifies the folder
for which the shortcut menu is being requested
(for folder background shortcut menus).
}
shellExt.Initialize(
nil, //pidlFolder, null for file objects
dataObject, //IDataObject of the selected file
hkeyProgID); //HKEY of the file type of the object with focus
contextMenu := unk as IContextMenu;
contextMenu.QueryContextMenu(
menuHandle, //HMENU, A handle to the shortcut menu. The handler should specify this handle when adding menu items.
0, //integer, The zero-based position at which to insert the first new menu item.
100, //The minimum value that the handler can specify for a menu item identifier.
200, //The maximum value that the handler can specify for a menu item identifier.
CMF_NORMAL); //optional flags
contextMenu.InvokeCommand(commandInfo);
Это все, что я получаю, читая документацию и догадываясь, что делать.Теперь мне нужно пописать и пойти домой, чтобы поиграть в Portal 2