URL Moniker之CreateUrlMoniker的使用
打算要看一下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.example.com/dialogsource.htm");
CreateURLMoniker(NULL, bstrURL, &pURLMoniker);
if (pURLMoniker)
{
(*pfnShowHTMLDialog)(NULL, pURLMoniker, NULL, NULL, NULL);
pURLMoniker->Release();
}
SysFreeString(bstrURL);
}
FreeLibrary(hinstMSHTML);
return TRUE;
}
其中ShowHTMLDialog的函数原型如下:
HRESULT ShowHTMLDialog(
HWND hwndParent,
IMoniker *pMk,
VARIANT *pvarArgIn,
LPWSTR pchOptions,
VARIANT *pvarArgOut
);
第一个参数hwndParent是对话框的父窗体句柄,第二个参数pMk是要加载的html页面对应的Imoniker接口;第三个参数是传递的参数,可以通过window对象的dialogArguments 属性来获取;第四个参数的关于窗体的可选项,具体可以参考IHTMLWindow2::showModalDialog 方法,这个方法中对可选项有详细的说明;最后一个参数用于返回对话框的返回参数。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函数来达到弹出对话框,并传递参数的作用。
在上例中,给target传递的是一个object,我暂时不知道object对应到c++中得什么类型,所以为了简单起见,传递一个字符串作为输入参数,
对应的html中得js调整如下:
alert(window.dialogArguments.length);
alert(window.dialogArguments.toString());
window.returnValue = "hello world";
我们将上面的C++代码进行修改,来达到相同的目的,通过C++代码弹出对话框,加载target.html,同时传递参数。
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
);
第二个参数是要加载的url,第三个参数就是返回url对应的moniker, 如果第二参数是一个相对的url,那么第一个参数就是一个baseurl,pMkCtx和szurl合起来组成一个完成的URL。