Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lire une bibliothèque de ressources DLL.

    12 juin 2021 à 19:47:57

    Bonjour à tous.
    Je suis sur Visual Studio 2019 et j'ai un DLL que j'ai, qui me contient des ressources (images, sons etc...)
    J'ai trouvé sur MSDN ce bout de code qui est sensé me lire mon DLL 
    HMODULE maDLL(LoadLibraryEx(LPCWSTR("TestDLL.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE));
     
    if (maDLL != NULL)
         std::cout << "Hello World!\n";
     else
         std::cout << GetLastError() << std::endl;
    Seulement j'ai beau mettre mon fichier DLL dans tous les dossiers/sous dossiers même avec l'adresse explicite (c:/blabla/madll.dll) ça fonctionne pas il ne l'ouvre jamais.
    J'ai certainement du raté quelque chose mais je ne vois pas bien quoi....
    Le getlasterror me donne la valeur "2". Je n'ai pas trouvé à quoi ça correspond.

    De plus, je me demande si c'est possible de mettre un fichier .png en ressource (png qui à un filtre transparent) ? car mon image est "horrible" quand je l'ouvre avec visual studio, mais j'espère que c'est normal et que quand je vais demander à l'ouvrir quand ça marchera, il y aura pas cet aspect là (cf. photo jointe en haut rendu dans visual studio en ressource, en bas le rendu désiré).
    Merci pour votre aide ! 

    -
    Edité par Tario Moustassou 12 juin 2021 à 20:12:16

    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2021 à 11:57:35

      Essais comme cela : 

          HMODULE maDLL {LoadLibrary("TestDLL.dll")};
          if (maDLL != NULL)
              std::cout << "Hello World!\n";
          else
              std::cout << GetLastError() << std::endl;



      -
      Edité par rouloude 13 juin 2021 à 11:59:01

      • Partager sur Facebook
      • Partager sur Twitter
        13 juin 2021 à 16:35:44

        Pour savoir où le chargeur de l'OS regarde pour choper une Dll : ProcessMonitor

        https://docs.microsoft.com/en-us/sysinternals/downloads/procmon

        Pour moi, il manque un flag "LOAD_LIBRARY_AS_IMAGE_RESOURCE"

        https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexw


        Pour la signification du "2" de GetLastError :

        https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes

        https://docs.microsoft.com/en-us/windows/win32/debug/system-error-code-lookup-tool (mais un équivalent devrait déjà être accessible depuis l'IHM de VisualStudio)

        Pour le PNG :

        https://stackoverflow.com/questions/62682684/get-png-file-data-from-a-png-stored-as-a-windows-resource-c

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          13 juin 2021 à 17:13:41

          Bonjour et merci pour cette réponse.

          J'ai pu en tirer ce code qui arrive à me trouver la DLL. En fait il manquait 'L' devant le chemin d'acces.

          #define ICONE_ID                          201
          
          int main()
          {
              HINSTANCE maDLL = LoadLibraryEx(L"TestDLL.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
             
              if (!maDLL)
                  std::cout << "ERREUR 1" << std::endl;
          
              HRSRC rsrc = FindResource(maDLL, MAKEINTRESOURCE(ICONE_ID), RT_RCDATA);
          
              if (!rsrc)
                  std::cout << "ERREUR 2" << std::endl;

          Mon souci est qu'à présent, je tombe toujours sur "ERREUR 2", mais la DLL ce charge.

          • Partager sur Facebook
          • Partager sur Twitter
            13 juin 2021 à 17:39:50

            Si "L" vous a débloqué, c'est que vous compilez en UNICODE, bien. Moi, je vous conseillerais d'utiliser SYSTEMATIQUEMENT la MACRO TEXT pour ne pas avoir de problème quand vous passez d'une version ASCII à une version UNICODE et vis-versa (ou utilisez explicitement LoadLibraryExW pour "verrouiller" le mode d'exécution.

            Votre manière de valider les valeurs de retour des fonctions de l'API Win32 est très 'light'. Pensez à utilisez les MACRO conçus à cet effet comme "SUCCEDED", etc... Ce type de fonction ne retourne pas de "booléen". Et GatLastError + primitive/utilitaire de formatage des messages d'erreur depuis les codes d'erreur systèmes sont nos amies (et lisez les articles donnés en lien dans mon post, même le dernier).

            -
            Edité par bacelar 13 juin 2021 à 17:41:47

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              13 juin 2021 à 18:52:42

              Tu es bien sur de l'ID 201 pour ta ressource ?
              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2021 à 19:30:14

                @rouloude oui certain. J'ai des id en 201 en 101 en 301 et aucun ne marche...
                • Partager sur Facebook
                • Partager sur Twitter

                Lire une bibliothèque de ressources DLL.

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown