alphaone
Messages postés134Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention14 novembre 2009
-
10 déc. 2008 à 06:54
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 2014
-
23 déc. 2008 à 15:09
Bonjour, j'aimerai creer le dossier %APPDATA%/inject32/ sachant que le systéme windows doit remplacer le %APPDATA% par le chemain du dossier application data, voila mon code qui marche pas:
//folder for copy list
QDir dir("%APPDATA%/inject32/");
if(!dir.exists())
{
DEBUGCONSOLE(70,"UIcon::UIcon","Folder not found: %APPDATA%/inject32/");
if(!dir.mkdir("%APPDATA%/inject32/"))
{
if(!CreateDirectory(TEXT("%APPDATA%/inject32/"),NULL))
{
DEBUGCONSOLE(10,"UIcon::UIcon","Unable to mkdir: %APPDATA%/inject32/");
}
}
}
Il y a donc une tentative en Qt puis une tentative en API win32 pur.
fregolo52
Messages postés1114Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20214 10 déc. 2008 à 09:22
Salut,
Pour QT, je coince, je ne connais pas.
Par contre en win32, tu devrais utiliser ca : voici une source que j'ai trouvé sur le Net :
BOOL GetSpecialFolderLocation (int nFolder, CString& path)
{
BOOL bResult;
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
%APPDATA% utilisé dans un chemin... On est pas dans le DOS.
Faut plutôt la récupérer avec GetEnvironmentVariable.
<hr size="2" width="100%" />#define UNICODE
/*
Pour compiler sous gcc en release, ajouter :
-nostartfiles -nodefaultlibs -nostdlib
dans les options du lieur.
*/
/* Suppression de la CRT sous VC */
#ifdef NDEBUG
#pragma comment(linker, "/NODEFAULTLIB")
#endif
/* Gestion de la compilation en unicode */
#ifdef UNICODE
#define _T(x) L ## x
typedef unsigned short TCHAR;
#else
#define _T(x) x
typedef char TCHAR;
#endif
#include "windows.h"
/**
* Alloue une zone mémoire en utilisant VirtualAlloc
*
* @param nSize Taille de la zone à allouer
* @return Pointeur sur la zone allouée
*/
void* __stdcall Memory_AllocPage(DWORD nSize)
{
return VirtualAlloc(NULL, nSize,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE);
}
/**
* Libère une zone mémoire allouée avec Memory_AllocPage
*
* @param Pointeur sur la zone allouée
*/
void __stdcall Memory_FreePage(void* lpAddress)
{
VirtualFree(lpAddress, 0, MEM_RELEASE);
}
/**
* Attend que l'utilisateur presse une touche avant de continuer l'exécution
*/
void __stdcall Console_Pause()
{
HANDLE hInput; /* Handle de l'entrée standard */
DWORD nRead; /* Nombre d'octets lus */
TCHAR buffer; /* Réception du caractère */
DWORD nOldMode; /* Sauvegarde le mode précédent pour le restituer */
/**
* Affiche le texte indiqué dans la console
*
* @param lpText Texte à écrire dans la console
* @return FALSE en cas de problème
*/
BOOL __stdcall Console_Write(TCHAR* lpText)
{
DWORD nWritten; /* Réception du nombre de caractère écris */
char* lpOemText; /* Texte traduit en OEM */
DWORD nSize; /* Taille du texte à écrire */
BOOL bRes;
/**
* Affiche le message d'erreur associé à la dernière erreur Win32
*
* @return Le code de la dernière erreur
*/
DWORD __stdcall ShowLastError()
{
DWORD nLastError; /* Code de la dernière erreur */
TCHAR* lpMessageBuffer; /* Message d'erreur associé */
/* Récupération du numéro de l'erreur */
nLastError = GetLastError();
fregolo52
Messages postés1114Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20214 10 déc. 2008 à 15:51
[auteur/RT15/464943.aspx rt15]
tu veux dire que je bosse pas avec les bons outils ? VC6 avec sa MSDN qui date de euh.. 1998 (je crois) ?
Merci pour l'info, je vais changer pour CoTaskMemFree.
Perso je veux ecrire dans "All Users". J'ai tenté, sans succès :
GetEnvironmentVariable(_T("COMMONAPPDATA"), ... et
GetEnvironmentVariable(_T("COMMON_APPDATA"), ...
Mais ce n'est peut-être pas une variable d'environnement.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 10 déc. 2008 à 15:58
Je travaille aussi régulièrement sous CV6 : c'est l'IDE du boulot !
Par contre, je n'ai pas la msdn sur mon dur... Je préfère utiliser celle de Borland ou utiliser Google.
Pour avoir la liste des variables d'environnement, on peut bien sûr aller dans les propriété du poste de travail (Windows + pause), onglet avancé, bouton "variables d'environnements".
Ou taper set dans une invite de commande.
Je n'ai pas de COMMONAPPDATA chez moi, par contre j'ai ALLUSERSPROFILE qui pointe sur All Users.
Vous n’avez pas trouvé la réponse que vous recherchez ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 10 déc. 2008 à 17:23
Salut,
En Win32, l'appel d'une seule fonction suffit pour récupérer le chemin complet d'un dossier spécial de Windows. Pour "Application Data" faire:
#include <windows.h>
#include <shlobj.h>
//...
char buffer[MAX_PATH];
SHGetFolderPath(0,CSIDL_APPDATA,0,0,buffer);
Le 2ème paramètre permet de spécifier le dossier voulu.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 10 déc. 2008 à 17:34
Ah tiens elle est deprecated aussi celle là. Mais bon apparemment pas d'autres alternatives avant Vista. Et elle fonctionne sous Vista. Ma méthode est quand à elle jugée "may not be reliable".
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 10 déc. 2008 à 18:00
Oui elle est déclarée deprecated pour Vista si on veut un plus grand nombre d'identificateurs. En effet, SHGetKnownFolderPath() utilise un identificateur de 128 bits (GUID) au lieu de 32 bits pour SHGetFolderPath(). C'est la seule différence entre les deux. SHGetFolderPath() est donc toujours utilisable même sous Vista.