打算要看一下URL moniker的內容,先從基本的入手,下面是一個簡單的使用URLmoniker的程序
BOOL ShowHtml()
{
HINSTANCE hinstMSHTML = LoadLibrary(TEXT("MSHTML.DLL"));
if (hinstMSHTML == NULL)
{
// Error loading module -- fail as securely as possible
return FALSE;
}
SHOWHTMLDIALOGFN* pfnShowHTMLDialog;
pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML,
"ShowHTMLDialog");
if (pfnShowHTMLDialog)
{
IMoniker *pURLMoniker;
BSTR bstrURL = SysAllocString(L"http://www./dialogsource.htm");
CreateURLMoniker(NULL, bstrURL, &pURLMoniker);
if (pURLMoniker)
{
(*pfnShowHTMLDialog)(NULL, pURLMoniker, NULL, NULL, NULL);
pURLMoniker->Release();
}
SysFreeString(bstrURL);
}
FreeLibrary(hinstMSHTML);
return TRUE;
}
其中ShowHTMLDialog的函數(shù)原型如下:
HRESULT ShowHTMLDialog(
HWND hwndParent,
IMoniker *pMk,
VARIANT *pvarArgIn,
LPWSTR pchOptions,
VARIANT *pvarArgOut
);
第一個參數(shù)hwndParent是對話框的父窗體句柄,第二個參數(shù)pMk是要加載的html頁面對應的Imoniker接口;第三個參數(shù)是傳遞的參數(shù),可以通過window對象的dialogArguments 屬性來獲?。坏谒膫€參數(shù)的關于窗體的可選項,具體可以參考IHTMLWindow2::showModalDialog 方法,這個方法中對可選項有詳細的說明;最后一個參數(shù)用于返回對話框的返回參數(shù)。msdn中有兩個相關的代碼如下:
第一個html文件source.html
<HTML>
<HEAD>
<SCRIPT>
function fnLaunch()
{
var aForm;
aForm = oForm.elements;
var myObject = new Object();
myObject.firstName = aForm.oFirstName.value;
myObject.lastName = aForm.oLastName.value;
// The object "myObject" is sent to the modal window.
window.showModalDialog("modalDialogSource.htm", myObject, "dialogHeight:300px; dialogLeft:200px;");
}
</SCRIPT>
</HEAD>
<BODY>
<BUTTON onclick="fnLaunch();" >Launch The Dialog</BUTTON>
<FORM ID= "oForm">
First Name:
<INPUT TYPE="text" NAME="oFirstName" VALUE="Jane">
<BR>
Last Name:
<INPUT TYPE="text" NAME="oLastName" VALUE="Smith">
</FORM>
</BODY>
</HTML>
第二個html文件target.html
<HTML>
<HEAD>
<SCRIPT>
var oMyObject = window.dialogArguments;
var sFirstName = oMyObject.firstName;
var sLastName = oMyObject.lastName;
</SCRIPT>
<title>Untitled</title>
</head>
<BODY STYLE="font-family: arial; font-size: 14pt; color: Snow;
background-color: RosyBrown;">
First Name:
<SPAN STYLE="color:00ff7f">
<SCRIPT>
document.write(sFirstName);
</SCRIPT>
</SPAN>
<BR>
Last Name:
<SPAN STYLE="color:00ff7f">
<SCRIPT>
document.write(sLastName);
</SCRIPT>
</SPAN>
</BODY>
</HTML>
上面兩個文件主要通過js來調用window的showModalDialog函數(shù)來達到彈出對話框,并傳遞參數(shù)的作用。
在上例中,給target傳遞的是一個object,我暫時不知道object對應到c++中得什么類型,所以為了簡單起見,傳遞一個字符串作為輸入參數(shù),
對應的html中得js調整如下:
alert(window.dialogArguments.length);
alert(window.dialogArguments.toString());
window.returnValue = "hello world";
我們將上面的C++代碼進行修改,來達到相同的目的,通過C++代碼彈出對話框,加載target.html,同時傳遞參數(shù)。
IMoniker *pURLMoniker;
BSTR bstrURL = SysAllocString(L"http://localhost/mylocalhost/windowTst/showwindowtst.html");
CreateURLMoniker(NULL, bstrURL, &pURLMoniker);
if (pURLMoniker)
{
CComVariant varin(L"abc");
CComVariant varOut;
(*pfnShowHTMLDialog)(m_hWnd, pURLMoniker, &varin, L"dialogHeight:300px; dialogLeft:200px;", &varOut);
pURLMoniker->Release();
}
可以運行,并且varout可以獲取到關閉后返回的字符串hello world。
CreateUrlMoniker原型如下:
HRESULT CreateURLMoniker(
IMoniker *pMkCtx,
LPCWSTR szURL,
IMoniker **ppmk
);
第二個參數(shù)是要加載的url,第三個參數(shù)就是返回url對應的moniker, 如果第二參數(shù)是一個相對的url,那么第一個參數(shù)就是一個baseurl,pMkCtx和szurl合起來組成一個完成的URL。