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

Bibliothèques Discussion :

Comment utiliser les fonctions de "allegro.h" et "alfont.h" dans ma propre DLL?


Sujet :

Bibliothèques

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Comment utiliser les fonctions de "allegro.h" et "alfont.h" dans ma propre DLL?
    je veux metre le code ci-dessous dans ma propre dll.

    je voudrais une fonction dans ma DLL que j'appel avec les paramètres (char*, int) et qui me retourne un bitmap "bmp" ou un tableau.

    #include <stdio.h>
    #include <allegro.h>
    #include <alfont.h>

    int main(){

    BITMAP *bmp ;
    ALFONT_FONT *user_font;

    char *S="A";
    int Char_H=12;
    int Char_W=0;

    //format pour le codage du texte (ASCII, ascii normal)
    set_uformat(U_ASCII);

    allegro_init();//initialise allegro
    alfont_init();//initialise la font

    //Charge une police
    user_font = alfont_load_font("times.ttf");

    // change the font height to 40 pixels
    alfont_set_font_size(user_font, Char_H);

    //créé un bitmap
    Char_W = alfont_text_length(user_font, S);
    bmp=create_bitmap(Char_W,Char_H);

    //initialise le bitmap a 0
    clear_to_color(bmp,0);

    //Déssine "S" a patir de la ppolice "user_font" ds le bitmap "bmp" avec la couleur "makecol(255, 255, 255)"
    alfont_textprintf_ex(bmp, user_font, 0, 0, makecol(0, 255, 0), 0, S);

    //libere la memoire
    destroy_bitmap(bmp);
    alfont_destroy_font(user_font);
    alfont_exit();
    allegro_exit();

    return 0;

    } END_OF_MAIN() ; // obligatoire sous allegro après la fermeture du bloc du main()

    merci d'avance

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 585
    Points
    188 585
    Par défaut
    Salut,

    Premièrement, pour des raisons de lisibilité, on recommande de mettre tout le code des posts dans des balises réservées à cet effet. Mode d'emploi de cette balise.

    Ensuite, pour ton problème : il te suffit d'ajouter ce code dans celui de ta DLL, et de la lier à Allegro, tout comme un exécutable. Si tu as des problèmes avec ça, demande ici, en précisant les messages d'erreur et compilateur / EDI.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    j'ai essayé ton idée et ca compile la DLL sans probleme (Dev C++) mais lorsque j'appelle la DLL depuis VB2008 il me donne cette erreur:



    Déclaration de la DLL :
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Module Module1
        Public Declare Function GetBitmap Lib "d:\Ecriture_DLL.dll" (ByRef c As Char, ByVal i As Integer) As Integer
    End Module

    Appel de la DLL :
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Text = GetBitmap("a", 10)
    End Sub

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dll.h
     
    #ifndef _DLL_H_
    #define _DLL_H_
     
    // entête des fonctions 
    __declspec (dllexport) int GetBitmap (char*, int);
     
     
    #endif // _DLL_H_

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    dllmain.c
     
    #include "dll.h"
    //#include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <allegro.h>
    #include <alfont.h>
    #include <winalleg.h>
    // corps des fonctions
     
    __declspec (dllexport) int GetBitmap (char *_ch , int _h)
    {
        BITMAP *bmp ; 
        ALFONT_FONT *user_font;
     
        int _w=0;
     
        //format pour le codage du texte (ASCII, ascii normal)
        set_uformat(U_ASCII);
     
        allegro_init();//initialise allegro
        alfont_init();//initialise la font
     
        //Charge une police
        user_font = alfont_load_font("times.ttf");
     
        // change la taille de police
        alfont_set_font_size(user_font, _h);
     
        //créé un bitmap
        _w = alfont_text_length(user_font, _ch);
        bmp=create_bitmap(_w,_h);
     
        //initialise le bitmap a 0
        clear_to_color(bmp,0);
     
        //Déssine "_ch" a patir de la police "user_font" dans le bitmap "bmp" avec la couleur "makecol(255, 255, 255)"
        alfont_textprintf_ex(bmp, user_font, 0, 0, makecol(0, 255, 0), 0, _ch);
     
        //libere la memoire
        destroy_bitmap(bmp);
        alfont_destroy_font(user_font);
        alfont_exit();
        allegro_exit();
     
        return _h;   
    }    
     
    // fin corps
     
    BOOL APIENTRY DllMain (HINSTANCE hInst,    // Library instance handle. 
                           DWORD reason,       // Reason this function is being called. 
                           LPVOID reserved)    // Not used. 
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
     
          case DLL_PROCESS_DETACH:
            break;
     
          case DLL_THREAD_ATTACH:
            break;
     
          case DLL_THREAD_DETACH:
            break;
        }
     
        // Returns TRUE on success, FALSE on failure 
        return TRUE;
    }
    Images attachées Images attachées  

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 585
    Points
    188 585
    Par défaut
    Je pense que ton problème est plus du côté VB, vers lequel je n'ai (malheureusement ?) jamais été.

    Pour le vérifier, tu peux essayer d'utiliser la fonction de ta DLL avec un autre projet C/C++, en liant ce projet avec le .lib/.a normalement fourni lors de la compilation.

    Mais j'ai vu que tu compiles avec GCC (DevCpp), et que tu utilises la DLL avec des produits Microsoft. Alors que Microsoft propose son (excellent) compilateur C/C++. Peut-être une partie du problème provient de là...
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    je pense pas que VB soit le probleme parce qu'il me suffit d'enlever toutes les fonction d'Allegro de la fonction de ma DLL pour que l'appel de ma DLL depuis mon application VB fonctionne sans erreur !

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include "dll.h"
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <allegro.h>
    #include <alfont.h>
    #include <winalleg.h>
     
    __declspec (dllexport) int GetBitmap (char *_ch , int _h)
    {
        //BITMAP *bmp ; 
        //ALFONT_FONT *user_font;
     
        //int _w=0;
     
        //format pour le codage du texte (ASCII, ascii normal)
        //set_uformat(U_ASCII);
     
        //allegro_init();//initialise allegro
        //alfont_init();//initialise la font
     
        //Charge une police
        //user_font = alfont_load_font("times.ttf");
     
        // change la taille de police
        //alfont_set_font_size(user_font, _h);
     
        //créé un bitmap
        //_w = alfont_text_length(user_font, _ch);
        //bmp=create_bitmap(_w,_h);
     
        //initialise le bitmap a 0
        //clear_to_color(bmp,0);
     
        //Déssine "_ch" a patir de la ppolice "user_font" ds le bitmap "bmp" avec la couleur "makecol(255, 255, 255)"
        //alfont_textprintf_ex(bmp, user_font, 0, 0, makecol(0, 255, 0), 0, _ch);
     
        //libere la memoire
        //destroy_bitmap(bmp);
        //alfont_destroy_font(user_font);
        //alfont_exit();
        //allegro_exit();
     
        return _h;   
    }    
     
     
    BOOL APIENTRY DllMain (HINSTANCE hInst,    // Library instance handle. 
                           DWORD reason,       // Reason this function is being called. 
                           LPVOID reserved)    // Not used. 
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
     
          case DLL_PROCESS_DETACH:
            break;
     
          case DLL_THREAD_ATTACH:
            break;
     
          case DLL_THREAD_DETACH:
            break;
        }
     
        // Returns TRUE on success, FALSE on failure 
        return TRUE;
    }

    comme ca l'appel de le DLL fonctionne sans probleme !
    sauf que sans les les fonction d'Allegro ma DLL me sert a rien !

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Salut "dourouc05" Tu avais raison ! C’est VB2008 le problème !
    J’ai essayé la DLL avec une application en C++ comme tu l’avais suggérer et ca fonctionne bien !

    Mais j’ai pu identifier l’instruction qui cause le disfonctionnement avec VB2008, par le procédé archaïque d’élimination méthodique des instructions.
    Je suis tombé sur l’instruction ci-dessous.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Charge une police
    user_font = alfont_load_font("d:/times.ttf");

    Je ne sais pas pour quoi ça pose problème mais j’ai vraiment besoin de le résoudre! Toutes idées seront les biens venues !

Discussions similaires

  1. Comment utiliser les fonctions d'un autre fichier?
    Par zuzuu dans le forum Général Python
    Réponses: 8
    Dernier message: 14/12/2006, 18h22
  2. Réponses: 4
    Dernier message: 03/05/2006, 17h34
  3. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    Réponses: 3
    Dernier message: 24/02/2006, 16h59
  4. Réponses: 3
    Dernier message: 31/12/2005, 23h09
  5. Réponses: 11
    Dernier message: 22/12/2003, 21h06

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