XBAP을 호스팅하고 있는 인터넷 익스플로러 인터페이스 구하기
이에 대한 방법을 웹 검색해 보면 다음과 같은 훌륭한 자료를 구할 수 있습니다.
"Scripting out" of an XBAP
; http://blogs.msdn.com/changov/archive/2009/03/01/scripting-out-of-an-xbap.aspx
그런데, 왠지 한 가지 마음에 안드는 부분이 있습니다. 바로 SHDocVw 개체를 참조 추가해야 한다는 것인데요. 차라리 이 정도 기능이라면 단순하게 PInvoke.net 사이트에서 관련 인터페이스를 추가하는 것만으로도 쉽게 해결될 수 있기 때문입니다.
이를 위해서 OLECMDID, OLECMDF, tagREADYSTATE, OLECMDEXECOPT enum 값들과 IWebBrowser2에 대한 인터페이스 정의를 pinvoke.net 웹 사이트에서 복사해 왔습니다. 그다음 HTML 웹 페이지에 올라가는 Page 개체에서 웹 브라우저 인터페이스 포인터를 구해오는 것은 위의 글을 쓴 "Chango V"가 공개한 소스코드 "
ScriptInteropDemo.zip" 파일의 것을 거의 수정 없이 다음과 같이 쓸 수 있습니다.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interop;
using System.Runtime.InteropServices;
namespace WpfBrowserApplication1
{
/// <summary>
/// Interaction logic for Page1.xaml
/// </summary>
public partial class Page1 : Page
{
static readonly Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
public Page1()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
IntPtr clientSitePtr = Marshal.GetIUnknownForObject(BrowserInteropHelper.ClientSite);
Guid spGuid = typeof(IServiceProvider).GUID;
IntPtr spPtr;
Marshal.QueryInterface(clientSitePtr, ref spGuid, out spPtr);
IServiceProvider sp = (IServiceProvider)Marshal.GetObjectForIUnknown(spPtr);
Marshal.Release(spPtr);
Guid serviceGuid = SID_SWebBrowserApp;
Guid iid = typeof(IWebBrowser2).GUID;
IntPtr ppvObject = sp.QueryService(ref serviceGuid, ref iid);
try
{
IWebBrowser2 webBrowser = (IWebBrowser2)Marshal.GetObjectForIUnknown(ppvObject);
object url = "https://www.sysnet.pe.kr";
object missing = Missing.Value;
webBrowser.Navigate2(ref url, ref missing, ref missing, ref missing, ref missing);
}
finally
{
Marshal.Release(ppvObject);
}
}
}
}
첨부한 프로젝트는 위의 소스 코드를 담고 있습니다.
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]