2012-07-27 15 views
5

में लटकता है मैं निम्नानुसार कैश प्रविष्टियों को साफ़ करने के लिए पी # के साथ पी/Invoke का उपयोग कर रहा हूं। कोड 32 और 64 बिट पर विंडोज 7 तक ठीक काम करता प्रतीत होता है। विंडोज 8 रिलीज उम्मीदवार पर, यह DeleteUrlsFromGroup कॉल पर लटकता है।विनीनेट कैश एपीआई विंडोज 8

[DllImport(@"wininet", 
    SetLastError = true, 
    CharSet = CharSet.Auto, 
    EntryPoint = "FindFirstUrlCacheGroup", 
    CallingConvention = CallingConvention.StdCall)] 
private static extern IntPtr FindFirstUrlCacheGroup(
    int dwFlags, 
    int dwFilter, 
    IntPtr lpSearchCondition, 
    int dwSearchCondition, 
    ref long lpGroupId, 
    IntPtr lpReserved); 
// For PInvoke: Retrieves the next cache group in a cache group enumeration 
[DllImport(@"wininet", 
    SetLastError = true, 
    CharSet = CharSet.Auto, 
    EntryPoint = "FindNextUrlCacheGroup", 
    CallingConvention = CallingConvention.StdCall)] 
private static extern bool FindNextUrlCacheGroup(
    IntPtr hFind, 
    ref long lpGroupId, 
    IntPtr lpReserved); 
// For PInvoke: Releases the specified GROUPID and any associated state in the cache index file 
[DllImport(@"wininet", 
    SetLastError = true, 
    CharSet = CharSet.Auto, 
    EntryPoint = "DeleteUrlCacheGroup", 
    CallingConvention = CallingConvention.StdCall)] 
private static extern bool DeleteUrlCacheGroup(
    long GroupId, 
    int dwFlags, 
    IntPtr lpReserved); 
// For PInvoke: Begins the enumeration of the Internet cache 
[DllImport(@"wininet", 
    SetLastError = true, 
    CharSet = CharSet.Auto, 
    EntryPoint = "FindFirstUrlCacheEntryA", 
    CallingConvention = CallingConvention.StdCall)] 
private static extern IntPtr FindFirstUrlCacheEntry(
    [MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern, 
    IntPtr lpFirstCacheEntryInfo, 
    ref int lpdwFirstCacheEntryInfoBufferSize); 
// For PInvoke: Retrieves the next entry in the Internet cache 
[DllImport(@"wininet", 
    SetLastError = true, 
    CharSet = CharSet.Auto, 
    EntryPoint = "FindNextUrlCacheEntryA", 
    CallingConvention = CallingConvention.StdCall)] 
private static extern bool FindNextUrlCacheEntry(
    IntPtr hFind, 
    IntPtr lpNextCacheEntryInfo, 
    ref int lpdwNextCacheEntryInfoBufferSize); 
// For PInvoke: Removes the file that is associated with the source name from the cache, if the file exists 
[DllImport(@"wininet", 
    SetLastError = true, 
    CharSet = CharSet.Auto, 
    EntryPoint = "DeleteUrlCacheEntryA", 
    CallingConvention = CallingConvention.StdCall)] 
static extern bool DeleteUrlCacheEntry(string lpszUrlName); 

/// <summary> 
/// Clears the cache of the web browser 
/// </summary> 
[HandleProcessCorruptedStateExceptions] 
public static void ClearCache(Uri hostName) 
{ 
    if (hostName == null) 
    { 
     return; 
    } 

    long groupId = 0; 
    try 
    { 
     // Delete the groups first. 
     IntPtr enumHandle = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL, IntPtr.Zero, 0, ref groupId, IntPtr.Zero); 
     if (enumHandle != IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error()) 
     { 
      return; 
     } 

     // Loop through Cache Group, and then delete entries. 
     while (true) 
     { 
      if (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()) 
      { 
       break; 
      } 

      // Delete a particular Cache Group. 
      // Hangs on WIndows 8 
      bool returnValue = DeleteUrlCacheGroup(groupId, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, IntPtr.Zero); 
      if (!returnValue && ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()) 
      { 
       returnValue = FindNextUrlCacheGroup(enumHandle, ref groupId, IntPtr.Zero); 
      } 
      if (!returnValue && (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error())) 
       break; 
     } 
     DeleteUrlsFromGroup(hostName); // this hangs on Windows 8 
    } 
    catch (AccessViolationException) 
    { 

    } 
} 

विंडोज 8 के लिए विन एपीआई में बदलावों के लिए कोई अंतर्दृष्टि/संदर्भ?

अग्रिम धन्यवाद।

+0

आप किसी भी समाधान मिला? –

+0

अभी तक नहीं। विंडोज 8 के लिए अपमानजनक कोड को छोड़ने के लिए एक संस्करण जांच करना पड़ा। – jimbojones

उत्तर

1

उस केबी आलेख में सभी लिंक के लिए इसमें कई त्रुटियां हैं (जहां अन्य उत्तर का स्रोत कोड आया था), और मैंने इसे सभी आवश्यक सेटिंग्स में काम करने के लिए ~ 2 दिन बर्बाद कर दिया है। यह इंटरनेट पर चिपकाया गया प्रतिलिपि है, और ओएस और आईई संस्करण के आधार पर कई बग रिपोर्ट की गई हैं।

