BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
29 août 2005 à 08:42
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
30 août 2005 à 13:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 30 août 2005 à 13:47
Elles datent du shell32.dll V5 apparu avec Win2000 fin 1999.
marc_pl
Messages postés10Date d'inscriptiondimanche 11 avril 2004StatutMembreDernière intervention13 septembre 2009 30 août 2005 à 13:40
En fait c'est comme ça qu'on les appelle quand je les ai trouvées sur internet, elles ne sont ni dans shell32.lib ni dans la doc msdn sur CD (elle date de visual c++ 6). Peut-être que microsoft les a rajouté après.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 29 août 2005 à 23:11
//On est dans l'explorateur, dans la liste des fichiers
//On regarde si on n'est pas sur un dossier
char DossierSelectionne[255];
ZeroMemory(DossierSelectionne,255);
if(ListView_GetHotItem(hwndListView) != -1)
{
//On est sur un fichier
OpenClipboard(NULL);
EmptyClipboard();
CloseClipboard();
HookGetItemText();//Le hook envoie les données dans le presse papier
HANDLE hgbl = NULL;
//On attend que les données arrivent dans le presse papier
while(IsClipboardFormatAvailable(CF_TEXT) == NULL);
if(strcmp(nom,"Program Manager") == 0)
{
//On est dans le bureau
strcpy(Chemin,getenv("USERPROFILE"));
if(strcmp(DossierSelectionne,"Mes documents") != 0)
strcat(Chemin,"\\Bureau");
}
else
{
if (pv)
{
result = ((LPITEMIDLIST ( WINAPI*)(LPCITEMIDLIST))ILClone2)((LPCITEMIDLIST)pv);
((BOOL (WINAPI *)(LPVOID))SHUnlockShared2)(pv);
}
((BOOL (WINAPI *)(HANDLE, DWORD))SHFreeShared2)(hMem, pid);
}
SHGetPathFromIDList(result,Chemin);
FreeLibrary(hShell32);
}
if(DossierSelectionne[0]!=0)
{
//On teste si c'est bien un dossier ou si c'est un fichier
char temp[1000];
strcpy(temp,Chemin);
strcat(temp,"\");
strcat(temp,DossierSelectionne);
30 août 2005 à 13:47
30 août 2005 à 13:40
29 août 2005 à 23:11
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/functions.asp
29 août 2005 à 22:51
Voici ma fonction utilisant les fonctions non-documentées:
char *ShellGetPath()
{
POINT pt;
GetCursorPos(&pt);
HWND hwndListView = WindowFromPoint(pt);
char nom[255];
GetWindowText(hwndListView,nom,255);
if(strcmp(nom,"FolderView") != 0)
{
return NULL;
}
//On est dans l'explorateur, dans la liste des fichiers
//On regarde si on n'est pas sur un dossier
char DossierSelectionne[255];
ZeroMemory(DossierSelectionne,255);
if(ListView_GetHotItem(hwndListView) != -1)
{
//On est sur un fichier
OpenClipboard(NULL);
EmptyClipboard();
CloseClipboard();
HookGetItemText();//Le hook envoie les données dans le presse papier
HANDLE hgbl = NULL;
//On attend que les données arrivent dans le presse papier
while(IsClipboardFormatAvailable(CF_TEXT) == NULL);
OpenClipboard(NULL);
hgbl = GetClipboardData(CF_TEXT);
char *string = (char*)GlobalLock(hgbl);
strcpy(DossierSelectionne,string);
EmptyClipboard();
CloseClipboard();
UnHook();
}
char *Chemin = new char[1000];
HWND hWnd = hwndListView;
while(GetParent(hWnd)!=0)
hWnd = GetParent(hWnd);
GetWindowText(hWnd,nom,255);
if(strcmp(nom,"Program Manager") == 0)
{
//On est dans le bureau
strcpy(Chemin,getenv("USERPROFILE"));
if(strcmp(DossierSelectionne,"Mes documents") != 0)
strcat(Chemin,"\\Bureau");
}
else
{
HINSTANCE hShell32;
FARPROC SHFreeShared2;
FARPROC SHLockShared2;
FARPROC SHUnlockShared2;
FARPROC ILClone2;
hShell32 = LoadLibrary("shell32.dll");
SHFreeShared2 = GetProcAddress(hShell32, "SHFreeShared");
SHLockShared2 = GetProcAddress(hShell32, "SHLockShared");
SHUnlockShared2 = GetProcAddress(hShell32, "SHUnlockShared");
ILClone2 = GetProcAddress(hShell32, "ILClone");
LPITEMIDLIST result = NULL;
DWORD pid = GetCurrentProcessId();
HANDLE hMem = (HANDLE)SendMessage(hWnd, CWM_GETPATH, pid, 0);
if (hMem)
{
LPVOID pv = ((LPVOID (WINAPI *)(HANDLE, DWORD))SHLockShared2)((void **)hMem, pid);
if (pv)
{
result = ((LPITEMIDLIST ( WINAPI*)(LPCITEMIDLIST))ILClone2)((LPCITEMIDLIST)pv);
((BOOL (WINAPI *)(LPVOID))SHUnlockShared2)(pv);
}
((BOOL (WINAPI *)(HANDLE, DWORD))SHFreeShared2)(hMem, pid);
}
SHGetPathFromIDList(result,Chemin);
FreeLibrary(hShell32);
}
if(DossierSelectionne[0]!=0)
{
//On teste si c'est bien un dossier ou si c'est un fichier
char temp[1000];
strcpy(temp,Chemin);
strcat(temp,"\");
strcat(temp,DossierSelectionne);
FILE *stream;
stream = fopen(temp,"r");
if(stream == NULL)
{
//C'est un dossier
strcat(Chemin,"\");
strcat(Chemin,DossierSelectionne);
}
else
{
//C'est un fichier
fclose(stream);
}
}
return Chemin;
}
Les fonctions sont:
SHFreeShared
SHLockShared
SHUnlockShared
ILClone
A cela il faut ajouter la définition:
#define CWM_GETPATH (WM_USER+12)
29 août 2005 à 08:42
peux-tu indiquer quelles sont les fonctions non documentées que tu emploies ?