2011-04-19 64 views
0

所以这是我得到的。在我花几天在黑暗中投掷飞镖之前。我想知道是否有人有任何提示。我显然不能直接从pShellLink调用方法。所以我需要一种方式来宣布他们,但我无法弄清楚如何。 Javascript ctype还没有很多例子。使用JavaScript创建外壳链接js-ctypes

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

回答