2

基本上,当我调用 DeleteUrlCacheEntry(它是 Wininet.dll API 的一部分)时,我要么返回数字 1(表示删除成功),要么返回数字 0(表示删除无效)。

我的问题是,我怎样才能找出为什么删除不起作用?(即返回 0 时)。我听说 C++ 中有一个 GetLastError() 函数,但是我使用的是 VB6,显然 VB6 中的 GetLastError 等效项是 Err.LastDllError 属性。

在 DeleteUrlCacheEntry 尝试删除失败(返回 0)后,我调用/查询 Err.LastDllError 并且它总是返回 0 - 无论如何。即使 DeleteUrlCacheEntry 返回 0(删除无效),即使它返回 1(删除有效),它也会返回 0。我还尽快对 Err.LastDllError 进行调用/查询(如在 DeleteUrlCacheEntry 调用之后)。

我真的很困惑,因为我什至没有收到运行时错误或任何典型异常(或任何异常)。我没有 On Error Resume Next 来忽略应用程序中任何地方的异常,因此向我报告错误的所有方法都是可用的,但我终其一生都无法弄清楚为什么特定的 DeleteUrlCacheEntry() 尝试会失败并返回 0 (我似乎没有办法找出答案)。

所以,我的问题是,如何从 DeleteUrlCacheEntry() 函数(位于 wininet.dll API 中)获取扩展错误信息?

如果您想了解有关我从 DeleteUrlCacheEntry() 函数中查找扩展错误信息的原因的更多信息,我还有另一个问题详细说明了这一点(以及在删除时有效和无效的缓存项的实际示例)尝试):https ://stackoverflow.com/questions/12096546/deleteurlcacheentry-function-of-wininet-api-not-deleting-some-internet-explo

另外,补充一下,我使用的是 VB6——但原则上它在大多数语言中应该是相同的,因为它是一个 API 调用。这是我在 VB6 中的声明:

公开声明函数 DeleteUrlCacheEntry Lib "WININET" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) 只要

另外,我这样称呼它:

将 lReturnValue 变暗

将 cacheFileString 调暗为字符串

' GetStrFromPtrA 将 Pointer (Long) 转换为 String。cacheFileString 是 lpszSourceUrlName 的实际文本/字符串,从 Pointer (Long) 变为 String(人类可读的缓存文件名/字符串)。此外,cacheFileString 是从循环中的 FindFirst/NextEntry 函数中检索的,因此不能错误地格式化或任何其他内容,因为它在删除大多数其他项目时也有效。

cacheFileString = GetStrFromPtrA(icei.lpszSourceUrlName)

lReturnValue = DeleteUrlCacheEntry(cacheFileString)

如果删除不起作用,lReturnValue 最终为 0,当删除起作用时,lReturnValue 最终为 1,仅此而已。此外,Err.LastDllError始终返回 0。

感谢您期待的帮助。

4

4 回答 4

1

This might not be directly relevant, but it seems to me that you are doing an unecessary string copy here. Why not directly use the string pointer you already have:

Public Declare Function DeleteUrlCacheEntry Lib "WININET" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As Long) As Long

Dim lReturnValue As Long

lReturnValue = DeleteUrlCacheEntry(icei.lpszSourceUrlName)

(This is assuming that icei.lpszSourceUrlName is a pointer to an ANSI string.)

Also, you do realise that Err.LastDllError is overwritten everytime a command called via a VB declare or type library declare with usesgetlasterror = true? So, for instance, if I declared APIFunc1() and APIFunc2(), and then called them like this;

nRet = APIFunc1(APIFunc2)

... then LastDllError would reflect only APIFunc1().

于 2012-08-28T08:25:01.410 回答
1

If Err.LastDllError is returning 0 than either GetLastError() really is returning 0, which is unlikely, or VB is not calling GetLastError(), which is more likely. Such as if the VB declaration of DeleteUrlCacheEntry() is wrong, like it is not setting the DllImport.SetLastError property to true under .NET PInvoke.

于 2012-08-24T01:25:28.637 回答
1

就我个人而言,我会在调用 DeleteUrlCacheEntry() 时设置一个断点,然后逐步观察调用堆栈中的值是什么。

除此之外,没有代码片段就没什么好说的了。

于 2012-08-24T01:11:41.543 回答
-1

这有点过时了......但我对这个主题很感兴趣,所以我想我会分享我有限的知识。

对我来说,当我使用错误的 URL 调用DeleteUrlCacheEntry时,我收到一个错误并且Err.LastDllError设置为 2 !

于 2015-03-13T19:42:50.923 回答