#javascript #ctypes #shell32
#javascript #ctypes #shell32
Вопрос:
Итак, это все, что у меня есть. Прежде чем я проведу дни, бросая дротики в темноте. Я хотел узнать, есть ли у кого-нибудь какие-нибудь советы. Очевидно, что я не могу напрямую вызывать методы из pShellLink. Итак, мне нужен способ объявить их, но я не могу понять, как. Примеров на Javascript ctype пока не так много.
Components.utils.import("resource://gre/modules/ctypes.jsm");
var libshell32 = ctypes.open("shell32.dll");
const CLSID_ShellLink = '00021401-0000-0000-C000-000000000046';
const IID_IShellLink = '000214EE-0000-0000-C000-000000000046';
const IID_IPersistFile = '0000010b-0000-0000-C000-000000000046';
const CLSCTX_INPROC_SERVER = 0x1;
var CoInitialize = libshell32.declare("CoInitialize", ctypes.winapi_abi, ctypes.int32_t,
ctypes.jschar.ptr); // LPVOID
var CoCreateInstance = libshell32.declare("CoCreateInstance", ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, // REFCLSID
ctypes.jschar.ptr, // LPUNKNOWN
ctypes.jschar.ptr, // DWORD
ctypes.int32_t, // REFIID
ctypes.voidptr_t); // LPVOID
var pPersistFile; // ??
var pShellLink; // ??
var hRes; // ??
hRes = CoInitialize(null);
hRes = CoCreateInstance(CLSID_ShellLink,null,CLSCTX_INPROC_SERVER,IID_IShellLink,pShellLink);
if (SUCCEEDED(hRes))
{
hRes = pShellLink->lpVtbl->SetPath(pShellLink, "c:somefile");
hRes = pShellLink->lpVtbl->SetArguments(pShellLink, "-somearg");
hRes = pShellLink->lpVtbl->SetDescription(pShellLink, "SomeDescription");
hRes = pShellLink->lpVtbl->SetShowCmd(pShellLink, '1');
hRes = pShellLink->lpVtbl->SetWorkingDirectory(pShellLink, "c:somedir");
hRes = pShellLink->lpVtbl->SetIconLocation(pShellLink, "c:pathtoicon", '1');
/* Use the IPersistFile object to save the shell link */
hRes = pShellLink->lpVtbl->QueryInterface(pShellLink, /* existing IShellLink object */
amp;IID_IPersistFile, /* pre-defined interface of the IPersistFile object */
amp;pPersistFile); /* returns a pointer to the IPersistFile object */
if (SUCCEEDED(hRes))
{
hRes = pPersistFile->lpVtbl->Save(pPersistFile, "c:pathtoInk", TRUE);
pPersistFile->lpVtbl->Release(pPersistFile);
}
pShellLink->lpVtbl->Release(pShellLink);
}
Ответ №1:
Недавно я реализовал именно эту функциональность. Смотрите первое вложение к этой ошибке:https://bugzilla.mozilla.org/attachment.cgi?bugid=738501amp;action=viewall