В принципе, когда я вызываю DeleteUrlCacheEntry (который является частью API Wininet.dll), я либо возвращаю номер 1 (что означает, что удаление успешно), либо число 0 (это означает, что удаление не работает).
Мой вопрос в том, как я могу узнать, почему удаление не сработало? (то есть, когда возвращается 0). Я слышал, что в С++ есть функция GetLastError(), однако я использую VB6, и, по-видимому, эквивалент GetLastError в VB6 является свойством Err.LastDllError.
После попытки удаления DeleteUrlCacheEntry сбой (возвращает 0) я вызываю/запрашиваю Err.LastDllError и всегда возвращает 0 - независимо от того, что. Он возвращает 0, даже если DeleteUrlCacheEntry возвращает 0 (удаление не работает), и даже когда оно возвращает 1 (удаление делало работу). Я также делаю вызов/запрос в Err.LastDllError как можно скорее (как в, сразу после вызова DeleteUrlCacheEntry).
Я действительно запутался, потому что даже не получаю ошибку времени выполнения или какое-либо типичное исключение (или любое исключение в этом отношении). У меня нет On Error Resume Next, чтобы игнорировать исключение в любом месте моего приложения, поэтому доступны все сообщения об ошибке, но я не могу на всю жизнь понять, почему конкретная попытка DeleteUrlCacheEntry() завершится с ошибкой и вернет 0 (мне кажется, что не может быть способа узнать).
Итак, мой вопрос: как получить расширенную информацию об ошибке из функции DeleteUrlCacheEntry() (находящейся в API wininet.dll)?
Если вам нужна дополнительная информация о причине, по которой я искал дополнительную информацию об ошибке из функции DeleteUrlCacheEntry(), у меня есть еще один вопрос, который подробно описывает это (вместе с фактическими примерами элементов кэша, которые работают и не работают, когда попытка удаления): qaru.site/questions/1783298/...
Кроме того, просто для добавления, я использую VB6, но в основном это должно быть одинаково на большинстве языков, поскольку это вызов API. Вот мое объявление в VB6:
Публичная декларация Функция DeleteUrlCacheEntry Lib "WININET" Псевдоним "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) Дольше
Кроме того, я называю это следующим образом:
Dim lReturnValue As Long
Dim cacheFileString As String
'GetStrFromPtrA превращает указатель (длинный) в строку. cacheFileString - это фактический текст/строка lpszSourceUrlName, преобразованный из указателя (Long) в String (имя/строка файла для чтения/чтения). Кроме того, cacheFileString удаляется из функций FindFirst/NextEntry в цикле, поэтому не может быть неправильно отформатирован или что-то еще, так как он также работает при удалении большинства других элементов.
cacheFileString = GetStrFromPtrA (icei.lpszSourceUrlName)
lReturnValue = УдалитьUrlCacheEntry (cacheFileString)
lReturnValue заканчивается 0, если удаление не работает, и 1, когда удаление действительно работает, и это все. Кроме того, Err.LastDllError
всегда возвращает 0.
Спасибо за вашу ожидаемую помощь.
Это может быть не актуально, но мне кажется, что здесь вы делаете ненужную строковую копию. Почему бы прямо не использовать указатель строки, который у вас уже есть:
Public Declare Function DeleteUrlCacheEntry Lib "WININET" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As Long) As Long
Dim lReturnValue As Long
lReturnValue = DeleteUrlCacheEntry(icei.lpszSourceUrlName)
(Предполагается, что icei.lpszSourceUrlName является указателем на строку ANSI.)
Кроме того, вы понимаете, что Err.LastDllError перезаписывается каждый раз, когда команда, вызываемая через VB, объявляет или вводит библиотеку declare с помощью usegetlasterror = true? Так, например, если я объявлял APIFunc1() и APIFunc2(), а затем вызывал их следующим образом:
nRet = APIFunc1(APIFunc2)
... тогда LastDllError будет отражать только APIFunc1().
Если Err.LastDllError
возвращает 0, либо GetLastError()
действительно возвращает 0, что маловероятно, или VB не вызывает GetLastError()
, что более вероятно. Например, если объявление VB в DeleteUrlCacheEntry()
неверно, например, оно не устанавливает для свойства DllImport.SetLastError
значение true в .NET PInvoke.
Лично я бы установил точку прерывания при вызове DeleteUrlCacheEntry() и пропустил ее, наблюдая за тем, что значения в стеке вызовов.
Кроме этого, не так много можно сказать без фрагмента кода.
Это немного датировано... но меня интересует предмет, поэтому я решил поделиться своими ограниченными знаниями.
Для меня, когда я вызвал DeleteUrlCacheEntry с неправильным URL-адресом, я получаю сообщение об ошибке, а для параметра Err.LastDllError установлено значение 2!