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

rubylouvre 阅读:20 2024-09-07 23:24:14 评论:0

我正在尝试通过 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. 


标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号