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

Besoin d'aide s'il vous plait pour effacer une ligne dans les historique d 'IE.

11 réponses
Avatar
bertrand doradoux
Salut a tous.
Voila je suis actuellement en train de develloper un mini browser ,avec le
moteur Ie, pour un client , mais ce dernier ne veut pas pour des raisons
de securite que la navigation effectué avec ce browser apparaissent dans les
historiqes d'IE. Donc j'ai recherché et j'ai trouvé un exemple de source sur
le site de microsoft qui apparement permet d'effacer des lignes de
l'historique. Le probleme c'est que lorsque j'essai d'executer ce code tout
se passe bien, sauf que bien que je ne recupere aucun message d'erreur,
lorsque je regarde l'historique dans IE et bien je m'apercois qu'il n'y a
aucune ligne d'effacer .
Auriez vous s'il vous plait une solution a mon probleme, c'esta dire soit
pour effacer une ligne dans l'historique d'IE, soit pour que le control Web
que j'utilise dans mon appli n'enregistre pas automatiquement l'url dans les
favoris.

Je joint ci dessous l'exemple de code source recuperer qur le site de
microsoft et qui apparement ne fonctionne pas. La ligne qui apparement pose
probleme est la ligne ou
figure l'intruction .:pUrlHistoryStg2->DeleteUrl(........).

D'avance merci a ceux qui prendront le temps de me donner un petit coup de
pouce , car la je suis vraiment dans l'embarras pour ne pas dire plus .

USES_CONVERSION;
CoInitialize(NULL);

IUrlHistoryStg2* pUrlHistoryStg2 = NULL;
HRESULT hr = CoCreateInstance(CLSID_CUrlHistory,NULL, CLSCTX_INPROC,
IID_IUrlHistoryStg2,(void**)&pUrlHistoryStg2);

IEnumSTATURL* pEnumURL;
hr = pUrlHistoryStg2->EnumUrls(&pEnumURL);

STATURL suURL;
ULONG pceltFetched;
suURL.cbSize = sizeof(suURL);
hr = pEnumURL->Reset();

while((hr = pEnumURL->Next(1, &suURL, &pceltFetched)) == S_OK)
{
hr = pUrlHistoryStg2->DeleteUrl(suURL.pwcsUrl, 0);
printf("\"%s\" deleted.\n", W2T(suURL.pwcsUrl));
}
pEnumURL->Release();
pUrlHistoryStg2->Release();
CoUninitialize();

10 réponses

1 2
Avatar
Christian ASTOR
bertrand doradoux wrote:

Je joint ci dessous l'exemple de code source recuperer qur le site de
microsoft et qui apparement ne fonctionne pas. La ligne qui apparement pose
probleme est la ligne ou
figure l'intruction .:pUrlHistoryStg2->DeleteUrl(........).



