谁懂IE的调用方法?

CCppCs 2003-10-02 10:01:54
在QQ中,有一个登录MyQQ的菜单项,可以快速登录MyQQ网页。同样的功能,在网易泡泡中也有,比如:快速登录 短信中心。我觉得,要实现这种功能,肯定要调用IE,谁知道该如何调用?或者是使用现成的控件能不能做到?比如说CLinkCtrl之类的东西。
...全文
196 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCppCs 2003-10-08
  • 打赏
  • 举报
回复
各位高手,还有什么要补充的吗?如果没有了,我就要结贴给分了。
CCppCs 2003-10-07
  • 打赏
  • 举报
回复
非常感谢microran2000给出的代码,真的好用!
BYTE PostData[59] = "password=12345a&username=hello9981&url=http://sms.163.com/";
SendHTTPByIE("http://reg.163.com/CheckUser.jsp",
"Content-Type: application/x-www-form-urlencoded", PostData, 59);

有空的话,一定研究一下那些操纵变体类型数据的代码。
microran2000 2003-10-06
  • 打赏
  • 举报
回复
#import "msxml3.dll"
using namespace MSXML2; // For Msxml3.dll.

#include "stdio.h"

void dump_com_error(_com_error &e)
{
printf("Error\n");
printf("\a\tCode = %08lx\n", e.Error());
printf("\a\tCode meaning = %s", e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
}

int main()
{
HRESULT hr = CoInitialize(NULL);

try{
IXMLHTTPRequestPtr pXMLHTTPReq = NULL;
hr=pXMLHTTPReq.CreateInstance(__uuidof(XMLHTTP30));

//Uncomment the following lines if you are using ServerXMLHTTPRequest.
//IServerXMLHTTPRequestPtr pXMLHTTPReq = NULL;
//hr=pXMLHTTPReq.CreateInstance(__uuidof(ServerXMLHTTP30));

hr=pXMLHTTPReq->open("POST", "http://www.server1.com/test1.asp", VARIANT_TRUE);

hr = pXMLHTTPReq->setRequestHeader("charset", "UTF-8");
hr=pXMLHTTPReq->send("<?xml version=\"1.0\" encoding=\"UTF-8\"?><REQUEST>request1</REQUEST>");

long readyState = READYSTATE_UNINITIALIZED;
MSG msg;
while (readyState != READYSTATE_COMPLETE)
{
//Without this message pump, readyState does not change.
if (PeekMessage(&msg, 0, 0 ,0, PM_REMOVE))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

readyState = pXMLHTTPReq->GetreadyState();

}
MessageBox(NULL, "readyState is COMPLETE ", "readystate", MB_OK);

long status= pXMLHTTPReq->Getstatus();
}
catch(_com_error &e)
{
dump_com_error(e);
}
return 0;
}
microran2000 2003-10-06
  • 打赏
  • 举报
回复

DataToSend = "id=1"
dim xmlhttp
set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
xmlhttp.Open "POST","http://localhost/Receiver.asp",false
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.send DataToSend
Response.ContentType = "text/xml"
Response.Write xmlhttp.responsexml.xml
Set xmlhttp = nothing
CCppCs 2003-10-06
  • 打赏
  • 举报
回复
ATL技术内幕,是 ATL Internals 这本书吗?我有一本潘爱民翻译的,名字叫“深入解析ATL”。我看了这本书的第二章,也用了CComVariant类,可是,就是登录不成功:(

还有一本英文电子书,叫 Inside ATL ,我觉得此书翻译成“ATL技术内幕”才更准确。
microran2000 2003-10-06
  • 打赏
  • 举报
回复
//使用IE的自动化服务发送HTTP/post请求,并打开一个新的iE窗口。
int SendHTTPByIE(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength)
{
HRESULT hr;
USES_CONVERSION;


IWebBrowserApp* pWBApp = NULL; // Derived from IWebBrowser
BSTR bstrURL = NULL, bstrHeaders = NULL;
VARIANT vFlags = {0},
vTargetFrameName = {0},
vPostData = {0},
vHeaders = {0};
__try{
if (FAILED(hr = CoInitialize(NULL)))
{
return FALSE;
}
if (FAILED(hr = CoCreateInstance(CLSID_InternetExplorer,
NULL,
CLSCTX_SERVER,
IID_IWebBrowserApp,
(LPVOID*)&pWBApp)))
{
goto Error;
}
bstrURL = SysAllocString(T2OLE(URL));
if (!bstrURL)
{
goto Error;
}
if(headers!=NULL){
bstrHeaders = SysAllocString(T2OLE(headers));
if (!bstrHeaders)
{
goto Error;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
}
if(Post!=NULL){
hr = GetPostData(&vPostData,(LPCTSTR)Post,postLength);
}
hr = pWBApp->Navigate(bstrURL, &vFlags,
&vTargetFrameName, &vPostData, &vHeaders);
pWBApp->put_Visible(VARIANT_TRUE);
Error:;
}

__finally{

if (bstrURL) SysFreeString(bstrURL);
if (bstrHeaders) SysFreeString(bstrHeaders);
if(Post!=NULL)VariantClear(&vPostData);
if (pWBApp){
pWBApp->Release();
pWBApp=NULL;
}
CoUninitialize();
}
return TRUE;
}
HRESULT GetPostData(LPVARIANT pvPostData,LPCTSTR szPostData, DWORD postLength)
{
HRESULT hr;
LPSAFEARRAY psa;

LPSTR pPostData;
if (!pvPostData)
{
return E_POINTER;
}
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, postLength);
if (!psa)
{
return E_OUTOFMEMORY;
}
hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, szPostData, postLength);
hr = SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
return NOERROR;
}

IWebBrowser2* GetIEFromWnd(HWND hIEWindow)
{ HWND hWnd ;
if(hIEWindow==NULL){
hWnd= FindWindow("IEFrame", NULL);
if(hWnd==NULL)
hWnd= FindWindow("CabinetWClass", NULL);
if( hWnd == NULL){
MessageBox (NULL,"No Running instance of Internet Explorer!","message", MB_OK);
}
// walk Shell DocObject View->Internet Explorer_Server
HWND hWndChild = FindWindowEx(hWnd, 0, "Shell DocObject View", NULL);
if(hWndChild !=0){
hWndChild = FindWindowEx(hWndChild, 0, "Internet Explorer_Server", NULL);
}
hWnd=hWndChild;
}
else{
hWnd=hIEWindow;
}
// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
HINSTANCE hInst = LoadLibrary( _T("OLEACC.DLL") );
IWebBrowser2* pWebBrowser2=NULL;
if ( hInst != NULL ){
if ( hWnd != NULL ){

LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL ){
HRESULT hr;
CComPtr<IHTMLDocument2>spDoc;

hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
if ( SUCCEEDED(hr) ){

CComPtr<IHTMLWindow2>spWnd2;
CComPtr<IServiceProvider>spServiceProv;
hr=spDoc->get_parentWindow ((IHTMLWindow2**)&spWnd2);
if(SUCCEEDED(hr)){

hr=spWnd2->QueryInterface (IID_IServiceProvider,(void**)&spServiceProv);
if(SUCCEEDED(hr)){
hr = spServiceProv->QueryService(SID_SWebBrowserApp,
IID_IWebBrowser2,
(void**)&pWebBrowser2);


}
}
}

}
}

::FreeLibrary(hInst);
}
else{//如果没有安装MSAA
MessageBox(NULL,_T("Please Install Microsoft Active Accessibility"),"Error",MB_OK);
}
return pWebBrowser2;
}
microran2000 2003-10-06
  • 打赏
  • 举报
回复
int SendHTTPByIE(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength)
{
HRESULT hr;
USES_CONVERSION;


IWebBrowserApp* pWBApp = NULL; // Derived from IWebBrowser
BSTR bstrURL = NULL, bstrHeaders = NULL;
VARIANT vFlags = {0},
vTargetFrameName = {0},
vPostData = {0},
vHeaders = {0};
__try{
if (FAILED(hr = CoInitialize(NULL)))
{
return FALSE;
}
if (FAILED(hr = CoCreateInstance(CLSID_InternetExplorer,
NULL,
CLSCTX_SERVER,
IID_IWebBrowserApp,
(LPVOID*)&pWBApp)))
{
goto Error;
}
bstrURL = SysAllocString(T2OLE(URL));
if (!bstrURL)
{
goto Error;
}
if(headers!=NULL){
bstrHeaders = SysAllocString(T2OLE(headers));
if (!bstrHeaders)
{
goto Error;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
}
if(Post!=NULL){
hr = GetPostData(&vPostData,(LPCTSTR)Post,postLength);
}
hr = pWBApp->Navigate(bstrURL, &vFlags,
&vTargetFrameName, &vPostData, &vHeaders);
pWBApp->put_Visible(VARIANT_TRUE);
Error:;
}

__finally{

if (bstrURL) SysFreeString(bstrURL);
if (bstrHeaders) SysFreeString(bstrHeaders);
if(Post!=NULL)VariantClear(&vPostData);
if (pWBApp){
pWBApp->Release();
pWBApp=NULL;
}
CoUninitialize();
}
return TRUE;
}
HRESULT GetPostData(LPVARIANT pvPostData,LPCTSTR szPostData, DWORD postLength)
{
HRESULT hr;
LPSAFEARRAY psa;

LPSTR pPostData;
if (!pvPostData)
{
return E_POINTER;
}
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, postLength);
if (!psa)
{
return E_OUTOFMEMORY;
}
hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, szPostData, postLength);
hr = SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
return NOERROR;
}

IWebBrowser2* GetIEFromWnd(HWND hIEWindow)
{ HWND hWnd ;
if(hIEWindow==NULL){
hWnd= FindWindow("IEFrame", NULL);
if(hWnd==NULL)
hWnd= FindWindow("CabinetWClass", NULL);
if( hWnd == NULL){
MessageBox (NULL,"No Running instance of Internet Explorer!","message", MB_OK);
}
// walk Shell DocObject View->Internet Explorer_Server
HWND hWndChild = FindWindowEx(hWnd, 0, "Shell DocObject View", NULL);
if(hWndChild !=0){
hWndChild = FindWindowEx(hWndChild, 0, "Internet Explorer_Server", NULL);
}
hWnd=hWndChild;
}
else{
hWnd=hIEWindow;
}
// ÎÒÃÇÐèÒªÏÔʾµØ×°ÔØOLEACC.DLL,ÕâÑùÎÒÃDzÅÖªµÀÓÐûÓа²×°MSAA
HINSTANCE hInst = LoadLibrary( _T("OLEACC.DLL") );
IWebBrowser2* pWebBrowser2=NULL;
if ( hInst != NULL ){
if ( hWnd != NULL ){

LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL ){
HRESULT hr;
CComPtr<IHTMLDocument2>spDoc;

hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
if ( SUCCEEDED(hr) ){

CComPtr<IHTMLWindow2>spWnd2;
CComPtr<IServiceProvider>spServiceProv;
hr=spDoc->get_parentWindow ((IHTMLWindow2**)&spWnd2);
if(SUCCEEDED(hr)){

hr=spWnd2->QueryInterface (IID_IServiceProvider,(void**)&spServiceProv);
if(SUCCEEDED(hr)){
hr = spServiceProv->QueryService(SID_SWebBrowserApp,
IID_IWebBrowser2,
(void**)&pWebBrowser2);


}
}
}

}
}

::FreeLibrary(hInst);
}
else{//Èç¹ûûÓа²×°MSAA
MessageBox(NULL,_T("Please Install Microsoft Active Accessibility"),"Error",MB_OK);
}
return pWebBrowser2;
}
CCppCs 2003-10-06
  • 打赏
  • 举报
回复
microran2000兄能给出底层代码,非常感谢。
但是,我却用不上。因为我不是要自己创建SOCKET去连接Web服务器,而是要把IE调出来,让IE去接收并显示从Web服务器返回来的网页。
kingzai 2003-10-05
  • 打赏
  • 举报
回复
ATL技术内幕第二章有讲,其实你可以不用VARIANT的
CCppCs 2003-10-05
  • 打赏
  • 举报
回复
谁懂变体类型的参数用法呀?
CCppCs 2003-10-04
  • 打赏
  • 举报
回复
真奇怪,不知道怎么弄的,就行了:
Navigate(
_T("http://reg.163.com/CheckUser.jsp"),
navOpenInNewWindow|navNoHistory,
NULL,
_T("Content-Type: application/x-www-form-urlencoded "),
_T("url=http://sms.163.com/&password=12345a&username=hello9981"),
58
);

不过,参数是变体类型的的那种调用方法,我还不会,谁能给讲讲?谢。
kingzai 2003-10-03
  • 打赏
  • 举报
回复
现在在休假,手头上没有HTML代码,不过的确不难的,也就是写几句javascript语句而已
使用COM接口你可以参考
http://www.csdn.net/develop/Read_Article.asp?Id=11914
CCppCs 2003-10-03
  • 打赏
  • 举报
回复
kingzai(kingzai),你是说:让IE调用一个本地的页面,在那个页面里执行javascript,调用一个ocx,获取用户名和密码,然后,执行POST的操作,登录网易的短信中心,对吧?这个方法好象不错,待会儿我试一下。可惜,我对网页设计不太熟悉,还要学一学才会。你能写好一个发给我吗?

用 浏览器控件 的这种方法我已经搞了大半天了,好像就差一步了,把 VARIANT 数据类型的用法搞明白了后,兴许就能成了呀。
kingzai 2003-10-03
  • 打赏
  • 举报
回复
ShellExecute(0,0,"http://reg.163.com/CheckUser.jsp?password=12345a&username=hello9981&url=http://sms.163.com/",0,"",SW_SHOW);
其实用这种方法就可以了,你可以把密码和帐户信息写到一个ocx里,用javascript调用它,或者你写到别的地方,当然要将其加密。
当然你也可以用ie 的COM接口,不过要分析表单这些还是比较麻烦一些
CCppCs 2003-10-03
  • 打赏
  • 举报
回复
楼上的SeekInRain,ShellExecute(0,0,"http://.../",0,"",SW_SHOW);这种用法用来登录是能行的,我已经试验过了,否则我也不会贴出来的。
你说的 表单方式 我还不太懂,那种情况以后在说吧,我现在想解决的是登录的问题。

我找到了一段使用那个浏览器控件的VB代码,如下:
Private Sub Command1_Click()
Dim URL As String
Dim Flags As Long
Dim TargetFrame As String
Dim PostData() As Byte
Dim Headers As String

URL = "http://reg.163.com/CheckUser.jsp" ' A URL that will accept a POST
Flags = 0
TargetFrame = ""

PostData = "password=wasarah999909&username=ccppcs&url=http://sms.163.com/"

' VB creates a Unicode string by default so we need to
' convert it back to Single byte character set.
PostData = StrConv(PostData, vbFromUnicode)

Headers = "Content-Type: application/x-www-form-urlencoded" & _
vbCrLf
WebBrowser1.Navigate URL, Flags, TargetFrame, PostData, Headers
End Sub
我实验过了,能成功登录。

我又搞了一部分VC代码,用的也是浏览器控件,但是却不行:

#include "WebBrowser2.h"
#include "ATLBASE.h"

void CBbDlg::OnButton1()
{
CRect rect;
GetClientRect (&rect);

// Create the control.
CWebBrowser2 *m_pBrowser = new CWebBrowser2;
ASSERT (m_pBrowser);
if (!m_pBrowser->Create(NULL,NULL,WS_VISIBLE,rect,this,NULL))
{
TRACE("failed to create browser\n");
delete m_pBrowser;
m_pBrowser = NULL;
}

CComVariant a(OLESTR("http://reg.163.com/CheckUser.jsp"));
CComVariant b((int)(navOpenInNewWindow|navNoHistory));
CComVariant c(OLESTR("username=hello9981&password=12345a&url=http://sms.163.com/"));
CComVariant d(OLESTR("Content-Type: application/x-www-form-urlencoded"));
COleVariant noArg;
m_pBrowser->Navigate2(&a,&b,&noArg,&c,&d);
}

上面的VB和VC代码的设计原理是完全一样的,一套代码可行,另一套就应该也能行的呀。
是不是VC代码的参数有问题?谁精通 VARIANT 数据类型的用法,帮我看看问题出在哪里?谢了。
SeekInRain 2003-10-03
  • 打赏
  • 举报
回复
ShellExecute(0,0,"http://reg.163.com/CheckUser.jsp?password=12345a&username=hello9981&url=http://sms.163.com/",0,"",SW_SHOW);


这样好象行不通吧? 要是用表单方式呢? 你怎么办?
matlab7 2003-10-03
  • 打赏
  • 举报
回复
gz
Onega 2003-10-02
  • 打赏
  • 举报
回复
use IWebbrowser2::Navigate2,
HRESULT Navigate2( VARIANT *URL,
VARIANT *Flags,
VARIANT *TargetFrameName,
VARIANT *PostData,
VARIANT *Headers
);
CCppCs 2003-10-02
  • 打赏
  • 举报
回复
akiko,你的方法在调用一个普通网页的时候,很好用。但是,如果要调用一个登录用的网页,并且要求自动输入用户名和口令,就有问题了。例如:
ShellExecute(0,0,"http://reg.163.com/CheckUser.jsp?password=12345a&username=hello9981&url=http://sms.163.com/",0,"",SW_SHOW);
这样写虽然能够成功登录网易短信中心,但是,却有一个严重的问题,就是:密码也被IE全部都显示出来了,这样不就泄密了吗?!
看看 网易泡泡 或者 QQ ,都能做到在IE中不显示登录密码。我觉得,这应该是对IE的调用问题,怎么才能告诉IE,让它不要把登录密码显示在地址栏里呢?这其实不是什么技术难题,是缺少IE方面的足够资料才不知道该怎么办。
akiko 2003-10-02
  • 打赏
  • 举报
回复
ShellExecute(0,0,"www.csdn.net",0,0,SW_SHOW);
加载更多回复(5)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