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

C++ Discussion :

Lire une bibliothèque de ressources DLL.


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut Lire une bibliothèque de ressources DLL.
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    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....

    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 !


    Nom : Sans titre-1.png
Affichages : 143
Taille : 34,7 Ko

  2. #2
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Que retourne GetLastError() après l'appel de la fonction LoadLibraryEx?
    Homer J. Simpson


  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    Bonsoir.

    Exact je l'ai pas mentionné mais j'ai la valeur "2" qui s'affiche sur la console.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    2 - "Path not found", donc ce n'est même pas apparemment 1 problème de droits/ UAC/ disque système.

    Citation Envoyé par Vidou12 Voir le message
    l'adresse explicite (c:/blabla/madll.dll)
    tu en es sûr

    c:\\blabla\\madll.dll

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    Oui j'ai fait comme ça :

    J'ai essayé avec le nom de ma DLL directement (comme dans le code que je vous ai donné)

    Et aussi avec l'adresse explicite (copier coller du lien en haut quand on clique sur la barre d'adresses dans l'explorateur windows).

    L'un comme l'autre ne fonctionnent pas.

    J'ai également essayé d'exécuter le fichier EXE dans mon dossier release mais idem. Erreur 2.

    Nom : Sans titre-1.png
Affichages : 117
Taille : 36,6 Ko

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Que te donne GetCurrentDirectory?
    Homer J. Simpson


  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Je vois 2 choses pour t'en sortir

    • Avoir 1 deuxième disque/ partition (D: souvent) et mettre tous à la racine ou dans 1 dossier "1". Ainsi tu as 1 chemin ultra simplifié sans caractères spéciaux (comme des espaces au hasard)
    • Prendre le chemin dans argv[0] en remplaçant le nom de l'exécutable par celui de la DLL (il faut chercher le premier \ en partant de la droite - ou le dernier en partant de la gauche)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    euh... "00007FF9EF81FF30" !

    Je suis pas sur de bien l'utiliser si ? XD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main()
    {
        std::cout << GetCurrentDirectory;

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par Vidou12 Voir le message
    std::cout << GetCurrentDirectory;
    Tu es sérieux

    C'est 1 fonction, tu récupères l'adresse
    std::cout << GetCurrentDirectory(/* ... */);.
    Il faut aller sur MSDN pour la documentation

  10. #10
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par foetus Voir le message
    Je vois 2 choses pour t'en sortir

    • Avoir 1 deuxième disque/ partition (D: souvent) et mettre tous à la racine ou dans 1 dossier "1". Ainsi tu as 1 chemin ultra simplifié sans caractères spéciaux (comme des espaces au hasard)
    • Prendre le chemin dans argv[0] en remplaçant le nom de l'exécutable par celui de la DLL (il faut chercher le premier \ en partant de la droite - ou le dernier en partant de la gauche)
    J'ai essayé aussi en mettant ma DLL directement dans E: : ""E:\\TestDLL.dll".
    ça fonctionne pas non plus.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    MSDN me sort ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #define BUFSIZE MAX_PATH
    ...
    ...
     
    TCHAR Buffer[BUFSIZE];
    DWORD dwRet;
     
    dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
    Comme la fonction me renvoie un DWORD je récupère un DWORD et affiche un DWORD au final...

    donc ça me donne 65. Même si je le convertis en char j'aurais pas un "chemin d'accès" en sortie.

    Je sature là.

    EDIT : Ok la fonction renvoie juste le nombre de caractères et pas le chemin complet...

    DONC mon Buffer contient bien le chemin complet. Pas de soucis à ce niveau là.

  12. #12
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Citation Envoyé par Vidou12 Voir le message
    MSDN me sort ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #define BUFSIZE MAX_PATH
    ...
    ...
     
    TCHAR Buffer[BUFSIZE];
    DWORD dwRet;
     
    dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
    Comme la fonction me renvoie un DWORD je récupère un DWORD et affiche un DWORD au final...

    donc ça me donne 65. Même si je le convertis en char j'aurais pas un "chemin d'accès" en sortie.

    Je sature là.

    EDIT : Ok la fonction renvoie juste le nombre de caractères et pas le chemin complet...

    DONC mon Buffer contient bien le chemin complet. Pas de soucis à ce niveau là.
    Et donc ton buffer?
    Homer J. Simpson


  13. #13
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    Ben il correspond à mon dossier du programme : "C:\Users\Moi\source\repos\Test Lecture DLL\Test Lecture DLL"

    C'est dans ce dossier que j'ai mon dll.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Ouais, je peux me tromper, mais cela me semble clair que c'est + 1 problème de paramètres
    Et sans LOAD_LIBRARY_AS_DATAFILE ?

  15. #15
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    Pareil en le mettant à NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HMODULE maDLL(LoadLibraryEx(LPCWSTR("E:/TestDLL.dll"), NULL, NULL));

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Et avec du vrai code
    • HMODULE maDLL = LoadLibraryEx(_T("E:\\TestDLL.dll"), NULL, NULL /* LOAD_LIBRARY_AS_DATAFILE */);
    • HMODULE maDLL = LoadLibraryExW(L"E:\\TestDLL.dll", NULL, NULL /* LOAD_LIBRARY_AS_DATAFILE */);

  17. #17
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Points : 17
    Points
    17
    Par défaut
    Le second code à l'air de fonctionner. Pas le premier.
    Je vais voir du coup si j'arrive à accéder aux ressources de la DLL.

    Merci .

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    C'est 1 problème d'Unicode UTF-16 : la deuxième version fonctionne parce que tu forces l'unicode - la version W pour "wide char" et le L"".
    La première devrait fonctionner ou alors c'est la macro TEXT("")

    Et tiens 1 exemple trouvé en 10 secondes sur qui rejoint ma réponse et celle de @Astraya (après il faut compiler pour savoir si elle passe)
    Mais il mélange trop les versions Unicode et les versions génériques ANSI/ Unicode - donc à modifier si on ne veut pas de surprises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        WCHAR wModuleFile[1024];
        GetModuleFileName(g_hInst, wModuleFile, 1024);
        PathRemoveFileSpecW(wModuleFile);
        wcscat_s(wModuleFile, TEXT("\\dtsdecoderdll.dll"));
     
        // Try loading from the filters directory
        HMODULE hDll = LoadLibraryEx(wModuleFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);

  19. #19
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Juste pour note, sous Windows il y a GetDllDirectory et SetDllDirectory. Ne jamais utilisé SetCurrentDirectory qui n'est pas thread safe. De plus, sous Windows, chaque thread a son propre CurrentDirectoy qui nest rien de plus qu'une variable globale.

    LPCWSTR devrait fonctionner si tu donne L"E:.... " Et pas "E:"
    Homer J. Simpson


  20. #20
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Après une bonne pratique est d'abolir les macros de Windows et utilise L"" Pour les wchar_t et rien pour les char c'est tout.
    De mémoire la macro TEXT ne fait que préfixer avec le L
    Homer J. Simpson


Discussions similaires

  1. Importer une bibliothèque de classes sous forme d'un DLL
    Par Sangdrax1604 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/12/2007, 12h18
  2. [Lazarus] Lire une ressource texte
    Par koolkris dans le forum Lazarus
    Réponses: 4
    Dernier message: 21/10/2007, 12h52
  3. [Lazarus] Lire une ressource lrs
    Par JoseF dans le forum Lazarus
    Réponses: 2
    Dernier message: 20/06/2007, 21h37
  4. Une bibliothèque portable pour la gestion des dlls (plug-ins)
    Par Spartan03 dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 20/11/2006, 19h33

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