IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

importation d'une DLL C dans un script


Sujet :

Ruby

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 10
    Points
    10
    Par défaut importation d'une DLL C dans un script
    Bonjour à tous

    je me met rapidement au ruby parce que j'ai besoin d'avoir un plugin pour sketchup opérationnel dans 5 jours
    pour résumer rapidement, j'ai besoin de synchroniser mon sketchup par le réseau. Pour la communication réseau, je dois passer par une dll faite maison (impossible de contourner cette contrainte), écrite en C
    J'ai donc besoin d'importer ma DLL dans mon script ruby pour lui envoyer le nécessaire.

    j'ai terminé le script, j'ai écrit la dll, tout va bien. Mais je sèche un peu pour l'importation de la dll.
    - aprés moultes recherches, j'ai fini par comprendre qu'il me fallait importer le fichier win32api.so dans le répertoire de sketchup. C'est chose faite
    - en utilisant winapi32, j'arrive à faire des appels sur les dll standards de windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	getDesktopWindow = Win32API.new("user32", "GetDesktopWindow", [], 'L')
    	getActiveWindow = Win32API.new("user32", "GetActiveWindow", [], 'L')
    	sendMessage = Win32API.new("user32", "SendMessage", ['L'] * 4, 'L')
    	sendMessage.Call(getDesktopWindow.Call, 274, 0xf140, 0)
    par exemple, ceci fonctionne

    mais pour ce qui est de ma DLL perso, rien à faire !

    le code C de la dll:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    extern "C" __declspec(dllexport) int helloWorld(int i)
    {
    	i=0;
    	i+=50;
    	return i;
    }

    le code ruby:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    require 'sketchup.rb'
    require 'extensions.rb'
    require 'utilities.rb'
    require 'Win32API'
     
    def helloruby
    	UI.messagebox('on va faire des tests, trop cool !')
     
    	dllcalc=Win32API.new("wpf2dai.dll","helloWorld",['I'],'I')
    end
     
    if( not file_loaded?("persoTest.rb") )
        UI.menu("PlugIns").add_item("Perso") { helloruby }
    end
     
    file_loaded("persoTest.rb")

    à l'exécution, ça m'affiche bien la fenêtre de message, puis la console me donne:

    Error: #<RuntimeError: LoadLibrary: wpf2dai.dll
    >
    C:/Program Files/Google/Google SketchUp 7/Plugins/persoTest.rb:9:in `initialize'
    C:/Program Files/Google/Google SketchUp 7/Plugins/persoTest.rb:9:in `new'
    C:/Program Files/Google/Google SketchUp 7/Plugins/persoTest.rb:9:in `helloruby'
    C:/Program Files/Google/Google SketchUp 7/Plugins/persoTest.rb:13
    C:/Program Files/Google/Google SketchUp 7/Plugins/persoTest.rb:13:in `call'
    il y a quelque chose que j'ai pas compris ou quoi?

    merci !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    bon, je viens de refaire un nouveau test à la maison, avec une nouvelle DLL.
    J'ai eu la même erreur, jusqu'à ce que j'essaie de mettre le path complet vers la dll dans ma methode "new"

    il faudra que je teste au boulot pour voir si ça résout le problème, mais le problème semble à moitié résolu

    J'en arrive à ma seconde question:
    j'arrive à utiliser toutes sortes de fonctions de ma dll, prenant en paramètre des entiers, des float, des tout ce qu'on veut, grâce à 'i', 'l',...
    SAUF
    je ne sais pas comment déclarer le cas où ma méthode prend en paramètre un tableau de float
    j'ai tenté de lui filer un pointeur ('p'), mais ça marche pas

    D:/sketchupDev/sketchup/Plugins/test.rb:13:in `call': cannot convert Array into String>
    (je suis sûr qu'il existe quelque part une page web qui explique en détail les paramètres de win32api.new, mais je trouve rien d'exaustif :/)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    me revoilà, avec la réponse à ma question:

    si vous voulez envoyer un tableau de float à votre DLL, il faut utiliser la méthode pack sur votre array:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	UI.messagebox("preparing to send vertices")
    	dllperso2=Win32API.new("D:\\sketchupDev\\perso\\c++\\dllTest\\Debug\\dllTest.dll","sendVertices2dai",['i','p'],'i') # la methode prendra un entier et un pointeur de float
    	packed = coordonnees.pack("f*") #on pack le tableau en float*
    	variable2 = dllperso2.call(datacount,packed) # et on l'envoie, tranquilou
    	unpacked=packed.unpack("f*") #pour récuperer le tableau aprés, on peut toujours utiliser unpack

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Problème d'import d'une dll VB6 dans un projet Visual Basic 2010
    Par kurt225 dans le forum VB.NET
    Réponses: 12
    Dernier message: 19/02/2014, 18h35
  2. Importer une DLL Matlab dans Delphi
    Par 123djimy dans le forum Langage
    Réponses: 3
    Dernier message: 13/11/2012, 12h08
  3. importer une dll c dans windows Phone7
    Par jalil1988 dans le forum Windows Phone
    Réponses: 3
    Dernier message: 10/05/2012, 10h51
  4. Réponses: 2
    Dernier message: 09/01/2007, 11h29
  5. Problème d'importation d'une DLL dans CVI
    Par samanderson dans le forum Windows
    Réponses: 16
    Dernier message: 16/08/2006, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo