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

Visual C++ Discussion :

[Fonction][VC++]utilisation de TWAIN


Sujet :

Visual C++

  1. #21
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Exemple pour la fonction FTW_Acq_GetImage() :
    Evidemment, ce n'est pas optimisé: J'ouvre la DLL pour appeler UNE fonction.
    Dans le vrai programme, il serait plus judicieux de charger la DLL au démarrage, et:
    • soit de garder son handle en variable globale (ou le passer en paramètre à chaque fois) et faire un GetProcAdress() pour chaque fonction utilisée
    • soit de charger toutes les fonctions dans des pointeurs de fonctions enregistrés en variables globales (ou dans une structure dont on passerait tout le temps le pointeur en paramètre)

    Code C++ : 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
    //int FTW_Acq_GetImage( HANDLE& hDib, int& count );
    typedef int (*FTW_ACQ_GETIMAGE_PROC)( HANDLE &, int & );
    //Nom extern "C" de la fonction :
    //Si la fonction est en __cdecl
    #define FTW_ACQ_GETIMAGE_NAME "FTW_Acq_GetImage"
    //Si la fonction est en __stdcall, ce qui est probable pour une DLL
    #define FTW_ACQ_GETIMAGE_NAME "_FTW_Acq_GetImage@8"
    //Si la fonction est en __fastcall, ce qui n'arrive pratiquement jamais
    #define FTW_ACQ_GETIMAGE_NAME "@FTW_Acq_GetImage@8"
     
    void uneFonction()
    {
    HMODULE hMod = LoadLibrary( TEXT("FayaTwain.dll") );
    if(hMod != NULL)
    	{
    	//Ce code ne peut marcher que si la fonction est en extern "C" dans la DLL.
    	//Et encore, même en extern "C", il y a trois noms possibles: voir plus haut
    	FTW_ACQ_GETIMAGE_PROC FTW_Acq_GetImage_proc
    	 = GetProcAddress(FTW_ACQ_GETIMAGE_NAME);
     
    	FTW_Acq_GetImage_proc( /* paramètres */ );
     
    	FreeLibrary(hMod);
    	}
    }
    Comme indiqué, ça ne marche que si la fonction est en extern "C" dans la DLL. Si ce n'est pas le cas, tu seras bien forcé d'utiliser .Net (par exemple, avec le code des exemples C# pour utiliser la DLL...)
    Edit: Mais si j'en crois le code C#, le premier nom doit marcher...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  2. #22
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 114
    Par défaut
    Ok merci pour le code détaillé ; juste deux petites questions :
    _ qu'est ce que HMODULE ?
    _ a quoi correspondent __cdecl, __stdcall, __fastcall ?

    Désolé d'etre chiant !! mais j'aime bien comprendre ce que je fait ( recopier du code sans le comprendre n'a pas grand interet à mon avis !)

  3. #23
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 114
    Par défaut
    Et aussi le compilateur m'envoie promener pour le HMODULE, le HANDLE , le LoadLibrary !!
    Y'aurai pas un namespace ou un un using a mettre !?

    edit : j'ai deja ecrit :
    using namespace System::Windows::Forms;

    #using "system.windows.forms.dll"

  4. #24
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    C'est du .Net, ça...
    LoadLibrary() et Cie, c'est de l'API native. Tu peux avoir toutes les déclarations en incluant <windows.h>

    Edit: Enfin, si tu es déjà en .Net, je te conseille d'utiliser les exemples en C# pour accéder à la bibliothèque. Tu peux même à la rigueur les traduire en C++/CLI...
    Normalement, tu auras surtout besoin de FayaTwain.cs, qui contient les déclarations...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #25
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 114
    Par défaut
    Dans un exemple que j'ai trouvé dans l'aide y'a ca :

    typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
    ...

    HINSTANCE hDLL; // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
    DWORD dwParam1;
    UINT uParam2, uReturnVal;

    hDLL = LoadLibrary("MyDLL");
    if (hDLL != NULL)
    {
    lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
    "DLLFunc1");
    if (!lpfnDllFunc1)
    {
    // handle the error
    FreeLibrary(hDLL);
    return SOME_ERROR_CODE;
    }
    else
    {
    // call the function
    uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
    }
    }

    Qu'est ce qu'il faut que je mette pour le typedef ? Il ser a quoi ce truc la ??

  6. #26
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 114
    Par défaut
    le compilateur explose quand j'ecri ton code ou celui de l'exemple!!
    J'ai la tete comme une pastek a force de relire mon code!!

    Je vais essyer autre chose. D'apre toi si je veux utiliser le pilote twain il me faut quoi comme fichier ? (sachant que j'ai deja un twain.h et un twain_32.dll)

Discussions similaires

  1. Fonction et utilisation de l'opacité
    Par Alexino2 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/08/2007, 12h48
  2. Réponses: 18
    Dernier message: 11/05/2007, 19h35
  3. Changer une fonction qui utilise une liste par un tableau!
    Par sara21 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/05/2007, 13h18
  4. Réponses: 3
    Dernier message: 25/07/2006, 18h00
  5. problème d'appel de fonction en utilisant innerHTML
    Par crakazoid dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 18/05/2006, 19h08

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