Javascript setConsoleIcon抛出奇怪错误(未记录的WinAPI到JS Ctypes)

Javascript setConsoleIcon抛出奇怪错误(未记录的WinAPI到JS Ctypes),javascript,firefox-addon,jsctypes,Javascript,Firefox Addon,Jsctypes,有一个名为setConsoleIcon的未编译winapi fetarue。我在这里和这个家伙讨论过: < C++代码是: void SetIcon(LPCTSTR icon) { HMODULE hMainMod = GetModuleHandle(NULL); HICON hMainIcon = ::LoadIcon(hMainMod, icon); HMODULE hMod = LoadLibraryA("Kernel32.dll"); typedef B

有一个名为
setConsoleIcon
的未编译winapi fetarue。我在这里和这个家伙讨论过:

< C++代码是:

void SetIcon(LPCTSTR icon) {
    HMODULE hMainMod = GetModuleHandle(NULL);
    HICON hMainIcon = ::LoadIcon(hMainMod, icon);
    HMODULE hMod = LoadLibraryA("Kernel32.dll");
    typedef BOOL (CALLBACK *InsHook)(unsigned long, HANDLE);
    typedef DWORD (__stdcall *SCI)(HICON);
    SCI pfnSetConsoleIcon = reinterpret_cast<SCI>(GetProcAddress(hMod, "SetConsoleIcon"));
    pfnSetConsoleIcon(hMainIcon);
    FreeLibrary(hMod);
}
如果您注释掉最后一行并复制并运行它,您不会遇到任何问题

但是,如果您取消注释它并将其与
hIconBig
hIconBigNull
一起使用,则会出现以下错误: (二者之间的区别是to
hIconBig
I传递窗口句柄和to
hIconBigNull
I传递null作为句柄)

/*
“缺少变量名
WCA_evalWithDebugger@resource://gre/modules/commonjs/toolkit/loader.js->resource://gre/modules/devtools/server/actors/webconsole.js:1069:7
WCA_onEvaluateJS@resource://gre/modules/commonjs/toolkit/loader.js->resource://gre/modules/devtools/server/actors/webconsole.js:734:9
差示扫描量热仪_onPacket@resource://gre/modules/commonjs/toolkit/loader.js->resource://gre/modules/devtools/server/main.js:1098:9
LDT_发送/resource://gre/modules/devtools/server/transport.js:279:11
使无误/resource://gre/modules/devtools/DevToolsUtils.js:84:7"
*/

我无法解释这个
缺少变量名的原因。有什么想法吗?

这里的问题是您的
var void=…
void
是Javascript中的保留关键字,因此不能在中用作变量名

其他随机观察:

  • 当声明函数为
    void
    或不关心返回值时,请使用
    ctypes.void\t
  • 不要用窗口句柄调用。应该使用模块句柄或null调用它。因为您正在加载独立图像,所以您需要使用null来调用它
  • 一般来说,使用未记录的API不是一个好主意,如果可行,应该避免使用。我知道,首先使用
    GetConsoleWindow()
    获取控制台窗口句柄,然后发送
    WM\u SETICON
    就可以了,这就是使用文档化的功能
  • 我不知道你到底想在这里干什么。Firefox(通常)根本没有控制台窗口

Aw dang控制台窗口无法工作:(在Win7中,我无法在任务栏中设置firefox图标,因为它的“未锁定”。当它被固定和未固定时,它显然有一个单独的图标。我在其他主题中使用的固定方法使用了
SHGetWindowProp
之类的东西。啊,哦,这只是一个研究,我会继续找的谢谢你。
Cu.import('resource://gre/modules/ctypes.jsm');

var kernel32 = ctypes.open('kernel32.dll');
var user32 = ctypes.open('user32.dll');

var SetConsoleIcon = kernel32.declare('SetConsoleIcon', ctypes.winapi_abi, ctypes.voidptr_t, // i have no idea what return value is so made it voidptr_t
    ctypes.voidptr_t // HICON
);

 /* http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx
* HANDLE WINAPI LoadImage(
* __in_opt_ HINSTANCE hinst,
* __in_ LPCTSTR lpszName,
* __in_ UINT uType,
* __in_ int cxDesired,
* __in_ int cyDesired,
* __in_ UINT fuLoad
* );
*/
var LoadImage = user32.declare('LoadImageA', ctypes.winapi_abi, ctypes.voidptr_t,
    ctypes.voidptr_t,
    ctypes.char.ptr,
    ctypes.unsigned_int,
    ctypes.int,
    ctypes.int,
    ctypes.unsigned_int
);

var IMAGE_BITMAP = 0;
var IMAGE_ICON = 1;
var LR_LOADFROMFILE = 16;


var aDOMWindow = window;
var baseWindow = aDOMWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.treeOwner
.QueryInterface(Ci.nsIInterfaceRequestor)
.nsIBaseWindow;

var nativeHandle = baseWindow.nativeHandle;
var targetWindow_handle = ctypes.voidptr_t(ctypes.UInt64(nativeHandle));


var hIconBig = LoadImage(targetWindow_handle, 'C:\\Users\\noit\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\1agqx535.default2\\profilist32.ico', IMAGE_ICON, 256, 256, LR_LOADFROMFILE);
var hIconBigNull = LoadImage(null, 'C:\\Users\\noit\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\1agqx535.default2\\profilist32.ico', IMAGE_ICON, 256, 256, LR_LOADFROMFILE);
var void = SetConsoleIcon(hIconBig); //SetConsoleIcon(hIconBigNull);
/*
"missing variable name
WCA_evalWithDebugger@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/server/actors/webconsole.js:1069:7
WCA_onEvaluateJS@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/server/actors/webconsole.js:734:9
DSC_onPacket@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/server/main.js:1098:9
LDT_send/<@resource://gre/modules/devtools/dbg-client.jsm -> resource://gre/modules/devtools/server/transport.js:279:11
makeInfallible/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/DevToolsUtils.js:84:7"
*/