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

Turbo Pascal Discussion :

[BP7] Problème chargement de ressource dans une DLL


Sujet :

Turbo Pascal

  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 412
    Points
    59 412
    Billets dans le blog
    2
    Par défaut [BP7] Problème chargement de ressource dans une DLL
    Bonjour à tous et toutes !

    Je suis en train de me débattre avec un problème dont la solution doit être simple mais qui m'échappe désespérément.

    A l'aide d'un éditeur de ressources (16 bits), j'ai créé un fichier .RES contenant uniquement une image bitmap.
    J'ai ensuite créé une DLL qui ne contient également que cette ressource.

    Mon programme ouvre sans problème la DLL mais ne parvient pas à charger la bitmap à l'aide de la fonction LoadBitmap. Je passe comme paramètres à cette fonction le handle d'instance de la DLL renvoyé par LoadLibrary ainsi que l'identificateur de la bitmap.

    C'est la première fois que je crée une DLL ne contenant que des ressources. Y a-t-il une astuce dans ce cas particulier ? Ou lors du chargement d'une ressource dans une DLL ?

    Merci d'éclairer ma lanterne !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Je ne sais pas si cela va t'aider mais un petit tour sur le "joli" () site de nono40, et on découvre une astuce pour la création de DLL ( avec delphi )( c'est du php alors je vais tout te donner ici ) :
    Citation Envoyé par nono40 le super-modo delphi
    PRÉSENTATION : Pour stocker vos icônes dans une dll, rien de plus simple

    NOTES : Pour créer une dll ne contenant que des icônes voici la marche à suivre :
    - Créez un fichier .RES à l'aide de l'éditeur d'image de Delphi. Ce fichier doit contenir toutes les icônes que vous voulez mettre dans votre dll.
    - Créez une nouvelle dll ( fichier/nouveau/autre... ->Expert dll )
    - Ajouter une directive {$R MesIcones.res } où MesIcones.res est le fichier de ressources contenant vos icones.
    - Supprimez tous le reste du source afin qu'il ressemble à celui ci-dessous
    - Compilez et c'est fini !! Facile non ?

    CODE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Library Ico;
     
    {$R MesIcones.res}
     
    Begin
    End.
    Voilà j'espère que cela t'aidera !
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 107
    Points : 279
    Points
    279
    Par défaut
    Mais, Îc :
    Delphi, c'est un tout petit peu du 32 bit
    BP7, un peu du 16bit

    cherchez l'érreur ...
    Chaque jour, l'homme crée des choses plus grandes, meilleures et sûres, et chaque jour, la nature crée des idiots plus performants. Pour l'instant, je pense que la nature gagne.

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 412
    Points
    59 412
    Billets dans le blog
    2
    Par défaut
    Merci pour cette réponse rapide !

    Il ne doit pas y avoir beaucoup de différences dans les principes entre le 16 bits et le 32 bits. En tout cas, ce que j'ai fait correspond exactement aux explications fournies par Wormful_Sickfoot (Delphi est tout-de-même un descendant de BP7).

    Peut-être mon problème se situe-t-il au niveau de LoadBitmap ? Est-ce bien le handle retourné par LoadLibrary qu'il faut passer comme paramètre ? Je continue à chercher. Je vais tester d'autres types de ressources.

    A+
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2003
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Pascail
    cherchez l'érreur ...
    Heu... je cherche... je cherche... l'accent sur le "e" de erreur ? lol
    Les ordinateurs sont inutiles. Ils ne savent que donner des réponses...

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 107
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par Totsira
    Citation Envoyé par Pascail
    cherchez l'érreur ...
    Heu... je cherche... je cherche... l'accent sur le "e" de erreur ? lol
    Chaque jour, l'homme crée des choses plus grandes, meilleures et sûres, et chaque jour, la nature crée des idiots plus performants. Pour l'instant, je pense que la nature gagne.

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Le SDK confirme qu'il faut passer en paramètre de LoadBitmap le handle d'instance obtenu avec LoadLibrary. Il peut y avoir plusieurs raisons au problème :
    - soit la fonction LoadLibrary ne marche pas ( elle doit sûrement retourner un handle de 0)
    - soit la fonction LoadBitmap ne marche pas ( elle trouve pas par exemple la ressource qui a le nom passé en paramètre, auquel cas elle retourne NULL )
    - soit le fichier ressource .res est "corrompu" c'est-à-dire mal formé...
    Peut-être cela vient aussi du passage 16 bits/32 bits que windows supporte mal... Peut-être tu devrais essayer de créer un fichier ressource avec un éditeur de ressource 32 bits ( comme celui de delphi par exemple ). A noter que les ressources obtenus avec un éditeur 32 bits ne sont pas vraiment optimisées pour le 32 bits ( un bitmap ne peut avoir que 256 couleurs et une icône seulement 16 couleurs..., quant aux curseurs seulement 4 couleurs autorisées , autant dire que le 16 bits est plus performant que ça, en matière de palette graphique !! )
    Bon désolé de ne pas donner un élément de réponse plus sûr !!
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  8. #8
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 412
    Points
    59 412
    Billets dans le blog
    2
    Par défaut
    L'ensemble de mon projet est en 16 bits (résident sur un serveur réseau et devant être exécuté sur Windows 3.1x, Windows 98 et NT). J'appelle par moments certaines fonctions de l'API 32 bits (quand l'OS est 32 bits, bien entendu) mais jamais pour manipuler les ressources.

    Je suis presque sûr que le problème se situe dans la DLL car LoadLibrary retourne un handle valide. Si seulement LoadBitmap renvoyait un code d'erreur !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  9. #9
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    LoadBitmap retourne 0 lorsqu'elle échoue. Si tu développes sous NT essaye d'utiliser la fonction GetLastError pour obtenir le dernier code d'erreur ( j'espère que c'est compatible 16 bits ce truc !! En tout cas, c'est bien pratique pour débuguer... une des seules bonnes idées de Billou !! )
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Un petit tour sur le SDK online de notre cher "créateur de système d'exploitation", alias microsoft, pour découvrir plusieurs choses intéressantes :
    Citation Envoyé par Billou
    The LoadBitmap function loads the specified bitmap resource from a module's executable file. This function has been superseded by the LoadImage function.
    Donc la fonction LoadBitmap peut être remplacée par LoadImage ( qui a l'air un peu plus puissante : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/introductiontoresources/resourcereference/resourcefunctions/loadimage.asp )

    Citation Envoyé par Billou ( encore lui )
    If the bitmap pointed to by the lpBitmapName parameter does not exist or there is insufficient memory to load the bitmap, the function fails.
    Il se peut que l'erreur soir due à un manque de mémoire !

    Citation Envoyé par Toujours, Billou
    Windows 95: Windows 95 cannot handle executable files that contain resources whose size is 64K or larger. To retain compatibility with 16-bit Windows, it converts the 32-bit size into a 16-bit size and a shift count. When it does this conversion it rounds down instead of up, so some bytes can be lost. The shift required for a large resource can cause a small resource to be severely truncated, or even eliminated completely. To avoid this problem, compute the scaling factor for the largest resource and pad all resources with zeroes so each is a multiple of the scaling factor. For example, a resource of size 0x100065 is converted to 0x8003 * 32, which loses 5 bytes. To save the 5 bytes, you must pad the resource with 27 zeroes so that it becomes size 0x100080 and is then converted to 0x8004 * 32. Note, any smaller resource must also be padded with zeroes so it is a multiple of the scaling factor, which in this case is 32.
    ( J'espère que tu maitrises bien l'anglais ). Pour les anglophobes, cela dit que la compatibilité 16 bits fait faire des choses bizarres à windows 95 ( la bonne excuse ), en l'empêchant de charger des Bitmaps de plus de 64 Ko...
    Voilà, j'espère que ceci t'aidera un peu !
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  11. #11
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 412
    Points
    59 412
    Billets dans le blog
    2
    Par défaut
    Mais c'est bien sûr !

    Puisque ça marche avec d'autres types de ressources de petite taille, ce ne peut être que la taille de ma bitmap, qui dépasse allègrement les 64 Kb.

    Je vais choisir une autre solution et conserver mon image dans un fichier BMP, et non dans une DLL de ressources.

    Mille fois merci, car je commençais vraiment à douter de mes facultés mentales !

    Trop fort, ce mec !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  12. #12
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Hihi, merci Alcatîz ( quoique je n'ai pas un grand mérite sur ce coup !! )
    Tu devrais peut-être utiliser LoadImage, car aucune taille limite est spécifiée ( avec cette fonction on peut également charger des icônes et des curseurs, en faisant varier un paramètre )
    Bon développement !
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

Discussions similaires

  1. Chargement de ressources dans un jar externe
    Par SQUAL dans le forum Langage
    Réponses: 1
    Dernier message: 13/01/2012, 16h51
  2. probleme de chargement des extensions dans une dll
    Par Syl_20 dans le forum OpenGL
    Réponses: 3
    Dernier message: 03/07/2007, 08h37
  3. Ressource dans une dll
    Par WebPac dans le forum Delphi
    Réponses: 1
    Dernier message: 30/03/2007, 11h40
  4. Ressources dans une DLL
    Par eagleamon dans le forum Windows
    Réponses: 13
    Dernier message: 16/09/2005, 13h13
  5. [JLabel] Chargement d'image dans une JFrame
    Par mr.t dans le forum Composants
    Réponses: 10
    Dernier message: 27/01/2005, 18h32

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