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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    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 : 174
Taille : 34,7 Ko

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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    Par défaut
    Que retourne GetLastError() après l'appel de la fonction LoadLibraryEx?

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

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    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 confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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 confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    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 : 149
Taille : 36,6 Ko

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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    Par défaut
    Que te donne GetCurrentDirectory?

  7. #7
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    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;

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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)

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

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    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 confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    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 Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    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:"

  13. #13
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    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

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