फिडलर मूल रूप से एक Microsoft कर्मचारी द्वारा लिखा गया था, और इसे FiddlerCore.dll द्वारा संचालित किया जाता है। फिडलर के टेलीरिक (मौजूदा मालिक/रखरखाव/विक्रेता) अभी भी फिडलरकोर को अपडेट, रखरखाव और दे देंगे।यदि आप फिडलरकोर में कोई संदर्भ नहीं जोड़ना चाहते हैं, तो आप डीएलएल को अलग कर सकते हैं, और यह इन सभी दस्तावेजों वाले विनिनेट कार्यों को कॉल करने का सही तरीका दिखाता है, लेकिन मुझे लगता है कि इसे यहां पोस्ट करना टेलीरिक/प्लेग्रिज्म के लिए असहमति होगी।

वर्तमान में, Fiddlercore यहाँ की मेजबानी की है: http://www.telerik.com/fiddler/fiddlercore

1

मुझे DeleteUrlsFromGroup, केवल DeleteUrlCacheEntry के लिए एक पिनवोक घोषणा नहीं दिखाई दे रही है। मुझे लगता है कि वह विधि है जो लटक रही है?

EntryPoint = "DeleteUrlCacheEntryA" 

लेकिन यह भी निर्दिष्ट करते हैं::

CharSet = CharSet.Auto 

जो मुझे करने के लिए संकेत मिलता है आप कर रहे हैं

अगर ऐसा है, यह अजीब आप स्पष्ट रूप से समारोह की एएनएसआई संस्करण बुला रहे हैं लगता है एक एएनएसआई स्ट्रिंग को एक फ़ंक्शन में पास करना जो एएनएसआई स्ट्रिंग की अपेक्षा करता है। एमएसडीएन से:

लक्ष्य ऑपरेटिंग सिस्टम के लिए स्वचालित रूप से मार्शल स्ट्रिंग्स उचित रूप से। विंडोज एनटी, विंडोज 2000, विंडोज एक्सपी, और विंडोज सर्वर 2003 परिवार पर यूनिकोड डिफ़ॉल्ट है; डिफ़ॉल्ट विंडोज़ 98 और विंडोज़ पर Ansi है।

या तो * एक या PInvoke परत आप के लिए मैप कर देंगे कि, या कार्यों के बाद से आप CharSet.Auto के साथ यूनिकोड तार गुजर रहे हैं की * डब्ल्यू संस्करणों फोन के रूप में * डब्ल्यू विस्तार के साथ एक समारोह निर्दिष्ट नहीं करते । यदि आप किसी फ़ंक्शन के एएनएसआई/यूनिकोड संस्करण को स्पष्ट रूप से कॉल करने जा रहे हैं, तो मैं मिलान चार्टसेट के साथ भी स्पष्ट होगा।

+0

उसके पास 'DeleteUrlCacheGroup' है। प्रश्न में 'DeleteUrlsFromGroup' एक टाइपो प्रतीत होता है, क्योंकि ऐसा कोई एपीआई नहीं है। –

+0

मुझे लगता है कि यह DeleteUrlCacheEntry था क्योंकि उस विधि को कम से कम उस मौजूदा विधि के हस्ताक्षर से मेल खाता है जो वह कॉल कर रहा है, एक स्ट्रिंग पैरामीटर। – joncham

+0

अद्यतन के लिए धन्यवाद। मैं इसका परीक्षण हमारे परीक्षण विंडोज 8 बॉक्स पर करूँगा और अगर यह काम करता है तो स्वीकार किए जाते हैं। कारण 'CharSet.Auto' और आयात का '* ए' संस्करण है क्योंकि यह सीधे http://support.microsoft.com/kb/326201 से लिया गया था। मुझे माइक्रोसॉफ्ट के कोड की अधिक सावधानीपूर्वक समीक्षा करने की आवश्यकता है। – jimbojones

2

भी एक ही समस्या थी लेकिन सी ++ के लिए (इस केबी http://support.microsoft.com/kb/815718 से)। मैंने यह जांच कर समाप्त कर दिया कि DeleteUrlCacheGroup() एक ही समूह आईडी मान को हटाने का प्रयास कर रहा है या नहीं।

मैं पिछले समूह आईडी का ट्रैक रखता हूं, अगर यह वर्तमान से मेल खाता है, तो मैं बस लूप तोड़ता हूं।

2

@jimbojones: मुझे यकीन नहीं है कि आप अभी भी एक उत्तर की तलाश में हैं, लेकिन मैं अभी भी एक ही समस्या में आया हूं और एक कामकाज मिला है। समस्या अपने अपने जबकि पाश में

while (true) 
     { 
      if (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()) 
      { 
       break; 
      } 

      // Delete a particular Cache Group. 
      // Hangs on WIndows 8 
      bool returnValue = DeleteUrlCacheGroup(groupId, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, IntPtr.Zero); 
      if (!returnValue && ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()) 
      { 
       returnValue = FindNextUrlCacheGroup(enumHandle, ref groupId, IntPtr.Zero); 
      } 
      if (!returnValue && (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error())) 
       break; 
     } 

अपने कोड groupdid साथ बुलाया जा रहा है, तो "DeleteUrlCacheGroup", के साथ नहीं है '0' यह अनंत जो वास्तव में अपने खड़ी कर रहा है होना करने के लिए अपने पाश के कारण झूठे और इसलिए वापस कभी नहीं होगा लटका करने के लिए ऐप। मुझे विंडोज 8 पर यह समस्या नहीं मिली लेकिन विंडोज 7 पर ही। परिदृश्य अलग हो सकता है लेकिन मुझे लगता है कि आप एक ही समस्या का सामना कर रहे हैं।