Как получить коды ошибок DeleteUrlCacheEntry ()? (Или дополнительная информация о том, почему не удалось удалить конкретное удаление)?

2

В принципе, когда я вызываю 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.

Спасибо за вашу ожидаемую помощь.

  • 0
    @KenWhite Причина тегов в том, что они применимы и к C ++, и к Delphi (сценарий использования тот же, так как это вызов API wininet.dll с кодами ошибок, обычно находящимися в файле c ++ .h. Таким образом, он применим к людям Использование этих языков и тех, кто использует эти языки, также смогут внести свой вклад в этот пост.
  • 0
    @KenWhite это не случайно, это не проблема «кода» только потому, что некоторые люди хотели увидеть код, это проблема с кодами ошибок, которая особенно касается Delphi и C ++, обратите внимание, что я не включил javascript, .NET или Java! Это были бы случайные теги! API универсален для многих языков, которые могут подключаться к Windows API, таким как delphi и C ++, поэтому я ищу поддержку этих людей (получение расширенных кодов ошибок с использованием API, а не кода, специфичного для VB6). Вот почему люди, которые не имеют непосредственного отношения к пониманию вопроса, не должны редактировать теги или предлагать закрыть / удалить и т. Д.
Показать ещё 4 комментария
Теги:
winapi
vb6
browser-cache

4 ответа

1

Это может быть не актуально, но мне кажется, что здесь вы делаете ненужную строковую копию. Почему бы прямо не использовать указатель строки, который у вас уже есть:

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().

  • 0
    Марк, спасибо за разъяснение здесь. Итак, вы говорите, что DeleteUrlCacheEntry принимает и указатель или строковое представление этого указателя, верно? (так, вы можете передать любой из них, и он принимает)? Кроме того, ваша заметка о func1 и func2 имеет смысл, никогда не задумываясь об этом достаточно подробно, чтобы реализовать эту реализацию, но она должна работать так, как вы упомянули по понятным причинам, поэтому еще раз спасибо за эту заметку, проголосовал.
  • 0
    Что касается DeleteUrlCacheEntry (), вы предоставляете ему строку типа C, то есть указатель на серию байтов, оканчивающихся нулевым символом. В исходном объявлении вы использовали «ByVal lpszUrlName As String». В этом случае VB интерпретировал это как «преобразовать строку VB, переданную во временную строку типа C, вызвать функцию API с указателем на эту временную строку C, а затем скопировать преобразованную строку C обратно в исходную строку». В моем объявлении VB интерпретировал это как «вызов функции API с предоставленным длинным значением», т.е. ваш ранее полученный строковый указатель.
1

Если Err.LastDllError возвращает 0, либо GetLastError() действительно возвращает 0, что маловероятно, или VB не вызывает GetLastError(), что более вероятно. Например, если объявление VB в DeleteUrlCacheEntry() неверно, например, оно не устанавливает для свойства DllImport.SetLastError значение true в .NET PInvoke.

  • 0
    Я обновил основной вопрос (см. Выше) кодом и декларацией, чтобы вы могли просмотреть его, поскольку я использую VB6 - я не уверен, как (или если) .NET PInvoke сыграет в этом роль. У меня есть диагностическая информация об элементах, которые удалены, но не удалены, в связанном примере в моем главном вопросе, описывающем, какие элементы он возвращает 0, а какие - 1, если это будет полезно для вашего обзора, вот ссылка снова: stackoverflow.com/questions/12096546/… Что вы думаете? Спасибо (проголосовал).
  • 0
    @KenWHite Прекратите выводить, я рад сделать это и в VB.NET, чтобы лучше понять проблему, и в C #, если мне нужно, если его предложение будет .NET, я приму его, поэтому мой vb.net и теги c #, так как я открыт для решения vb.net и c #. Следовательно, вы не участвуете в интерпретации вопроса, поэтому прекратите его изменять. благодарю вас.
Показать ещё 4 комментария
1

Лично я бы установил точку прерывания при вызове DeleteUrlCacheEntry() и пропустил ее, наблюдая за тем, что значения в стеке вызовов.

Кроме этого, не так много можно сказать без фрагмента кода.

  • 0
    Здравствуйте, спасибо за ваш вклад, я добавил запрошенный вами код (обновленный основной вопрос выше), и я не уверен, получим ли мы стек вызовов в VB6 - но когда я устанавливаю точку останова на DeleteUrlCacheEntry, ничего не происходит шаг, так как это вызов API, поэтому нажатие F8 просто выполняет строку DeleteUrlCacheEntry и переходит к следующей строке. Как вы думаете?
0

Это немного датировано... но меня интересует предмет, поэтому я решил поделиться своими ограниченными знаниями.

Для меня, когда я вызвал DeleteUrlCacheEntry с неправильным URL-адресом, я получаю сообщение об ошибке, а для параметра Err.LastDllError установлено значение 2!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню