2014-12-09 2 views
3

Я пытаюсь получить доступ к некоторым экспортированным функциям из MSVS 2013 C/C++ DLL через js-ctypes FireFox. Я пробовал:Экспорт функций в MSVS 2013 в C/C++ DLL для Mozilla js-ctypes для использования

  • Изменение "Compile В разделе" Настройки для 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)
  • Я проверил мою DLL с помощью «Dependency Walker» и убедились, что его имя не было украшено, и что моя функция действительно была экспортирована.

Вот мой 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: 
    [email protected]://gre/modules/addons/XPIProvider.jsm -> jar:file:///c:/users/kgk/appdata/local/temp/tmpdyrqfd.mozrunner/ 
extensions/[email protected]!/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-qeiy1nt1uinqug-at-jetpack/myxpi/lib/main.js:34:18 
button<[email protected]://gre/modules/addons/XPIProvider.jsm -> jar:file:///c:/users/kgk/appdata/local/temp/tmpdyrqfd.mozrunner/extensions/[email protected]!/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

ответ

5

OK. Вот что я использовал:

  • Настройки сборки для 32-битной платформы (из конфигурационного менеджера).
  • Вызов конвенции: __cdecl (/ Б)
  • Compile В: Компиляция в C++ код (/ TP)
  • используя не DEF файлы (Linker-> Вход-> Модуль Definition File)
  • Этот код:

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

Ура!


Update:

А вот какой-то код, чтобы получить путь 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. 
+0

Удивительный ответ! Спасибо, что поделился. Пожалуйста, пометьте ваши будущие сообщения с помощью firefox-addon, не так много людей просматривают jsctypes, но они всегда делают этот тег firefox-addon, я полностью пропустил эту тему. – Noitidart

+1

, чтобы прояснить вопрос о том, «вы должны определить аргумент void для функций без аргументов», на самом деле это тип возвращаемого вами типа void. –

Смежные вопросы