gpt4 book ai didi

dll - 在 C/C++ DLL 中导出 MSVS 2013 中的函数,供 Mozilla js-ctypes 使用

转载 作者:行者123 更新时间:2023-12-01 10:45:04 24 4
gpt4 key购买 nike

我正在尝试通过 FireFox 的 js-ctypes 从 MSVS 2013 C/C++ 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

Build a DLL to be used by Mozilla js-ctypes

最佳答案

好的。这是我用过的:

  • 为 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.

关于dll - 在 C/C++ DLL 中导出 MSVS 2013 中的函数,供 Mozilla js-ctypes 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27381478/

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