gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:18:24 25 4
gpt4 key购买 nike

有一个未记录的 winapi fetarue,名为 setConsoleIcon。我在这里和这个人讨论过:

https://github.com/john-peterson/john-peterson/issues/1#issuecomment-47852560

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

我将其转换为:

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

如果您注释掉最后一行并复制并运行它,则不会出现任何问题。

但是,如果您取消注释并将其与 hIconBighIconBigNull 一起使用,则会收到此错误:(两者之间的区别是,对 hIconBig 传递窗口句柄,对 hIconBigNull 我传递 null 作为句柄)

/*
"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"
*/

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

最佳答案

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

其他随机观察:

  • 在声明 void 函数或不关心返回值的函数时,请使用 ctypes.void_t
  • 切勿调用 LoadImage带窗 Handlebars 。应该使用模块句柄或 null 来调用它。您需要使用 null 来调用它,因为您正在加载独立图像。
  • 一般来说,使用未记录的 API 并不是一个好主意,如果可行的话应该避免。我知道首先使用 GetConsoleWindow() 获取控制台窗口句柄,然后发送 WM_SETICON 效果很好,这就是使用记录的功能。
  • 我不知道你想在这里做什么。 Firefox(通常)根本没有控制台窗口。

关于javascript - setConsoleIcon 抛出奇怪的错误(未记录的 WinAPI 到 JS-Ctypes),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com