2010-07-19 57 views
0

我有一個應用程序使用Webbrowser控件導航到一些供應商的網站和刮報告。由於一個供應商有多個帳戶,因此我需要讓瀏覽器結束會話並清除所有設置的Cookie。我正在使用針對wininet.dll的API調用,並且能夠實現期望的結果。但是,間歇性地,我得到INTERNET_OPTION_END_BROWSER_SESSION的InternetSetOption上出現死鎖。InternetSetOption死鎖?

這是非常線性碼和InternetSetOption從一個單獨的線程在一個地方被調用。難以弄清楚的是,在調試中運行時,我很少能夠重現該問題。只要我在VS之外編譯和運行,它會很快發生。我通過在運行時將消息泵送到控制檯來隔離它。

有幾次,我已經能夠捕捉在調試的問題,它只是顯示InternetSetOption作爲下一個語句,並坐鎮,沒有任何異常或錯誤,沒有在輸出窗口。 InternetSetOption應返回布爾值,但該程序不會再繼續,我從來沒有從API調用中獲得任何回報。我試着查看拋出的最後一條錯誤消息,但在這種情況下,它並沒有幫助,因爲它從不拋出錯誤。

任何人有什麼輸入,我可以進一步做什麼來調試?

聲明如下:

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)] 
private static extern bool InternetSetOption(
    IntPtr hInternet, 
    int dwOption, 
    IntPtr lpBuffer, 
    int lpdwBufferLength); 

而且通過所謂:

InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0); 
+0

這與C#有什麼關係? – 2010-07-27 19:25:06

+0

該應用程序是用C#編寫的,包含一個Web瀏覽器控件 – kmfk 2010-07-27 19:35:36

回答

2

對於任何人誰遇到這一點,一次偶然的機會,有同樣的問題 - 這個問題似乎由功能引起的我在MSDN的網站上找到了清除緩存和Cookie的信息。 found here

有幾個問題在ClearCache()函數,一個x86和x64,以及如何引用的緩存文件將其刪除之間 -

在目前的功能,卡列斯DeleteUrlCacheEntry像這樣:

DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName); 

然而,在X64的是應該是

DeleteUrlCacheEntry(internetCacheEntry.lpszLocalFileName); 

你必須基於這些平臺之間切換,一個單一的參考不工作的x64和x86。但是,對我來說,莫名其妙。這個函數經常會拋出Access Violation異常,即使在被捕獲和處理時,我相信這是InternetSetOption的根源,表現爲僵局。同樣,由於死鎖的奇怪特性,我永遠無法徹底解決它,因爲我使用了ClearCache()函數和InternetSetOption。改變兩個函數調用的順序並不能糾正它。

我刪除了WebBrowserHelper類和我通過執行RUNDLL32並等待該進程退出使出回清除緩存和Cookie。

希望能幫助別人!