Résultats de 1 à 8 sur 8

Sujet : Visual C++ Ajout dll compilée workspace

  1. #1
    Visiteur MP
    Visiteur MP

    Visual C++ Ajout dll compilée workspace

    Bonjour,

    Je souhaite utiliser une fonction présente dans une dll compilée qu\'on m\'a fournie.
    Comment puis-je faire en sorte que le programme dans lequel je veux l\'utiliser reconnaisse cette fonction ?
    Je développe en C sous Visual C++.
    Dois-je ajouter cette dll à mon workspace ?
    Si oui, que dois je faire de plus pour que ça marche ?

    Merci d\'avance pour votre aide.

    Cako19

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    salut cako19

    Il n\'est pas nécéssaire d\'ajouter la dll a ton projet, par contre il te faudra savoir ou elle se trouve et connaître le nom de la fonction désiré ainsi que son type de retour et arguments.

    L\'example suivant appel une fonction qui incremente un long je te passe le source que j\'ai realisé a titre d\'exercice.

    proto : long fonction(long) soit le code suivant dans la dll :

    Code:
    long IncValue(long value)
    {
    	return (++value);
    
    }
    et le code suivant a l\'appel :

    Code:
    {
        HINSTANCE      hInstLib ;
        // la fonction dans la dll porte le nom _IncValue
        long (WINAPI *_IncValue)(long) ;
        // la dll s\'appel Project1.dll
        hInstLib = LoadLibraryA( \"c:\\\\Project1.dll\" ) ;
        _IncValue=(long(WINAPI *)(long))GetProcAddress( hInstLib,\"_IncValue\" ) ;
        if(_IncValue == NULL )
           {
                // Sortie sur erreur (Pointeur non ou mal initialisés)  
                FreeLibrary( hInstLib ) ;
                return; 
           }
        // appel de la foncton dans la Dll
        long i= _IncValue(i);
        // liberation de la memoire
        FreeLibrary(hInstLib);
    }
    En espérant que cela puisse t\'aider. Donne nous des nouvelles :wink:

  3. #3
    Visiteur MP
    Visiteur MP
    merci beaucoup pour ton aide.
    En fait, j\'avais fini par trouver la méthode mais ça ne marche toujours pas.

    voici mon code :
    typedef BOOL (CALLBACK* SHA1SURFICHIER)( char*, char*, char*, long unsigned* );
    ...

    HMODULE hDLL;
    SHA1SURFICHIER ptrSHA1SurFichier;
    char* sha1 = NULL;
    char* messErreur = NULL;


    hDLL = LoadLibrary(\"DllCryptographie.dll\");
    if (hDLL != NULL)
    {
    ptrSHA1SurFichier = (SHA1SURFICHIER)GetProcAddress(hDLL,\"SHA1SurFichi er\");

    if ( !ptrSHA1SurFichier )
    {
    FreeLibrary( hDLL );
    }
    else
    {
    ptrSHA1SurFichier( (char*)NomFichierEntree, sha1, messErreur, NULL );
    }
    }

    En fait, dans la dll, la fonction est déclarée comme suit :

    DLLCRYPTOGRAPHIE_API BOOL SHA1SurFichier(char* NomFic, char *destination, char* MessErreur, long unsigned *Duree)
    mais si je mets comme type de retour :
    DLLCRYPTOGRAPHIE_API BOOL , j\'ai plein d\'erreurs.
    Seulement, si je mets que BOOL, à l\'exécution j\'ai une erreur qui me dit :
    \"the value of ESP was not properly saved across a function call...\" puis qui me dit que c\'est généralement le résultat de l\'appel d\'une fonction déclarée avec une convention d\'appel avec un pointeur d\'une fonction déclarée avec une convention d\'appel differente.

    Que dois- je faire ?
    Merci d\'avance.

    Cako19

  4. #4
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Re ...

    Je ne voie pas ou se situe le problème de ton code (C difficile sans le compilateur devant les yeux)
    J\'ai donc modifié mon code pour l\'adapter a ma manière que j\'ai déjà testée ( il y a déjà un an ou deux ), peut être passera t il chez toi du moins je l\'espère

    Code:
    {
        HINSTANCE hInstLib ;
        BOOL (WINAPI *SHA1SurFichier)(char*, char*, char*,long unsigned*) ;
        hInstLib = LoadLibraryA( \"DllCryptographie.dll\" ) ;   // dans le path ou modif du chemin
        SHA1SurFichier=(BOOL(WINAPI *)(char*, char*, char*,long unsigned*))GetProcAddress( hInstLib,\"SHA1SurFichier\" ) ;
        if(SHA1SurFichier == NULL )
           {
                FreeLibrary( hInstLib ) ;
                return; 
           }
        // appel
        /*
           initialisation des parametres
           (...)
           et ensuite appel
        */
        BOOL i= SHA1SurFichier(\"tes parametres (...)\");
        FreeLibrary(hInstLib);
    }
    en priant pour que ça marche ...

    PS : ces manip sont ultra interessantes pour filtrer des appels sur des Dll donc tu connais le prototype et donc la signature.
    Si tu arrive au bout du problème, n\'ésite surtout pas a rediger un petit Tuto pour le forum avec un petit source d\'une dll et un source d\'utilisation.(je suis prêt a t\'y aider si il le faux tu peux utiliser mon adresse Mail si tu veux elle est dispo dans mon profil)
    Par cette methode il t\'est possible de réecrire une dll existante avec des fonctions ayant une signature identique a celle d\'origine, de renomer celle d\'origine et de glisser ta dll \'pirate\' a sa place avec le nom d\'origine.
    En pointant dans ta dll sur celle d\'origine dont tu es le seul a connaître le nom et l\'emplacement tu as tout le loisir d\'effectuer un travail sur :
    1/ les parametres d\'entrée avant le rebond.
    2/ les valeurs retournées au retour du rebond.

    Pratique dans certains cas et subtil pour le declassage ...

    @+ :wink:

  5. #5
    Visiteur MP
    Visiteur MP
    Avec cette méthode, ça me fait plein d\'erreurs, c\'est pire

    C\'est bizarre parce que le message que je t\'ai décrit plus haut n\'empêche pas en fait l\'exécution de la fonction. J\'obtiens quand même un résultat mais bon, c\'est quand même gênant.

    Je n\'ai pas tout compris ce que tu as mis dans ton PS.

    En tout cas, merci beaucoup pour ton aide.

    Cako19

  6. #6
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Je peux te proposer de poster ton code (en entier ou en tous cas elagué pour qu\'il se compile proprement ) si tu as un moyen de dire ou trouver ta dll (indispensable pour les essaies) et je pense que je mettrai le nez dedans pour essayer avec toi de trouver la soluce .
    En plus le C ça me detend en ce moment je bouffe du java par tous les trous de nez!
    :wink:

  7. #7
    Visiteur MP
    Visiteur MP
    Merci c\'est très gentil mais je ne peux malheureusement pas te donner ma dll car elle appartient à mon entreprise.

  8. #8
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Bien sur c\'est tout a fait normal, (je ferai de même) sans parler de poster le contenue applicatif de la dll, ni même les noms de fonctions pour que nous ne puissions la tracer, tu peux tousjours nous poster le proto vide de la dll avec des methodes au noms bidons mais présentant la même signature, ainsi que ton code d\'appel (banalisé lui aussi) .
    Sur cette base nous pourions travailler enssemble à la redaction d\'une réponse viable (dans la mesure ou je pourrai compiler ton example chez moi facilement).

    Quoi qu\'il en soit je pense, un peux plus tard aborder le concept evoqué plus haut \'pour le declassage ... \' des dll.

    :wink:

    PS : un lien qui peux t\'aider je pense : http://www.forum.moteurprog.com/index.php?url=FORUM_msg.php&ID_topic=721@C+%26 +C%2B%2B@1

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé
Please disable Adblock!