2014-02-07 2 views
1

.NET 응용 프로그램에서 WebBrowser 컨트롤을 호스팅하고 사용자 지정 다운로드 관리자를 연결했습니다. 다음 두 개의 HTTP 헤더가있는 요청을 제외하고는 모두 잘 작동하는 것 같습니다.사용자 지정 IDownloadManager가있는 WebBrowser 컨트롤에서 AccessViolationException이 발생했습니다.

Content-Type: application/octet-stream 
Content-Disposition: attachment; filename=blahblahblah 

내용 유형 헤더를 변경하거나 생략해도 문제가 없습니다. 그것은 단지 문제가있는 응용 프로그램/옥텟 스트림입니다. 콘텐츠 처리 헤더를 제거하면 다운로드 관리자가 사용되지 않습니다.

흥미롭게도이 문제는 32 비트 컴퓨터에서만 발생합니다 (필자는 XP와 Win 7 32 비트를 테스트했으며 Win 7/8 64 비트는 충돌하지 않습니다).

application/octet-stream의 특별한 점은 무엇입니까?

도움이 될 경우 여기에 사용자 정의 다운로드 관리자를 등록하는 많은 코드가 있습니다. WebBrowser에서 파생 내 수업에서 Windows Forms Webbrowswer control with IDownloadManager

:

protected override WebBrowserSiteBase CreateWebBrowserSiteBase() 
{ 
    var site = new DownloadWebBrowserSite(this); 
    return site; 
} 

DownloadWebBrowserSite에서 :

DownloadManager _manager = new DownloadManager(); 

    public int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject) 
    { 
     if (guidService.CompareTo(ComInteropConstants.IID_IDownloadManager) == 0 && riid.CompareTo(ComInteropConstants.IID_IDownloadManager) == 0) 
     { 
      IntPtr punk = Marshal.GetIUnknownForObject(_manager); 
      return Marshal.QueryInterface(punk, ref riid, out ppvObject); 
     } 
     ppvObject = IntPtr.Zero; 
     return ComInteropConstants.E_NOINTERFACE; 
    } 

DownloadManager 내 사용자 지정 다운로드 관리자입니다 그것은이 질문과 대답에 의해 영감을했다. Download의 구현은 다음과 같습니다.

public int Download(IMoniker pmk, IBindCtx pbc, uint dwBindVerb, int grfBINDF, IntPtr pBindInfo, string pszHeaders, string pszRedir, uint uiCP) 
{ 
    return ComInteropConstants.S_OK; 
} 

아래에 선언 된 IDownloadManager을 구현합니다.

[ComVisible(false), ComImport] 
[Guid("988934A4-064B-11D3-BB80-00104B35E7F9")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IDownloadManager 
{ 
    [return: MarshalAs(UnmanagedType.I4)] 
    [PreserveSig] 
    int Download(
     [In, MarshalAs(UnmanagedType.Interface)] IMoniker pmk, 
     [In, MarshalAs(UnmanagedType.Interface)] IBindCtx pbc, 
     [In, MarshalAs(UnmanagedType.U4)] uint dwBindVerb, 
     [In] int grfBINDF, 
     [In] IntPtr pBindInfo, 
     [In, MarshalAs(UnmanagedType.LPWStr)] string pszHeaders, 
     [In, MarshalAs(UnmanagedType.LPWStr)] string pszRedir, 
     [In, MarshalAs(UnmanagedType.U4)] uint uiCP); 
} 

크래시를 재생성하기 위해 실제로이 방법을 사용하지 않아도됩니다.

[DllImport("urlmon.dll"), PreserveSig] 
[return: MarshalAs(UnmanagedType.Error)] 
static extern int CoInternetSetFeatureEnabled(int FeatureEntry, [In, MarshalAs(UnmanagedType.U4)]uint dwFlags, bool fEnable); 

CoInternetSetFeatureEnabled(ComInteropConstants.FEATURE_MIME_HANDLING, (uint)ComInteropConstants.SET_FEATURE_ON_PROCESS, true); 
CoInternetSetFeatureEnabled(ComInteropConstants.FEATURE_MIME_SNIFFING, (uint)ComInteropConstants.SET_FEATURE_ON_PROCESS, true); 

그래서하지 않고 다음과 같습니다

+0

AV가 구체적으로 발생하는 곳을 WinDBG로 보았습니까? http://blogs.msdn.com/b/ieinternals/archive/2014/01/15/debugging-internet-explorer-with-windbg.aspx – EricLaw

+0

"애플리케이션/옥텟 스트림의 특별한 점은 무엇입니까?"- 모호한 유형 (스니핑을 유발 함)이며 해당 유형에 대해 하나 이상의 MIME 필터가 등록되어있을 가능성이 큽니다. HKCR \ Protocols \ 하위 키를 참조하십시오. – EricLaw

+0

@JeffMeadows, 당신은'IDownloadManager'의 관리 선언문을 보여 주면 도움이 될 것입니다. 참고로, 당신의 코드와 원래의 대답은 모두'Marshal.QueryInterface' 후에'punk'를 풀지 않습니다. 'Marshall.Release'로 출시하십시오. – Noseratio

답변

1

여기 내 응용 프로그램이 충돌하는 이유를 나는 아직도 완전히 이해하지 않으며 내가 완전히 다음 코드를 수정 이유를 이해 않지만,이 충돌을 방지 결국 무엇 이러한 기능을 켜면 (MIME 처리 및 MIME 스니핑) 나쁜 HTTP 응답 (텍스트 형식의 콘텐츠 유형 응용 프로그램/옥텟 스트림)으로 인해 문제가 발생합니다.

+0

이건 꽤 무례한 건 알지만 IDownloadManager의 전체 구현을 기꺼이 공유 할 의향이 있다고 생각하지 않습니까? 사용자 지정 다운로드 관리자를 만들려고합니다. – TEK

+0

죄송합니다. 그러나 나는 완전한 구현을 많이하지 못했습니다. 방금 사용자가 WebBrowser 컨트롤을 통해 파일을 다운로드 할 수있게하려고했습니다. 내가 한 일은 실제로 사용자의 기본 웹 브라우저를 열어 다운로드를 처리하는 것입니다. –

관련 문제