1. #1
    Membre habitué
    Avatar de ABD-Z
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2016
    Messages : 44
    Points : 182
    Points
    182

    Par défaut Appel de function en chargeant une DLL codée en C

    Bonjour,
    J'ai codé en C une petite DLL qui a une fonction qui communique avec un driver spécifique.
    L'une de ces fonctions de la DLL ne prends aucun paramètre.
    Voici son prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void DLL_EXPORT initMuxyLight()
    Lorsque je charge ma DLL dans du code Python, l'appel se fait tout simplement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dlltest = ctypes.CDLL("canInterfaceDll.dll")
    dlltest.initMuxyLight()
    En revanche, cela a l'air d'être plus compliqué en C, voici le code pour charger une DLL et appeler une fonction (notez en C qu'il faut initialisé un type de pointeur de fonction) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include <Windows.h>  
    #include <stdio.h>
     
    typedef UINT (CALLBACK* FUNCADDR)(DWORD,UINT); 
     
    int main (int argc, char *argv[])
    {
     
     
    	HMODULE libHandle;
    	if((libHandle = LoadLibrary(TEXT("C:/Users/nassera/Desktop/testDLL/canInterfaceDll/bin/Debug/canInterfaceDLL"))) == NULL){
    		puts("load failed lol");
    		system("pause");
    	}else{
    		puts("dll is loaded OK");
    		system("pause");
    		FUNCADDR funcADDR;
    		funcADDR = (FUNCADDR) GetProcAddress(libHandle,"initMuxyLight");//adress of the function of muxy light initialisation
    		if(!funcADDR){
    			FreeLibrary(libHandle);
    			return -1;
    		}else{
    			printf("%04x\n",funcADDR);
    			system("pause");
    			funcADDR();
    		}
     
    	}
    Comme la fonction initMuxyLight() ne prends aucun paramètre, j'ai écrit funcADDR() de cette manière ci. Or, lorsque je fais tourner le programme, le compilateur me dit qu'il lui manque deux paramètres :
    67, 22 error: too few arguments to function call, expected 2, have 0
    Cela est étrange, car comme nous l'avions vu, la fonction de la DLL ne prends aucun paramètres!

    Du coup, j'ai passé deux paramètres aléatoirement, du genre et là ça marche!

    Enfin, j'aimerais bien savoir pourquoi le programme demande deux paramètres alors qu'il ne devrait pas en avoir (j'ai également testé avec une fonction qui demande un unique paramètre et c'est exactement le même scénario).
    En attendant vos réponses,
    Merci

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 768
    Points : 15 474
    Points
    15 474

    Par défaut

    Bah, ton typedef FUNCADDR est fait pour une fonction prenant un DWORD et un UINT. C'est normal que tu obtiennes un tel pointeur.
    Par contre, tu tombes en plein dans un "undefined behaviour": les pointeurs de fonctions de types différents sont incompatibles, et il est indéfini d'appeler une fonction via un pointeur d'un type différent du sien.
    Essaie avec typedef UINT (*FUNCADDR)(void);.

    Note: il ne faut pas définir un type de pointeur de fonction.
    Mais comme il faut une variable pour stoquer le pointeur obtenu, et comme celle-ci a besoin d'un type, le typedef rend sa déclaration beaucoup plus lisible.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre habitué
    Avatar de ABD-Z
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2016
    Messages : 44
    Points : 182
    Points
    182

    Par défaut

    Citation Envoyé par ternel Voir le message
    Par contre, tu tombes en plein dans un "undefined behaviour": les pointeurs de fonctions de types différents sont incompatibles, et il est indéfini d'appeler une fonction via un pointeur d'un type différent du sien.
    Pardonnez-moi, mais je n'ai pas très bien saisi ta dernière phrase..

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 768
    Points : 15 474
    Points
    15 474

    Par défaut

    Une fonction UINT(void) n'est pas du même genre qu'une autre UINT(DWORD, UINT). De même que long n'est pas du même genre que char.
    Certes, les pointeurs sont plus ou moins similaires, mais les choses pointées ne se manipulent pas de la même manière.

    La seule façon correcte d'appeler la fonction pointée par un pointeur, c'est en fournissant des valeurs aux paramètres attendus par le type du pointeur.
    La seule façon correctement définie par le langage d'appeler une fonction c'est avec des arguments en nombre suffisant, et compatibles avec les paramètres de la fonctions.

    Il faut donc avoir un pointeur de fonction correct.

    Par contre, et c'est en l'écrivant que je m'en rappelle, il me semble qu'en C une fonction déclarée sans liste de paramètres (void f(), par exemple), peut recevoir n'importe quel nombre d'argument, sans en tenir compte.
    La seule manière de dire qu'une fonction ne prend pas d'argument, c'est de déclarer sa liste d'argument comme vide: void f(void).
    A vérifier toutefois, mais ca expliquerait pourquoi ton programme n'explose pas.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre habitué
    Avatar de ABD-Z
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2016
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2016
    Messages : 44
    Points : 182
    Points
    182

    Par défaut

    Merci beaucoup pour la clarification!

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

Discussions similaires

  1. Utiliser une DLL codée en C++
    Par oodini dans le forum C#
    Réponses: 13
    Dernier message: 25/05/2011, 16h04
  2. Appelé un style défini dans une .DLL
    Par Lapinpanda dans le forum Silverlight
    Réponses: 8
    Dernier message: 08/03/2011, 10h11
  3. DLL Native chargeant et appelant du code dans une DLL.NET
    Par cinemania dans le forum C++/CLI
    Réponses: 3
    Dernier message: 17/04/2007, 07h12
  4. Réponses: 2
    Dernier message: 19/09/2006, 19h06
  5. Réponses: 7
    Dernier message: 13/01/2005, 10h30

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