Comment charger dll à partir du dossier de données addon SDK?

Nous utilisons IDE Web pour créer des addons. Mon test.dll est situé dans le dossier de données. Comment le charger par js-ctypes?

Le chemin absolu comme "c: \ test.dll" n'a aucun problème, mais je ne peux pas utiliser ce chemin pour le distribuer.

var lib = ctypes.open("c:\\test.dll"); // works but how i get path to addon inner data directory? 

Je vous donne la voie de la moindre résistance ici … Il existe d'autres façons, comme le déballage manuel de la DLL à partir de votre XPI installé, mais cela devient trop large, propice aux erreurs et compliqué.

  1. Vous devez définir "unpack": true dans votre package.json, afin que le XPI soit décompressé lors de l'installation.
  2. Vous devez utiliser self.data.url() et divers autres outils pour trouver le chemin réel du fichier DLL. L'URI peut être enveloppé à plusieurs reprises dans les "URI" ressources: "et / ou" chrome: "avant qu'il ne s'agisse d'un URI de fichier. Donc, cela doit également être déballé.

     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"); } } const {data} = require("self"); let dll = 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.