+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Nouveau Membre du Club
    Inscrit en
    septembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 64
    Points : 38
    Points
    38

    Par défaut Problème de chargement de DLL (MSVFW32.DLL)

    Hello à tous...

    Un projet que je développe en ce moment utilise la librairie VFW pour créer des AVIs.

    Donc #include <vfw.h> dans les sources
    et LIBS += chemin qui va bien /vfw32.lib dans le .pro

    Si la configuration de compilation est MSVC2008, quel que soit l'EDI (QtCreator ou MSVC), tout va bien... Ca compile, ca linke, la DLL MSVFW32.DLL est bien chargée à l'exécution...

    Si la configuration de compilation est MinGW, sous QtCreator, ca compile, ca linke, mais la DLL n'est pas chargée à l'exécution et donc ca plante (SEGV) à l'exécution de toute fonction de la DLL (VideoForWindowsVersion() par exemple).

    Auriez-vous une idée?

    Merci d'avance.

  2. #2
    Nouveau Membre du Club
    Inscrit en
    septembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 64
    Points : 38
    Points
    38

    Par défaut

    Bon... Y'a vraiment trop de réponses à ma question...

    Je ne sais toujours pas pourquoi ces DLLs (MSVFW32.DLL et AVIFIL32.DLL) ne se chargent pas automatiquement au démarrage de l'appli. Cependant, impératif temps oblige, j'ai apporté une solution à mon problème en utilisant QLibrary.

    Pour garder la compatibilité avec les deux comilateurs (CL de MSVC et MINGW)
    j'utilise un #define en tête de mon code...

    Et donc dans mon .h je retrouve:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #ifdef QTCREATOR
        QLibrary *Vfw;
        QLibrary *Avi;
         ulong (*VideoForWindowsVersion)();
         ULONG (*AVIStreamRelease)(PAVISTREAM) ;
         ULONG (*AVIFileRelease)(PAVIFILE);
         void (*AVIFileInit)();
         void (*AVIFileExit)();
         HRESULT (*AVIFileOpenW)(PAVIFILE*,LPCWSTR,UINT,LPCLSID);
         HRESULT (*AVIStreamWrite)(PAVISTREAM,LONG,LONG,LPVOID,LONG,DWORD,LONG*,LONG*);
         HRESULT (*AVIFileCreateStream)(PAVIFILE,PAVISTREAM*,AVISTREAMINFOW*);
         BOOL (*AVISaveOptions)(HWND,UINT,INT,PAVISTREAM*,LPAVICOMPRESSOPTIONS*);
         HRESULT (*AVIMakeCompressedStream)(PAVISTREAM*,PAVISTREAM,AVICOMPRESSOPTIONS*,CLSID*);
         HRESULT (*AVIStreamSetFormat)(PAVISTREAM,LONG,LPVOID,LONG);
    #endif
    avec dans le cpp, un constructeur qui contient:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CAVIFile::CAVIFile()
    {
    #ifdef QTCREATOR
        Vfw = new QLibrary("c:/Windows/SysWOW64/msvfw32.dll");  // A adapter
        Vfw->load();
        Avi = new QLibrary("c:/Windows/SysWOW64/avifil32.dll");     // Idem...
        Avi->load();
        VideoForWindowsVersion  = (ulong(*)()) Vfw->resolve("VideoForWindowsVersion");
        AVIStreamRelease          =(ULONG(*)(PAVISTREAM)) Avi->resolve("AVIStreamRelease");
        AVIFileInit             =(void(*)()) Avi->resolve("AVIFileInit");
        AVIFileRelease            =(ULONG(*)(PAVIFILE)) Avi->resolve("AVIFileRelease");
        AVIFileExit             =(void(*)()) Avi->resolve("AVIFileExit");
        AVIFileOpenW            =(HRESULT (*)(PAVIFILE*,LPCWSTR,UINT,LPCLSID)) Avi->resolve("AVIFileOpenW");
        AVIStreamWrite          =(HRESULT (*)(PAVISTREAM,LONG,LONG,LPVOID,LONG,DWORD,LONG*,LONG*))Avi->resolve("AVIStreamWrite");
        AVIFileCreateStream     =(HRESULT (*)(PAVIFILE,PAVISTREAM*,AVISTREAMINFOW*))Avi->resolve("AVIFileCreateStreamW");
        AVISaveOptions          =(BOOL (*)(HWND,UINT,INT,PAVISTREAM*,LPAVICOMPRESSOPTIONS*))Avi->resolve("AVISaveOptions");
        AVIMakeCompressedStream =(HRESULT (*)(PAVISTREAM*,PAVISTREAM,AVICOMPRESSOPTIONS*,CLSID*))Avi->resolve("AVIMakeCompressedStream");
        AVIStreamSetFormat      =(HRESULT (*)(PAVISTREAM,LONG,LPVOID,LONG))Avi->resolve("AVIStreamSetFormat");
    #endif
    }
    dès lors, il n'y a plus de différence entre les deux versions qui utilisent soit les pointeurs de fonctions (MINGW) soit les fonctions elles-mêmes (MSVC)...


    Ceci ne répond pas à la question posée, mais résout mon problème...
    Je ne ferme pas ce sujet tout de suite...
    J'attends vos éventuelles réactions...

  3. #3
    Expert Confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 255
    Points : 2 570
    Points
    2 570

    Par défaut

    Citation Envoyé par deebou Voir le message
    Si la configuration de compilation est MinGW, sous QtCreator, ca compile, ca linke, mais la DLL n'est pas chargée à l'exécution et donc ca plante (SEGV) à l'exécution de toute fonction de la DLL (VideoForWindowsVersion() par exemple).

    Auriez-vous une idée?
    Salut,

    je n'ai quasiment jamais bossé avec MinGW et encore moins avec QtCreator.
    Vu que tu es sous Windows et que tu as un souci de dépendances, que dit notre indispensable depends ?

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •