VC中怎么执行下面这个JavaScript语句,或是实现同样的效果? 如果有办法必将重谢谢!!
window.open('http://ad4.sina.com.cn/wn/cisco-bt-home-0226a.swf', '_new', 'top=240,left=300,width=520,height=310,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no');
window.open('http://ad4.sina.com.cn/wn/cisco-bt-home-0226a.swf', '_new', 'top=240,left=300,width=520,height=310,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no');
#include <tchar.h>
#pragma comment(lib,"urlmon")
#include <basetyps.h>
typedef HRESULT STDAPICALLTYPE SHOWHTMLDIALOGFN(HWND hwndParent,
IMoniker *pMk,
VARIANT *pvarArgIn,
WCHAR *pchOptions,
VARIANT *pvarArgOut
); void CTesthtmldlgDlg::OnOK()
{
// TODO: Add extra validation here
HMODULE hMSHTML = LoadLibrary(TEXT("MSHTML.DLL"));
BOOL fSuccess;
WCHAR szUrl[]=L"http://www.csdn.net";
IMoniker* pMoniker=NULL;
WCHAR szOptions[]=L"dialogHeight: 179px; dialogWidth: 265px; dialogTop: 99px; dialogLeft: 390px; edge: Raised; center: Yes; help: Yes; resizable: Yes; status: Yes;";
VARIANT varReturn;
VariantInit(&varReturn);
SHOWHTMLDIALOGFN* pfnShow;
if(!hMSHTML)
{
fSuccess = FALSE;
goto cleanup;
}
pfnShow = (SHOWHTMLDIALOGFN*)GetProcAddress(hMSHTML, TEXT("ShowHTMLDialog"));
if(!pfnShow)
{
fSuccess = FALSE;
goto cleanup;
}
if(FAILED(CreateURLMoniker(NULL, szUrl, &pMoniker)))
{
fSuccess = FALSE;
goto cleanup;
}
(pfnShow)(NULL, pMoniker, NULL, szOptions, &varReturn);
//(pfnShow)(NULL, pMoniker, NULL, NULL, &varReturn);
//::MessageBox(NULL,"show html dialog","",MB_OK);
cleanup:
if(pMoniker)
pMoniker->Release();
if(hMSHTML)
FreeLibrary(hMSHTML);}
class CWebPage
{
public:
CWebPage();
virtual ~CWebPage(); bool SetDocument(IDispatch* pDisp);
LPDISPATCH GetHtmlDocument() const;
const CString GetLastError() const;
bool GetJScript(CComPtr<IDispatch>& spDisp);
bool GetJScripts(CComPtr<IHTMLElementCollection>& spColl);
CString ScanJScript(CString& strAText,CStringArray& args); bool CallJScript(const CString strFunc);
bool CallJScript(const CString strFunc,const CString strArg1);
bool CallJScript(const CString strFunc,const CString strArg1,
const CString strArg2);
bool CallJScript(const CString strFunc,const CString strArg1,
const CString strArg2,const CString strArg3);
bool CallJScript(const CString strFunc,const
CStringArray& paramArray);protected CComPtr<IHTMLDocument2> m_spDoc;};Calling Technique
The previously mentioned technique splits the following steps:Getting a pointer to the IHTMLDocument2 interface.
Getting IDispatch for a JavaScript object in an HTML document.
Getting DISPID for a given name of a JavaScript function.
Putting parameters to the DISPPARAM structure.
Calling a JavaScript function by using the Invoke method of the IDispatch interface.
Here is an example of getting a IDispatch pointer to the Java Scripts objects:bool CWebPage::GetJScript(CComPtr<IDispatch>& spDisp)
{
HRESULT hr = m_spDoc->get_Script(&spDisp);
ATLASSERT(SUCCEEDED(hr));
return SUCCEEDED(hr);
}And here is the final function to call JavaScript:CComVariant CWebPage::CallJScript(const CString strFunc,
const CStringArray&
paramArray)
{
//Getting IDispatch for Java Script objects
CComPtr<IDispatch> spScript;
if(!GetJScript(spScript))
{
ShowError("Cannot GetScript");
return false;
}
//Find dispid for given function in the object
CComBSTR bstrMember(strFunc);
DISPID dispid = NULL;
HRESULT hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,
LOCALE_SYSTEM_DEFAULT,&dispid);
if(FAILED(hr))
{
ShowError(GetSystemErrorMessage(hr));
return false;
} const int arraySize = paramArray.GetSize();
//Putting parameters
DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = arraySize;
dispparams.rgvarg = new VARIANT[dispparams.cArgs];
dispparams.cNamedArgs = 0;
for( int i = 0; i < arraySize; i++)
{
CComBSTR> bstr = paramArray.GetAt(arraySize - 1 - i);
// back reading
bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
dispparams.rgvarg[i].vt = VT_BSTR;
}
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
CComVariant vaResult;
UINT nArgErr = (UINT)-1; // initialize to invalid arg
//Call JavaScript function
hr = spScript->Invoke(dispid,IID_NULL,0,
DISPATCH_METHOD,&dispparams,
&vaResult,&excepInfo,&nArgErr);
delete [] dispparams.rgvarg;
if(FAILED(hr))
{
ShowError(GetSystemErrorMessage(hr));
return false;
}
return vaResult;
}
<head>
</head>
<body onload="Init()">
</body><script>
function Init()
{
var obj = new ActiveXObject( "ComCom.EmbededObject" );
obj.CallScript( document, "comeon" );
obj.CallScript( document, "goon" );
}
function comeon()
{
alert( "Call comeon!" );
}
function goon()
{
alert( "Call goon!" );
}
</script>
</html>
STDMETHODIMP CEmbededObject::CallScript( IDispatch* pDocDisp, BSTR* pbstrFunc)
{
HRESULT hr; IHTMLDocument2* pDocument;
IDispatch* pScript; hr = pDocDisp->QueryInterface( IID_IHTMLDocument2, (void**)&pDocument );
if ( FAILED( hr ) ) return hr;
hr = pDocument->get_Script( &pScript );
if ( FAILED( hr ) ) return hr; DISPID dispid;
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; // Assign to pdex and bstrName
if (SUCCEEDED( hr = pScript->GetIDsOfNames( IID_NULL, pbstrFunc, fdexNameCaseSensitive, LOCALE_SYSTEM_DEFAULT, &dispid)))
{
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
CComVariant vaResult;
UINT nArgErr = (UINT)-1; // initialize to invalid arg //Call JavaScript function
hr = pScript->Invoke(dispid, IID_NULL, 0,
DISPATCH_METHOD, &dispparamsNoArgs,
&vaResult, &excepInfo, &nArgErr);
} return hr;
}Visual studio.NET/ie6 测试通过