Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > Qt > EDI > Qt Creator
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/04/2012, 17h21   #1
deebou
Nouveau Membre du Club
 
Inscription : septembre 2007
Messages : 64
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 64
Points : 35
Points : 35
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.
deebou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2012, 14h05   #2
deebou
Nouveau Membre du Club
 
Inscription : septembre 2007
Messages : 64
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 64
Points : 35
Points : 35
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...
deebou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2012, 16h15   #3
mala92
Expert Confirmé
 
Homme
Développeur informatique
Inscription : décembre 2011
Messages : 1 250
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2011
Messages : 1 250
Points : 2 524
Points : 2 524
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 ?
mala92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h02.


 
 
 
 
Partenaires

Hébergement Web