.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);
그래서하지 않고 다음과 같습니다
AV가 구체적으로 발생하는 곳을 WinDBG로 보았습니까? http://blogs.msdn.com/b/ieinternals/archive/2014/01/15/debugging-internet-explorer-with-windbg.aspx – EricLaw
"애플리케이션/옥텟 스트림의 특별한 점은 무엇입니까?"- 모호한 유형 (스니핑을 유발 함)이며 해당 유형에 대해 하나 이상의 MIME 필터가 등록되어있을 가능성이 큽니다. HKCR \ Protocols \ 하위 키를 참조하십시오. – EricLaw
@JeffMeadows, 당신은'IDownloadManager'의 관리 선언문을 보여 주면 도움이 될 것입니다. 참고로, 당신의 코드와 원래의 대답은 모두'Marshal.QueryInterface' 후에'punk'를 풀지 않습니다. 'Marshall.Release'로 출시하십시오. – Noseratio