0

これは私が得た限りです。暗闇の中でダーツを投げて何日も過ごす前に。誰かヒントがあれば知りたいです。もちろん、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 */
                                            &IID_IPersistFile, /* pre-defined interface of the IPersistFile object */
                                            &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);
}
4

1 に答える 1

1

私は最近、まさにこの機能を実装しました。このバグの最初の添付ファイルを参照してください: https://bugzilla.mozilla.org/attachment.cgi?bugid=738501&action=viewall

于 2012-03-23T20:44:04.700 に答える