Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses
Avatar
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( "\n\n=====================================================" );
_tprintf( TEXT("\nPROCESS NAME: %s"), pe32.szExeFile );
printf( "\n-----------------------------------------------------" );

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

CloseHandle( hProcessSnap );
return( TRUE );
}

5 réponses

Avatar
Loïc
"orax" a écrit dans le message de news:
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)
Avatar
orax
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.
Avatar
Loïc
"orax" a écrit dans le message de news:
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.
Avatar
orax
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.
Avatar
nico
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)