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呼び出しの直後のように)。

ランタイムエラーや一般的な例外(またはそのことに関する例外)さえも発生しないため、私は本当に混乱しています。アプリケーションのどこにも例外を無視するOnErrorResume 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での私の宣言です:

パブリック宣言関数DeleteUrlCacheEntryLib"WININET"エイリアス"DeleteUrlCacheEntryA"(ByVal lpszUrlName As String)As Long

また、私はそれを次のように呼んでいます:

Dim lReturnValue As Long

Dim cacheFileString As String

'GetStrFromPtrAは、ポインタ(Long)を文字列に変換します。cacheFileStringは、ポインタ(ロング)から文字列(人間が読める形式のキャッシュファイル名/文字列)に変換されたlpszSourceUrlNameの実際のテキスト/文字列です。また、cacheFileStringはループ内のFindFirst / NextEntry関数から取得されるため、他のほとんどのアイテムを削除するときにも機能するため、誤った形式などにすることはできません。

cacheFileString = GetStrFromPtrA(icei.lpszSourceUrlName)

lReturnValue = DeleteUrlCacheEntry(cacheFileString)

lReturnValueは、削除が機能しなかった場合は0になり、削除が機能した場合は1になります。これがそれです。また、Err.LastDllError常に0を返します。

皆様のご支援をよろしくお願いいたします。

4

4 に答える 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文字列へのポインタであることを前提としています。)

また、VB宣言またはタイプライブラリ宣言を介して呼び出されたコマンドがusesgetlasterror = trueで宣言されるたびに、Err.LastDllErrorが上書きされることに気づきましたか?したがって、たとえば、APIFunc1()とAPIFunc2()を宣言し、次のように呼び出した場合、

nRet = APIFunc1(APIFunc2)

...その場合、LastDllErrorはAPIFunc1()のみを反映します。

于 2012-08-28T08:25:01.410 に答える
1

が 0 を返す場合Err.LastDllErrorは、GetLastError()実際に 0 を返す (可能性は低い) か、VB が を呼び出していない (GetLastError()可能性が高い) よりも多くなります。.NET PInvoke でプロパティを true に設定していないなど、VB の宣言DeleteUrlCacheEntry()が間違っている場合などです。DllImport.SetLastError

于 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 に答える