Mkdir %APPDATA%/inject32/ comment faire?

alphaone Messages postés 134 Date d'inscription vendredi 2 mai 2003 Statut Membre Dernière intervention 14 novembre 2009 - 10 déc. 2008 à 06:54
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Derniè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.

9 réponses

fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
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;
 
    bResult = FALSE;
    if (SUCCEEDED (SHGetMalloc (&pMalloc)))
     {
       if (SUCCEEDED (SHGetSpecialFolderLocation (NULL, nFolder, &pidl)))
          {
            bResult = SHGetPathFromIDList (pidl, path.GetBuffer(_MAX_PATH));
               path.ReleaseBuffer();
            pMalloc->Free (pidl);
        }
        pMalloc->Release ();
    }
    return bResult;
}
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
10 déc. 2008 à 14:15
Salut,

SHGetMalloc est deprecated.

%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         */

  hInput = GetStdHandle(STD_INPUT_HANDLE);
  GetConsoleMode(hInput, &nOldMode);
  SetConsoleMode(hInput, 0);
  ReadConsole(hInput, &buffer, 1, &nRead, NULL);
  SetConsoleMode(hInput, nOldMode);
}

/**
 * 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;

  /* Traduction des caractère àùéè... */
  nSize = lstrlen(lpText);
  lpOemText = (char*)Memory_AllocPage(nSize);
  CharToOem(lpText, lpOemText);

  bRes = WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), lpOemText,
                       nSize, &nWritten, NULL);

  Memory_FreePage(lpOemText);
  return 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();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMessageBuffer, 0, NULL);

  /* Affichage du message */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  return nLastError;
}

/**
 * Point d'entrée du programme
 *
 * @return Code d'erreur du processus
 */
#ifdef NDEBUG
int __cdecl mainCRTStartup()
#else
int main()
#endif
{
  TCHAR lpAppData[MAX_PATH];
  DWORD nSize;

  nSize = GetEnvironmentVariable(_T("APPDATA"), lpAppData, MAX_PATH);

  if (nSize == 0)
    ExitProcess(ShowLastError());

  if (nSize > MAX_PATH)
  {
    SetLastError(ERROR_INSUFFICIENT_BUFFER);
    ExitProcess(ShowLastError());
  }

  lstrcat(lpAppData, _T("\\inject32"));
  Console_Write(lpAppData);

  Console_Pause();
 
  return 0;
}
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
10 déc. 2008 à 16:26
J'aurai encore apprend qq chose aujourd'hui Je ne vois pas APPDATA dans "variables d'environnements". Mais on voit bien avec la commande set.

Bon je vais donc garder SHGetSpecialFolderLocation, virer SHGetMalloc pour y mettre CoTaskMemAlloc.

C'est drôle, apporter une solution à une question nous permet, quelque fois, de voir qu'on fait mal les choses.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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".
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 déc. 2008 à 15:09
Manque un LocalFree dans ma ShowLastError.
0
Rejoignez-nous