[Qt] Du code de MSDN compilé avec Qt Creator ne s'exécute pas bien

Le
orax
Bonjour, j'essaie de compiler avec Qt Creator le code provenant de ce
site : http://msdn.microsoft.com/en-us/library/ms686701(VS.85).aspx mais
sans succès. Ca marche pourtant très bien avec Dev-C++ ou Visual C++ 6.
J'ai tout de même pu le compiler en le simplifiant beaucoup.
J'ai Qt Creator 1.2.1 avec Qt 4.5.2.


Voilà ci-dessous le code que j'ai à l'heure actuelle. Il s'exécute bien
quand il est compilé avec DevC++ ou VC++ 6, mais quand il est compilé
avec Qt Creator, le _tprintf() me renvoie, par exemple, "PROCESS NAME:
P", (juste une lettre, au lieu de me renvoyer le nom complet du processus).

#include <QtCore/QCoreApplication>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>

// Forward declarations:
BOOL GetProcessList( );
void printError( TCHAR* msg );

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
GetProcessList();
system("PAUSE");

//return 0;
return a.exec();
}

BOOL GetProcessList( )
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;

// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
return( FALSE );
}

// Set the size of the structure before using it.
pe32.dwSize = sizeof( PROCESSENTRY32 );

// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First( hProcessSnap, &pe32 ) )
{
CloseHandle( hProcessSnap ); // clean the snapshot object
return( FALSE );
}

do
{
printf( "==" );
_tprintf( TEXT("PROCESS NAME: %s"), pe32.szExeFile );
printf( "--" );

} while( Process32Next( hProcessSnap, &pe32 ) );

CloseHandle( hProcessSnap );
return( TRUE );
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Loïc
Le #20346421
"orax" 4ad4d540$0$960$
Bonjour, j'essaie de compiler avec Qt Creator le code provenant de ce site
: http://msdn.microsoft.com/en-us/library/ms686701(VS.85).aspx mais sans
succès. Ca marche pourtant très bien avec Dev-C++ ou Visual C++ 6.
J'ai tout de même pu le compiler en le simplifiant beaucoup.
J'ai Qt Creator 1.2.1 avec Qt 4.5.2.


Voilà ci-dessous le code que j'ai à l'heure actuelle. Il s'exécute bien
quand il est compilé avec DevC++ ou VC++ 6, mais quand il est compilé avec
Qt Creator, le _tprintf() me renvoie, par exemple, "PROCESS NAME: P",
(juste une lettre, au lieu de me renvoyer le nom complet du processus).



C'est forcément un problème Unicode <=> Ansi
Vérifie les propriéts du projet (comme "character set" pour VS)
orax
Le #20347071
Le seul truc que j'ai trouvé c'est : menu Edit->Select Encoding... J'ai
sélectionné UTF-8 mais ça ne change rien, je pense que c'est juste
l'encodage des fichiers sources.
Loïc
Le #20347551
"orax" 4ad4eeae$0$965$
Le seul truc que j'ai trouvé c'est : menu Edit->Select Encoding... J'ai
sélectionné UTF-8 mais ça ne change rien, je pense que c'est juste
l'encodage des fichiers sources.



Tu as débuggé ? En mettant un break sur pe32.szExeFile pour évaluer sa
valeur
Et tester en enlevant TEXT(), qui est pour l'Unicode.
orax
Le #20351241
Loïc a écrit :
Tu as débuggé ? En mettant un break sur pe32.szExeFile pour évaluer sa
valeur
Et tester en enlevant TEXT(), qui est pour l'Unicode.





Oui, j'avais déjà essayé tout ça. Je l'ai débuggé mais je ne vois pas
vraiment la valeur de pe32.szExeFile, disons plutôt que je vois les
valeurs ASCII contenues dans le tableau WCHAR (pe32.szExeFile est un
WCHAR). Je vois, par exemple, pour le premier arrêt sur le breakpoint :
91, 83, 121, 115, 116, ..., ce qui correspond au premier nom de
processus : [System]. Je vois donc dans le débuggueur, les valeurs ASCII
(ou Unicode, je ne sais pas), au lieu de voir une chaine de caractères.


Et j'ai dû oublié de le dire, j'ai un avertissement au moment de la
compilation :
main.cpp:49: warning: char format, different type arg (arg 2)

et c'est au niveau de la ligne :
_tprintf( TEXT("nPROCESS NAME: %s"), pe32.szExeFile );

Par contre, avec VC++ et devcpp, je n'ai pas d'erreur ni d'avertissement.
nico
Le #20351701
orax wrote:
Loïc a écrit :
Tu as débuggé ? En mettant un break sur pe32.szExeFile pour évaluer
sa valeur
Et tester en enlevant TEXT(), qui est pour l'Unicode.




Oui, j'avais déjà essayé tout ça. Je l'ai débuggé mais je ne vois pas
vraiment la valeur de pe32.szExeFile, disons plutôt que je vois les
valeurs ASCII contenues dans le tableau WCHAR (pe32.szExeFile est un
WCHAR).




Non pas forcément, PROCESSENTRY32 dépend des options Unicode ou pas (tu
le vois dans le .h)
Si tu as 91, 83, 121, 115, 116, c'est que c'est pas Unicode
Si tu fais juste un printf, ça devrait l'afficher...
(ou alors tu convertis avec MultiByteToWideChar ou d'autres fonctions)
Publicité
Poster une réponse
Anonyme