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
一起使用,则会出现以下错误:
(二者之间的区别是tohIconBig
I传递窗口句柄和tohIconBigNull
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"
*/