- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 C# 中使用 P/Invoke 来清除缓存条目,如下所示。该代码似乎适用于 32 位和 64 位的 Windows 7。在 Windows 8 Release Candidate 上,它在调用 DeleteUrlsFromGroup
时挂起。
[DllImport(@"wininet",
SetLastError = true,
CharSet = CharSet.Auto,
EntryPoint = "FindFirstUrlCacheGroup",
CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr FindFirstUrlCacheGroup(
int dwFlags,
int dwFilter,
IntPtr lpSearchCondition,
int dwSearchCondition,
ref long lpGroupId,
IntPtr lpReserved);
// For PInvoke: Retrieves the next cache group in a cache group enumeration
[DllImport(@"wininet",
SetLastError = true,
CharSet = CharSet.Auto,
EntryPoint = "FindNextUrlCacheGroup",
CallingConvention = CallingConvention.StdCall)]
private static extern bool FindNextUrlCacheGroup(
IntPtr hFind,
ref long lpGroupId,
IntPtr lpReserved);
// For PInvoke: Releases the specified GROUPID and any associated state in the cache index file
[DllImport(@"wininet",
SetLastError = true,
CharSet = CharSet.Auto,
EntryPoint = "DeleteUrlCacheGroup",
CallingConvention = CallingConvention.StdCall)]
private static extern bool DeleteUrlCacheGroup(
long GroupId,
int dwFlags,
IntPtr lpReserved);
// For PInvoke: Begins the enumeration of the Internet cache
[DllImport(@"wininet",
SetLastError = true,
CharSet = CharSet.Auto,
EntryPoint = "FindFirstUrlCacheEntryA",
CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr FindFirstUrlCacheEntry(
[MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,
IntPtr lpFirstCacheEntryInfo,
ref int lpdwFirstCacheEntryInfoBufferSize);
// For PInvoke: Retrieves the next entry in the Internet cache
[DllImport(@"wininet",
SetLastError = true,
CharSet = CharSet.Auto,
EntryPoint = "FindNextUrlCacheEntryA",
CallingConvention = CallingConvention.StdCall)]
private static extern bool FindNextUrlCacheEntry(
IntPtr hFind,
IntPtr lpNextCacheEntryInfo,
ref int lpdwNextCacheEntryInfoBufferSize);
// For PInvoke: Removes the file that is associated with the source name from the cache, if the file exists
[DllImport(@"wininet",
SetLastError = true,
CharSet = CharSet.Auto,
EntryPoint = "DeleteUrlCacheEntryA",
CallingConvention = CallingConvention.StdCall)]
static extern bool DeleteUrlCacheEntry(string lpszUrlName);
/// <summary>
/// Clears the cache of the web browser
/// </summary>
[HandleProcessCorruptedStateExceptions]
public static void ClearCache(Uri hostName)
{
if (hostName == null)
{
return;
}
long groupId = 0;
try
{
// Delete the groups first.
IntPtr enumHandle = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL, IntPtr.Zero, 0, ref groupId, IntPtr.Zero);
if (enumHandle != IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
{
return;
}
// Loop through Cache Group, and then delete entries.
while (true)
{
if (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error())
{
break;
}
// Delete a particular Cache Group.
// Hangs on WIndows 8
bool returnValue = DeleteUrlCacheGroup(groupId, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, IntPtr.Zero);
if (!returnValue && ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error())
{
returnValue = FindNextUrlCacheGroup(enumHandle, ref groupId, IntPtr.Zero);
}
if (!returnValue && (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()))
break;
}
DeleteUrlsFromGroup(hostName); // this hangs on Windows 8
}
catch (AccessViolationException)
{
}
}
对 Windows 8 的 Win API 中的更改有任何见解/引用吗?
提前致谢。
最佳答案
也有同样的麻烦,但对于 c++(来自这个 KB http://support.microsoft.com/kb/815718)。我最后只是检查 DeleteUrlCacheGroup() 是否继续尝试删除相同的 groupId 值。
我会跟踪前一个 groupId,如果它与当前的匹配,我就打破循环。
关于c# - Wininet 缓存 API 在 Windows 8 中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11690121/
我正在寻找一个简单的函数,它能够将来自 Internet 的文本或二进制文件读入 string 多变的。 令人难以置信的是,我在网络上找不到任何内容,只有所有 WinInet 的低级描述。在 MQL
我有以下代码: #include #include #include #include #include using namespace std; int main(int argc, ch
我正在使用 wininet 连接到服务器。一切正常,上传,下载,列出命令等......因此,我有一个小错误,我不知道它来自哪里。错误是某些包含超过 100 个文件(例如图像)的服务器文件夹没有全部列出
我正在使用 WinInet 和 InternetOpenUrl 下载一个文件...正在运行。但我想监控进度,所以我尝试添加一个回调函数,但由于某种原因它从未被调用过...... 代码: void CA
我对 C++ 编程还很陌生,所以请多多包涵。我正在尝试创建一个用于教育目的的 ftp 客户端,做了一些研究并决定尝试一下 Wininet,并发现了一些在线教程: 以此为例: #include #in
我有一个将网页下载到文本文件的功能 #include #include #include #include #include #pragma comment(lib, "WinINet.li
我很好奇为什么我在使用此功能时遇到问题。我正在将网络上的 PNG 文件下载到目标路径。例如下载谷歌图片到C:盘: netDownloadData("http://www.google.com/intl
我已经为 Internet Explorer 编写了一个 BHO,它 Hook WinInet 以修改来自 IE 的一些 HTTP 请求,方法是将它们重定向到内部服务器。 当我在 IE 中打开前 3
我正在试验我的 .NET 客户端和服务器之间的缓存。在 WinInet 决定缓存结果之前,我看到一个看似随机的端点命中数。 .NET 客户端使用 HttpWebRequest 发出请求: HttpWe
我发现 WinHTTP 不可重入(1、2)。 WinINET 是可重入的吗? 我们有一个与 WinINET 同步 HTTP 的 ActiveX 控件。如果浏览器(在 javascript 中)触发一个
相关 How to send a HTTP POST Request in Delphi using WinInet api : 我如何提出发布请求并跟踪进度? 这不起作用(检查评论): proced
iam 使用 wininet 下载图像并将其保存到内存流这是我的程序 procedure DownloadToStream(const Url: string; ms: TMemoryStream);
我们使用 WinInet 和 Delphi 通过 HTTPS 进行通信。WinInet 中是否有一个函数可以返回 session 中协商的协议(protocol),即 TLS1.1、TLS 1.2 等
我有一个应用程序,它大量使用 Wininet 函数从互联网获取一些数据。有时我会收到非常奇怪的与句柄相关的错误消息: Internal error in ConnectToHost when tryi
我从第三方网站获得了以下源代码,解释了如何使用 WinInet 从互联网下载文件。我对 API 不太熟悉,我查看了 WinInet 单元,但没有看到任何我需要的 API 调用。 我正在做的是添加报告文
我在 wininet.dll 深处遇到崩溃。尝试读取 HTTP_REQUEST_HANDLE_OBJECT::ReleaseConnection 中的零内存位置时崩溃了 这是实际 DLL 中的错误,而
我正在尝试检测 ftp 服务器何时关闭我在应用程序中打开的连接。我正在使用 WinInet 功能。 我发现了一些使用 InternetSetStatusCallback 函数的示例。我实现了一个回调函
我编写了一个使用 WinInet 库的程序。该程序每天运行约 8-12 小时。首先它连接到互联网,然后它使用 FTP 下载/上传文件。之后它开始一个循环,在不同的时间间隔启动最多两个线程。两个线程都在
我正在尝试连接并确保我们设计的仪器提供的网络服务器上存在各种页面。我正在尝试使用 WinInet 命令通过 C++ Win32 执行此操作。 我很高兴我已经通过 HTTP 正确连接到网络服务器: hI
我正在尝试使用 C++ 中的 WinHTTP 获取文件的内容。该文件是一个 XML 文件,由服务器上的可执行文件生成。 用于初始化、连接甚至读取指定服务器地址上的文件的代码正在运行。 // Conne
我是一名优秀的程序员,十分优秀!