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

Windows Discussion :

Débutant : juste pour démarrer


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 56
    Points : 38
    Points
    38
    Par défaut Débutant : juste pour démarrer
    Bonjour à tous,

    Je m'interesse à la création de dll pour partager du code, mais je suis complètement perdu.

    Je voudrais, pour commencer, simplement par partager la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int testInt ()
    {
    	return 55 ;
    }
    pour faire un essai.

    Dans une autre application, j'aimerai déclarer la fonction avec une commande du style (avec basic)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Declare Function testInt Lib "dll.dll" () As Integer
    Pour créer la dll, j'utilise Visual Studio. J'ai un projet dll composé de 3 dossiers. J'ai créer mon code dans un fichier main.cpp du dossier Sources Files. J'ai l'impression qu'il faut également utiliser un fichier d'en tête mais j'ai rien compris.

    Si quelqu'un pouvait me filer un coup de pouce ce serait sympa.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Déjà, ta DLL, elle est faite en C (fichier.c) ou en C++ (.cpp) ?

    Ensuite, le fichier d'en-tête sera utiliser par les autres programmes C ou C++ qui utiliseront la DLL.

    Je ne connais pas bcp sur le Visual Basic, mais il me semble qu'il y a des trucs bien lourds qu'il faut prendre en compte pour utiliser une DLL...


    Au diveau de la DLL elle-même, il y a deux moyens de parager (on dit "exporter") une fonction: soit créer un fichier .def avec une syntaxe précise que je n'ai pas en tête, soit ajouter ceci à la définition de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int __declspec(dllexport) testInt(void)
    {
    return 55;
    }
    (d'ailleurs, si tu regardes l'exemple de DLL créé par Visual studio (le 6 en tout cas), le fichier d'en-tête est généré tout seul et permet de faire ça. via une macro. Il me semble que c'est aussi le cas de dev-c++)[/code]

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    J'utilise un fichier .cpp qui ne contient que le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int __declspec(dllexport) testInt(void) 
    { 
    return 55; 
    }
    Si je comprends bien ce que tu m'as dis, je n'ai besoin, pour l'instant que de ça pour partager mon code : pas besoin d'un fichier .h ou autre, c'est bien ça ?

    Je compile donc cette feuille de code qui se transforme en plusieurs fichiers (1 dll, 1 exp, ....).


    Dans un autre programme VB celui la j'utilise la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Declare Function testInt Lib "dll.dll" () As Integer
    Cette commande fonctionne, je la connais bien. D'ailleurs, si la dll ne se trouve pas au bon endroit cela me dit qu'il n'a pas pu la charger.

    Pourtant lorsque j'essaye d'utiliser la fonction testInt j'obtient l'erreur suivante :
    Informations supplémentaires*: Impossible de trouver le point d'entrée testInt dans la DLL d:\temp\notesHide.dll.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Le fichier .h sert si tu veux utiliser ta dll depuis du code C/C++. Là tu es en VB, et tu fais une sorte de .h pour VB avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function testInt Lib "dll.dll" () As Integer
    pour ton erreur, 2 possibilités:
    - la fonction n'est pas exportée, ce qui ne semble pas être le cas
    - elle est exportée à la C++, avec encodage du nom (name mangling).

    Si ton fichier porte l'extension .cpp, rajoute extern "C" devant la déclaration de ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C" int __declspec(dllexport) testInt(void) 
    { 
    return 55; 
    }
    un outil indispensable quand on parle de dll:
    http://www.dependencywalker.com/

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Merci beaucoup, cela fonctionne maintenant avec cette commande.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Médinoc
    Je ne connais pas bcp sur le Visual Basic, mais il me semble qu'il y a des trucs bien lourds qu'il faut prendre en compte pour utiliser une DLL...
    Exact, on se trouve vite confronté aux différences de types de données.
    Si, dans une DLL en C, une fonction modifie le contenu d'une chaîne (char *) dont le pointeur est reçu en paramètre, le programme en VB devra "couper" la chaîne à partir de vbNullChar ('\0' en C)...et c'est un cas simple...
    Si notre fonction (toujours en C) doit retourner une chaîne de caractères, on entre dans le joyeux monde d'OLE Automation (SysAllocString() & Co.) et son type fourre-tout, le "variant".
    Bref : il faut avoir envie.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Merci pour cette précision.
    J'étais justement en train de me demander ce qu'il se passait sur cette **** de chaine de caractère qui revenait avec n'importe quoi ....

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Une autre chose qui a son importance : la convention d'appel.
    Les programmes en C et en VB n'utilisent pas les mêmes :
    - en C (CDECL), la fonction appelante place les arguments [1] sur la pile avant d'appeler une fonction et fait le ménage après l'exécution de la fonction appelée ;
    - en VB (et en Pascal), la fonction appelante place les arguments à transmettre à la fonction appelée sur la pile MAIS c'est la fonction appelée qui fait le ménage sur la pile avant de retourner.
    Notes : l'ordre des arguments sur la pile n'est pas le même dans les deux cas et, si ma mémoire est bonne, la convention PASCAL ne permet pas d'appeler une fonction avec un nombre variable d'arguments (comme dans "int printf (const char *format, ...)").

    Donc, si vous écrivez une DLL en C qui doit être appelée depuis VB, il faut ajouter "__stdcall" (sans les guillemets) devant votre déclaration de fonction (ex. : "__declspec(dllexport) int __stdcall MyFoo(void)").

    Le problème n'est pas toujours visible (cela dépend si vous passez des arguments et de leur nombre/taille), mais, quand il l'est, l'appel à une fonction en C depuis VB échoue avec l'erreur "Bad calling convention".

    Quelques liens :

    Si vous voulez un exemple en C (fonctions retournant des chaînes), je dois en avoir qui traînent...

    Amusez-vous bien

    [1] : quand il y en a bien sûr...

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

Discussions similaires

  1. débutante besoin d'aide pour démarrer
    Par info_amel dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 09/03/2009, 23h18
  2. [débutant] gotoandstop pour revenir ?!?
    Par ajor dans le forum Flash
    Réponses: 13
    Dernier message: 27/09/2007, 16h55
  3. [Débutant] Conseils pour bien démarrer.
    Par Invité dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 21/12/2005, 14h21
  4. [xsl] xsl juste pour faire copie d'un xml
    Par peppena dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/02/2004, 16h17
  5. Réponses: 3
    Dernier message: 14/02/2004, 10h10

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