Coucou Yannick,
Beau boulot !
Pour récupérer le chemin absolu vers ta dll, je te suggère l'alternative
suivante, dis-moi ce que tu en penses, elle consiste à utiliser le
module FileUtils :
Components.utils.import("resource://gre/modules/FileUtils.jsm");
// On pointe directement sur la dll dans le dossier
"chrome/content/dll/nvdaControllerClient.dll".
var file = FileUtils.getFile("ProfD", ["extensions",
"[email protected]", "chrome", "content", "dll",
"nvdaControllerClient.dll"]);
// On récupère le chemin dans une variable path.
var path = file.path;
Ce n'est pas beaucoup plus court que ce que tu as fait, mais ça mérite
quand même d'être connu.
Explication :
La méthode getFile du module FileUtils récupère un objet file.
Son premier paramètre, "ProfD", est une chaîne de caractères symbolisant
le dossier :
"C:Users/NomUtilisateur/AppData/Roaming/Thunderbird/Profiles/IdentifiantProfilParDéfaut".
Je t'invite à lire la doc sur le module FileUtils, elle décrit d'autres
chaînes de caractères permettant de raccourcir l'accès à des chemins
spécifiques.
https://developer.mozilla.org/en-US/Add-ons/Code_snippets/File_I_O
Le second paramètre est un array, qui devrait regrouper toute la
hiérarchie de dossiers restants, et dois se terminer par le nom du
fichier en question.
Voili voilou, merci à toi.
Bien amicalement,
Abdel.
Le 28/05/2017 à 05:16, yannick a écrit :
salut Abdel, et bien c'est fait, je suis arrivé au bout .....
enfin presque ...
une mise à jour de universal speech serait le topt du top ...
ci dessous je te mets juste par curiosité mon petit bout de script ...
Components.utils.import("resource://gre/modules/ctypes.jsm");
function chichiTTS (){
// je construis le chemin, je n'ai pas trouvé de fonction directe
...let basename =OS.Path.basename (OS.Constants.Path.profileDir)
let path =OS.Constants.Path.userApplicationDataDir
path =OS.Path.join (path
,"Profiles",basename,"extensions","[email protected]","chrome","content","dll")
// ouverture de la dll let nvdaPathName =OS.Path.join (path ,
"nvdaControllerClient.dll")
let nvda= ctypes.open (nvdaPathName)
// declaration des méthodes contenus dans la dll
let nvda_say =nvda.declare ("nvdaController_speakText",
ctypes.default_abi , ctypes.void_t , ctypes.jschar.array () ,
ctypes.bool)
let nvda_isRunning = nvda.declare
("nvdaController_testIfRunning",ctypes.default_abi,ctypes.bool,)
chichiTTS.prototype.nvda_say =function (word , interrupt ){nvda_say
(word , (interrupt==undefined)?true:interrupt)}
chichiTTS.prototype.nvda_isRunning =function (){return nvda_isRunning ()}
instanciation de l'objet }
chichiTTS =new chichiTTS ()
Le 26/05/2017 à 12:20, yannick a écrit :
Merci Abdel merci beaucoup, j'ai avancé !
maintenant, il me prononce la lettre "i" du mot "oui", je vais donc y
arriver j'espère , mais comme je n'ai jamais bossé la base même du c,
je vais sans doute devoir y revenir ...
oui, j'ai bossé du lua, mais j'ai pas pensé à aller fouiller mes
archives ..
comme je m'apprête à partir, je devrais revenir vers vous après
demain, merci merci !
Le 26/05/2017 à 11:36, Abdel a écrit :
Salut Yannick,
Comme je vois que ton mail a suscité beaucoup de réactions, je me
permets d'envoyer ma petite contribution dans le tas, en espérant
que tu auras le temps de la lire lol !
Mdrrrr...
Tout d'abord, un grand merci à toi de partager avec nous ces
techniques modernes d'accès aux méthodes d'une DLL externe en
JavaScript.
Je pense que tu dois certainement déjà du avoir utilisé les accès
FFI en langage lua, par exemple, ou l'accès aux API sous la forme
d'objets com, en VBScript, langage script de JAWS, etc...
Revenons à ta question initiale :
La méthode declare de ton objet lib requiert plusieurs paramètres,
selon le fait que tu fasses appel à une fonction externe figurant
dans la dll, ou uniquement à une propriété.
Si c'est juste une propriété, tu as juste besoin de son nom sous la
forme d'une chaîne de caractères en premier paramètre, et à sont
type en C en second paramètre.
C'est d'ailleurs bien documenté ici :
https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/js-ctypes_reference/Library#declare%28%29
Cependant, si c'est une fonction, voici ce dont tu vas avoir besoin.
1. Le nom de la fonction en premier paramètre sous la forme d'une
chaîne de caractères.
2. Une constante ABI (Application Binary Interface), qui va
permettre à ton JavaScript de mieux pouvoir savoir comment se
comporter avec cette fonction.
Par exemple, si c'est une fonction figurant dans une DLL Windows, il
faudra juste mettre ctypes.winapi_abi ou ctypes.stdcall_abi.
Comme dans ton cas, ce n'est pas le cas, tu dois mettre
ctypes.default_abi.
3. Le troisième paramètre te demande d'indiquer le type en C du
retour de ta fonction.
4. À partir de ce paramètre 4, tu dois fournir les différents types
en C de chaque paramètres de ta fonction, si bien sûr, celle-ci
comporte des paramètres.
Si ce n'est pas le cas, on s'arrête au paramètre 3.
Cette méthode declare de l'objet library devrait retourner une
fonction, qui va cibler la propriété ou méthode demandée, selon le
contexte.
Donc, premier réflexe à avoir, bien scruter les différentes
fonctions et propriétés de ta DLL, pour mieux savoir comment les
exploiter.
Voili voilou, merci à toi.
Bien amicalement,
Abdel.
Le 26/05/2017 à 02:40, yannick a écrit :
bonjour, comme toujours, je m'écroule juste devant le verre à
sangria .
je suis dans thunderbird, et je souhaite utiliser universal speech.
pour cela j'importe le module ctypes
(Components.utils.import("resource://gre/modules/ctypes.jsm");
puis j'ouvre la dll de cette manière :
us =ctypes.open ("C:/UniversalSpeech/bin/UniversalSpeech.dll")
et c'est maintenant que je bloque parce que je dois faire une
déclaration et je ne comprends pas trop les paramètres,.
je vous fais un copié collé,, et si vous avez une idée,cela me
dépannera, merci !
declare()
Declares an API from the native library, allowing it to be used
from JavaScript. This can be used both for exported data symbols
and for functions.
CData declare(
name[,
abi,
returnType
argType1,
...]
);
Parameters
name
The name of the symbol exported by the native library that is to be
declared as usable from JavaScript
abi
The ABI used by the exported function; this will be
ctypes.default_abi for most libraries, except for Windows
libraries, which will be ctypes.winapi_abi or ctypes.stdcall_abi.
See ABI constants. You don't need to provide this for exported
data; it's only needed for function declarations.
returnType
The CType type returned by the defined API, if it's a function.
This parameter should not be provided if the API is an exported
data symbol.
argType1...argTypeN
Zero or more parameter CType may be specified for the parameters of
the function being declared. These should not be provided if the
API is an exported data symbol rather than a function.
Return value
A FunctionTypeCData object representing the declared API.
Exceptions thrown
• ctypes
• CType
• FunctionType
• ABI
TypeError
The return type was specified as an array.
source
https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/js-ctypes_reference/Library
Progliste :
Pour se d�sinscrire de la liste :
mailto:[email protected]?subject=unsubscribe
Pour voir les archives de la liste :
http://www.mail-archive.com/[email protected]/
Je vous rappelle que les pi�ces jointe sont activ�s leur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.
Progliste :
Pour se d�sinscrire de la liste :
mailto:[email protected]?subject=unsubscribe
Pour voir les archives de la liste :
http://www.mail-archive.com/[email protected]/
Je vous rappelle que les pi�ces jointe sont activ�s leur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.
Progliste :
Pour se d�sinscrire de la liste :
mailto:[email protected]?subject=unsubscribe
Pour voir les archives de la liste :
http://www.mail-archive.com/[email protected]/
Je vous rappelle que les pi�ces jointe sont activ�s leur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.
Progliste :
Pour se d�sinscrire de la liste :
mailto:[email protected]?subject=unsubscribe
Pour voir les archives de la liste :
http://www.mail-archive.com/[email protected]/
Je vous rappelle que les pi�ces jointe sont activ�s leur taille est
limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en
priv�, je vous r�pondrez en priv�.
Progliste :
Pour se d�sinscrire de la liste :
mailto:[email protected]?subject=unsubscribe
Pour voir les archives de la liste :
http://www.mail-archive.com/[email protected]/
Je vous rappelle que les pi�ces jointe sont activ�s leur taille est limit� � 2 MO
Pour acc�der aux fichiers de la liste
http://outils.archive-host.com/partage.php?id=2Qar9Hy6ftzr
Ou en utilisant la nouvelle page de partage :
http://outils-n.archive-host.com/partage-fm0m7b947vglikp9Efpso94gt
Pour y ajouter des fichiers demandez-moi le ou sur la liste ou en priv�, je
vous r�pondrez en priv�.