dll之在 C/C++ DLL 中导出 MSVS 2013 中的函数,供 Mozilla js-ctypes 使用
我正在尝试通过 FireFox 的 js-ctypes 从 MSVS 2013 C/C++ DLL 访问一些导出的函数。 我试过了:
- 将“编译为”设置更改为 C 和 C++
- 更改平台位数(32 位与 64 位)。
- 使用此处的所有可用 ABI 常量:https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/js-ctypes_reference/ctypes (
default_abi
,stdcall_abi
,winapi_abi
) - 我已经使用“Dependency Walker”检查了我的 DLL,并确保它的名称没有被修饰并且我的函数确实被导出了。
这是我的 DLL 代码:
#define DllExport extern "C" __declspec(dllexport)
DllExport void Test()
{
::MessageBox(NULL, _T("Test!"), _T("Title"), MB_OK);
}
无论我尝试什么,似乎我总是会得到这个错误:
console.error: myxpi:
Message: Error: couldn't find function symbol in library
Stack:
openScratchpad@resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///c:/users/kgk/appdata/local/temp/tmpdyrqfd.mozrunner/
extensions/jid1-QEiY1nT1Uinqug@jetpack.xpi!/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-qeiy1nt1uinqug-at-jetpack/myxpi/lib/main.js:34:18
button<.onClick@resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///c:/users/kgk/appdata/local/temp/tmpdyrqfd.mozrunner/extensions/jid1-QEiY1nT1Uinqug@jetpack.xpi!/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-qeiy1nt1uinqug-at-jetpack/myxpi/lib/main.js:16:9
有谁知道正确的设置是什么?
FF 是 32 位的(据我所知),但我不知道它是否使用其他类似 python 的东西来加载 DLL。
我认为只要导出函数使用正确的声明(例如 __cdecl
),“编译为”并不重要。
虽然我不确定这会产生什么(但我的项目设置是针对 __cdecl
):
#define DllExport extern "C" __declspec(dllexport)
但我也尝试过替换它并使用 DEF 文件...
知道为什么似乎什么都不起作用吗?
相关问题:
Making a C DLL in Visual Studio suitable for use by js-ctypes in Mozilla
请您参考如下方法:
好的。这是我用过的:
- 为 32 位平台build设置(来自配置管理器)。
- 调用约定:__cdecl (/Gd)
- 编译为:编译为 C++ 代码 (/TP)
- 不使用 DEF 文件(链接器->输入->模块定义文件)
这段代码:
#define DllExport extern "C" __declspec(dllexport) DllExport void Test() { ::MessageBox(NULL, _T("Test!"), _T("Title"), MB_OK); }
JS:
var lib = ctypes.open("C:\\Users\\user\\Desktop\\myXPI\\lib\\MyAddonCore.dll");
var test = lib.declare("Test", ctypes.winapi_abi, ctypes.void_t);
test();
lib.close();
您必须为没有参数的函数定义一个 void
参数(它用于返回值,正如下面指出的 Kinjal Dixit
)!
不幸的是,这没有找到 DLL 路径(我想知道为什么......:|):
var lib = ctypes.open(self.data.url('MyAddonCore.dll'));
干杯!
更新:
这里是一些获取 DLL 路径的代码:
http://www.acnenomor.com/3342758p1/how-to-load-dll-from-sdk-addon-data-folder
const {Cc, Cu, Ci} = require("chrome");
Cu.import("resource://gre/modules/Services.jsm");
const ResProtocolHandler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
const ChromeRegistry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIChromeRegistry);
function resolveToFile(uri) {
switch (uri.scheme) {
case "chrome":
return resolveToFile(ChromeRegistry.convertChromeURL(uri));
case "resource":
return resolveToFile(Services.io.newURI(ResProtocolHandler.resolveURI(uri), null, null));
case "file":
return uri.QueryInterface(Ci.nsIFileURL).file;
default:
throw new Error("Cannot resolve");
}
}
var self = require("sdk/self");
let dll = self.data.url("test.dll");
dll = resolveToFile(Services.io.newURI(dll, null, null));
console.log(dll.path); // dll.path is the full, platform-dependent path for the file.
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。