L'historique/user est un Shell namespace ds CSIDL_HISTORY, donc qu'on
peut énumérer.
(Qd InetCpl le vide, il appelle IUrlHistoryStg2 ::ClearHistory(), qui
passe aussi par l'int. IHistSFPrivate)
Avatar
Patrick Philippot
Christian ASTOR wrote:
L'historique/user est un Shell namespace ds CSIDL_HISTORY, donc qu'on
peut énumérer.
(Qd InetCpl le vide, il appelle IUrlHistoryStg2 ::ClearHistory(), qui
passe aussi par l'int. IHistSFPrivate)



Bonjour Christian,

Le problème c'est que la méthode IUrlHistoryStg2->DeleteUrl ne fait
absolument rien. C'est un bug recensé depuis plus de 2 ans et il n'est
toujours pas corrigé. Le seul fix proposé est de passer par
IContextMenu::InvokeCommand, ce qui provoque l'affichage de la boîte de
dialogue de confirmation de suppression. C'est carrément ridicule.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Après discussion avec quelques collègues et relecture plus attentive de
l'article:

"
MORE INFORMATION
The IUrlHistoryStg2::ClearHistory method clears the deleted history
items from the Internet Explorer History Shell folder and internally.
DeleteUrl is not designed to delete the Internet Explorer History Shell
folder entries. Because many internal functions rely on this method, its
behavior cannot be changed.
"

Ceci semble indiquer, si je traduis bien, que ClearHistory ne devrait
supprimer que les éléments marqués comme "deleted" par DeleteURL. Or
cela ne semble pas être le cas.

Par ailleurs, il m'est dit que souvent, l'effet de la suppression n'est
visible qu'après fermeture de toutes les sessions IE. Tout ceci pour des
raisons obscures de synchronisation.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Christian ASTOR
Patrick Philippot wrote:

Le problème c'est que la méthode IUrlHistoryStg2->DeleteUrl ne fait
absolument rien. C'est un bug recensé depuis plus de 2 ans et il n'est
toujours pas corrigé. Le seul fix proposé est de passer par
IContextMenu::InvokeCommand, ce qui provoque l'affichage de la boîte de
dialogue de confirmation de suppression. C'est carrément ridicule.



Oui, mais l'énumération par IUrlHistoryStg2 ne semble pas concerner les
adresses de l'historique par user, qui sont ds l'"extensible cache"
(fichiers cachés) (du moins chez moi...)
Je voulais dire qu'on peut les énumérer par l'IShellFolder comme pour
tout namespace.
Et si on veut les supprimer 1 par 1, on peut faire par ex. avec
FindFirstUrlCacheEntry()... DeleteUrlCacheEntry() qui marche (rapidement
testé sur NT4, IE 5.5) (ce que fait l'Explorer sur click droit)
La principale difficulté est de récupérer le "cache prefix" (par
FindFirstUrlCacheContainerA() par ex, le nom des containers matchant les
noms des pidl de l'IShellFolder (donc un peu tordu comme méthode))
Avatar
bertrand doradoux
ah ok
Je n'avais pas compris cela, mais je vais faire le test de suite pour voir
si cela marche.
Quoi qu'il en soirt je vous remercie de votre réponse



"Patrick Philippot" a écrit dans le
message de news:ct8g98$26ka$
Après discussion avec quelques collègues et relecture plus attentive de
l'article:

"
MORE INFORMATION
The IUrlHistoryStg2::ClearHistory method clears the deleted history
items from the Internet Explorer History Shell folder and internally.
DeleteUrl is not designed to delete the Internet Explorer History Shell
folder entries. Because many internal functions rely on this method, its
behavior cannot be changed.
"

Ceci semble indiquer, si je traduis bien, que ClearHistory ne devrait
supprimer que les éléments marqués comme "deleted" par DeleteURL. Or
cela ne semble pas être le cas.

Par ailleurs, il m'est dit que souvent, l'effet de la suppression n'est
visible qu'après fermeture de toutes les sessions IE. Tout ceci pour des
raisons obscures de synchronisation.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr




Avatar
bertrand doradoux
Tu aurais un exemple de ce dont tu parles car je ne suis pas sur de tout
comprendre.
Merci

"Christian ASTOR" a écrit dans le message de
news:41f7f2c5$0$26211$
Patrick Philippot wrote:

> Le problème c'est que la méthode IUrlHistoryStg2->DeleteUrl ne fait
> absolument rien. C'est un bug recensé depuis plus de 2 ans et il n'est
> toujours pas corrigé. Le seul fix proposé est de passer par
> IContextMenu::InvokeCommand, ce qui provoque l'affichage de la boîte de
> dialogue de confirmation de suppression. C'est carrément ridicule.

Oui, mais l'énumération par IUrlHistoryStg2 ne semble pas concerner les
adresses de l'historique par user, qui sont ds l'"extensible cache"
(fichiers cachés) (du moins chez moi...)
Je voulais dire qu'on peut les énumérer par l'IShellFolder comme pour
tout namespace.
Et si on veut les supprimer 1 par 1, on peut faire par ex. avec
FindFirstUrlCacheEntry()... DeleteUrlCacheEntry() qui marche (rapidement
testé sur NT4, IE 5.5) (ce que fait l'Explorer sur click droit)
La principale difficulté est de récupérer le "cache prefix" (par
FindFirstUrlCacheContainerA() par ex, le nom des containers matchant les
noms des pidl de l'IShellFolder (donc un peu tordu comme méthode))


Avatar
bertrand doradoux
Je viens de faire des test afin de verifier toutes les combinaisons possible
entre DeleteUrl et ClearHistory
et en fait rien ne marche, de temps en temps ClearHistory fonctionne mais
quand c'est le cas cela efface tout l'historique
et pas seulement les urls marqué a l'effacement par DeleteUrl.
J'avou que la je me sens un peu planté sur ce probleme

"bertrand doradoux" a écrit dans le
message de news:41f80f8c$0$26206$
ah ok
Je n'avais pas compris cela, mais je vais faire le test de suite pour voir
si cela marche.
Quoi qu'il en soirt je vous remercie de votre réponse



"Patrick Philippot" a écrit dans le
message de news:ct8g98$26ka$
> Après discussion avec quelques collègues et relecture plus attentive de
> l'article:
>
> "
> MORE INFORMATION
> The IUrlHistoryStg2::ClearHistory method clears the deleted history
> items from the Internet Explorer History Shell folder and internally.
> DeleteUrl is not designed to delete the Internet Explorer History Shell
> folder entries. Because many internal functions rely on this method, its
> behavior cannot be changed.
> "
>
> Ceci semble indiquer, si je traduis bien, que ClearHistory ne devrait
> supprimer que les éléments marqués comme "deleted" par DeleteURL. Or
> cela ne semble pas être le cas.
>
> Par ailleurs, il m'est dit que souvent, l'effet de la suppression n'est
> visible qu'après fermeture de toutes les sessions IE. Tout ceci pour des
> raisons obscures de synchronisation.
>
> --
> Patrick Philippot - Microsoft MVP
> MainSoft Consulting Services
> www.mainsoft.fr
>
>




Avatar
Patrick Philippot
bertrand doradoux wrote:
J'avoue que la je me sens un peu planté sur ce probleme



Au fait, quand vous dîtes que les entrées ne sont pas supprimées, vous
vérifiez où? Dans la liste déroulante de la barre d'adresses de IE? Dans
la vraie History List? Dans les deux? Ce sont 2 entités différentes.

Pour la liste de la barre adresse, vous pouvez accéder à ces entrées
dans

HKCUSoftwareMicrosoftInternet ExplorerTypedURLs

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Dans tous les cas, j'ai peur qu'il n'y ait pas de solution satisfaisante
à votre problème. Attaquer les fichiers directement n'est pas une bonne
solution car cela génèrerait probablement des effets de bords.

Puisque l'on peut procéder à cette suppression manuellement, on doit
pouvoir le faire par programme mais visiblement, cette opération semble
verrouillée pour une raison inconnue.

Notez également que supprimer les entrées dans l'history ne suffira pas
à atteindre votre objectif. Il faut aussi supprimer les mêmes entrées
danz la liste AutoComplete. Il y a un utilitaire PC Mag qui fait ça,
AutoWhat. Voir article à cette adresse:

http://www.pcmag.com/article2/0,1759,197551,00.asp

section Inside Autowhat2.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Christian ASTOR
bertrand doradoux wrote:

Tu aurais un exemple de ce dont tu parles car je ne suis pas sur de tout
comprendre.



Quick & dirty ex en mode console.
Mettre en commentaire DeleteUrlCacheEntry() qui efface les URL.
A améliorer car l'énumératon n'est pas correcte (doublons + anciennes URL)
Mais la suppression marche (sur NT4 et 98 en tout cas)...

#include <windows.h>
#include <stdio.h>
#include <wininet.h>
#pragma comment(lib,"wininet")

int main(int argc, char* argv[])
{
HINSTANCE hLib;
hLib = LoadLibrary("WININET.DLL");
if (hLib)
{
typedef struct _INTERNET_CACHE_CONTAINER_INFO
{
DWORD dwCacheVersion;
LPTSTR sName;
LPTSTR sCachePrefix;
LPTSTR sVolumeLabel;
LPTSTR sVolumeTitle;
} INTERNET_CACHE_CONTAINER_INFOA, *
LPINTERNET_CACHE_CONTAINER_INFOA;

HANDLE (FAR STDAPICALLTYPE *
pFindFirstUrlCacheContainer)(LPDWORD pdwLastModified,
LPINTERNET_CACHE_CONTAINER_INFOA lpContainerInfo,
LPDWORD lpdwContainerInfoBufferSize, DWORD dwOptions);
(FARPROC&)pFindFirstUrlCacheContainer =
GetProcAddress(hLib,"FindFirstUrlCacheContainerA" );
BOOL (FAR STDAPICALLTYPE *
pFindNextUrlCacheContainer)(HANDLE hEnumHandle,
LPINTERNET_CACHE_CONTAINER_INFOA lpContainerInfo, LPDWORD
lpdwContainerInfoBufferSize);
(FARPROC&)pFindNextUrlCacheContainer =
GetProcAddress(hLib,"FindNextUrlCacheContainerA" );

if (pFindFirstUrlCacheContainer && pFindNextUrlCacheContainer)
{
HANDLE hContainerEnum, hURLEnum;
DWORD dwLastModified;
DWORD dwCIBufferSize;
DWORD dwOptions=0;
struct
{
INTERNET_CACHE_CONTAINER_INFOA cInfo;
char sBuffer[MAX_PATH*2];
} ContainerInfo;
char sCachePrefix[MAX_PATH];

hContainerEnum =
pFindFirstUrlCacheContainer(&dwLastModified, &ContainerInfo.cInfo,
&dwCIBufferSize, dwOptions);
if (hContainerEnum)
{
for (;;)
{
if (ContainerInfo.cInfo.sCachePrefix[0]
!= NULL)
{
printf("Container Name = %sn",
ContainerInfo.cInfo.sName);
strcpy(sCachePrefix,
ContainerInfo.cInfo.sCachePrefix);
printf("Cache Prefix = %sn",
sCachePrefix);
DWORD dwBufferSize = 6144;
LPINTERNET_CACHE_ENTRY_INFOA lpCEI
= NULL;
lpCEI =
(LPINTERNET_CACHE_ENTRY_INFO)LocalAlloc(LPTR, dwBufferSize);
hURLEnum =
FindFirstUrlCacheEntry(sCachePrefix, lpCEI, &dwBufferSize);
if (hURLEnum)
{
for (;;)
{
printf("tSource URL =
%sn", lpCEI->lpszSourceUrlName);
DeleteUrlCacheEntry(lpCEI->lpszSourceUrlName);
//printf("tLocal
filename : %sn", lpCEI->lpszLocalFileName);
if
(!FindNextUrlCacheEntry(hURLEnum, lpCEI, &dwBufferSize))
{
if
(GetLastError() == ERROR_NO_MORE_ITEMS)
break;
}
}
FindCloseUrlCache(hURLEnum);
}

}
dwCIBufferSize = sizeof(ContainerInfo);
if
(!pFindNextUrlCacheContainer(hContainerEnum, &ContainerInfo.cInfo,
&dwCIBufferSize))
{
if (GetLastError() ==
ERROR_NO_MORE_ITEMS)
break;
}
}
FindCloseUrlCache(hContainerEnum);
}
}
FreeLibrary(hLib);
}
return 0;
}
1 2