社区
网络编程
帖子详情
vc 6.0应用程序和网页之间通信
qq383063671
2010-04-25 12:55:38
我想做一个应用程序,利用vc6.0
然后做一个网站,只能放到web空间,不能放到服务器!(web空间不能放应用程序,因此不能使用socket进行网络通信)
在web空间附带有数据库
我现在想在应用程序中调用web空间中数据库的数据
除了利用webservice这种办法,
还有就是在vc6.0中得到显示数据的网页,然后进行网页解析。
我在这里想问问高手有没有其他的更好的办法进行桌面应用程序和网站之间的信息交互?
...全文
430
2
打赏
收藏
vc 6.0应用程序和网页之间通信
我想做一个应用程序,利用vc6.0 然后做一个网站,只能放到web空间,不能放到服务器!(web空间不能放应用程序,因此不能使用socket进行网络通信) 在web空间附带有数据库 我现在想在应用程序中调用web空间中数据库的数据 除了利用webservice这种办法, 还有就是在vc6.0中得到显示数据的网页,然后进行网页解析。 我在这里想问问高手有没有其他的更好的办法进行桌面应用程序和网站之间的信息交互?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
尹成
2010-04-25
打赏
举报
回复
自己的程序中使用 CHtmlView 或直接嵌入 Webbrowser 控件显示网页时,常常需要获取网页元素的一些事件,以实现对网页显示的控制或与网页元素进行交互。最常见的莫过于获取用户对网页上超链接的所有点击事件。要实现这个需求,在 MSDN 中描述了接收网页元素事件的基本方法,但这篇文章的一些细节语焉不详,让人摸不着头脑。在 CodeProject 这篇文章中提出了一种替代的方法,但是存在一些小的限制。本文详细演示了如何实现在 CHtmlView 中监视链接点击的方法。
为了实现监视所有的链接点击而不是特定的超链接,第一步需要在 CHtmlView 的 IHTMLDocument 上安装全局的 EventHandler 以接收 DISPID_HTMLELEMENTEVENTS2_ONCLICK(或 DISPID_HTMLDOCUMENTEVENTS2_ONCLICK)鼠标点击事件;接下来在事件处理代码中判断是否是在超链接上发生。在处理事件响应函数的安装和卸载时要格外小心,重复安装可能导致重复接收到消息甚至程序崩溃,而忘记卸载则会导致 COM 资源泄漏。
接收网页事件
要响应网页事件,需要实现 IDispatch 接口,并在其 Invoke() 方法中处理接收到的消息。对于 MFC,因为 CCmdTarget 类已经实现了 IDispatch 接口,因此继承 CCmdTarget 并结合相关宏可以较简单的处理消息。代码如下:
// DocEvtHandler.h
// SDocEvtHandler 消息处理类声明 by 旧日重来
#pragma once
#import <mshtml.tlb>
class SDocEvtHandler : public CCmdTarget
{
DECLARE_DYNAMIC(SDocEvtHandler)
public:
SDocEvtHandler();
virtual ~SDocEvtHandler();
// 消息处理函数
void OnClick(MSHTML::IHTMLEventObjPtr pEvtObj);
DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};
// DocEvtHandler.cpp
// SDocEvtHandler 消息处理类实现 by 旧日重来
#include "stdafx.h"
#include "DocEvtHandler.h"
#include "mshtmdid.h"
IMPLEMENT_DYNAMIC(SDocEvtHandler, CCmdTarget)
SDocEvtHandler::SDocEvtHandler()
{
EnableAutomation(); // 重要:激活 IDispatch
}
SDocEvtHandler::~SDocEvtHandler()
{
}
BEGIN_MESSAGE_MAP(SDocEvtHandler, CCmdTarget)
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(SDocEvtHandler, CCmdTarget)
DISP_FUNCTION_ID(SDocEvtHandler,"HTMLELEMENTEVENTS2_ONCLICK",
DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick,
VT_EMPTY, VTS_DISPATCH)
END_DISPATCH_MAP()
BEGIN_INTERFACE_MAP(SDocEvtHandler, CCmdTarget)
INTERFACE_PART(SDocEvtHandler,
DIID_HTMLButtonElementEvents2, Dispatch)
END_INTERFACE_MAP()
void SDocEvtHandler::OnClick(MSHTML::IHTMLEventObjPtr pEvtObj)
{
// 鼠标点击处理代码...详见下节
}
接下来,在 DocumentComplete 事件中安装事件处理响应函数:
// 事件响应函数的管理 by 旧日重来
///////////////////// .h //////////////////////
class SWebpageView : public CHtmlView
{
// 其他代码...
SDocEvtHandler *m_pEventHandler;
DWORD m_dwDocCookie; // 用于卸载事件响应函数
IDispatch *m_pDispDoc; // 用于卸载事件响应函数
};
//////////////////// .cpp ////////////////////
SWebpageView::SWebpageView()
: m_dwDocCookie(0)
, m_pDispDoc(NULL)
{
m_pEventHandler = new SDocEvtHandler;
}
// 安装响应函数。省略了一些失败判断以突出主要步骤
void SWebpageView::InstallEventHandler()
{
if(m_dwDocCookie) // 已安装,卸载先。最后一次安装的才有效
UninstallEventHandler();
m_pDispDoc = GetHtmlDocument();
IConnectionPointContainerPtr pCPC = m_pDispDoc;
IConnectionPointPtr pCP;
// 找到安装点
pCPC->FindConnectionPoint(DIID_HTMLDocumentEvents2, &pCP);
IUnknown* pUnk = m_pEventHandler->GetInterface(&IID_IUnknown);
//安装
HRESULT hr = pCP->Advise(pUnk, &m_dwDocCookie);
if(!SUCCEEDED(hr)) // 安装失败
m_dwDocCookie = 0;
}
// 卸载响应函数。省略了一些失败判断以突出主要步骤
void SWebpageView::UninstallEventHandler()
{
if(0 == m_dwDocCookie) return;
IConnectionPointContainerPtr pCPC = m_pDispDoc;
IConnectionPointPtr pCP;
pCPC->FindConnectionPoint(DIID_HTMLDocumentEvents2, &pCP);
hr = pCP->Unadvise(m_dwDocCookie);
}
// 在 DocumentComplete 事件中安装响应函数
void SWebpageView::OnDocumentComplete(LPCTSTR lpszURL)
{
// 其他代码...
InstallEventHandler();
}
// 在 BeforeNavigate2 和 Destroy 事件中卸载响应函数
void SWebpageView::OnBeforeNavigate2(/* ... */)
{
UninstallEventHandler();
// 其他代码...
}
void SWebpageView::OnDestroy()
{
UninstallEventHandler();
CHtmlView::OnDestroy();
}
在正确安装了事件响应函数之后,就可以接收网页事件了。
检测超链接点击事件
全局事件处理接口成功安装后,当 Webbrowser 控件中有相应的事件发生,则会自动调用事件响应函数。在上面的情况下,会接收到网页中所有的鼠标点击事件,因此我们需要判断用户是否是点击超链接对象。因为超链接内部可能还包含有子结构,例如图像,因此鼠标点击事件不一定直接发生在超链接对象,因此需要根据事件发生的对象逐级向上检查,代码如下:
void SDocEvtHandler::OnClick(MSHTML::IHTMLEventObjPtr pEvtObj)
{
MSHTML::IHTMLElementPtr pElement =
pEvtObj->GetsrcElement(); // 事件发生的对象元素
while(pElement) // 逐层向上检查
{
_bstr_t strTagname;
pElement->get_tagName(&strTagname.GetBSTR());
if(_bstr_t("a") == strTagname || _bstr_t("A") == strTagname)
{
// 已找到 "a" 标签,在这里写相应代码
// 例1:取得目标地址:
_variant_t vHref = pElement->getAttribute("href", 0);
// 例2:取消点击,禁止转到目标页面
pEvtObj->put_returnValue(_variant_t(VARIANT_FALSE, VT_BOOL));
break;
}
pElement = pElement->GetparentElement();
}
}
ok1234567
2010-04-25
打赏
举报
回复
如果 web空间不能放应用程序,除了下载网页,可能没有别的办法
如果 web空间可以放程序,那就可以用任何支持的方式与服务器进行通信,web server的http协议本身可以由用户自定义,同时几乎所有像样点的web server都支持扩展编程,因此其应用的实现从理论上没有障碍,比如IIS下,通过ISAPI编程,在共享的进程地址空间下,可以开启新的 socket 服务进程,实现有状态的真正的长连接
VC
6.0
说明安装说明
Visual C++
6.0
(完整绿色版)使用说明 1、软件安装后,在桌面和开始菜单里分别建立快捷方式。 2、此版本适用于计算机等级考试上机环境及一般的C++应用。 3、此版本为默认安装后对安装文件夹完整打包,并安装windows\system32下的相应文件。 4、系统默认安装在:C:\Program Files\Microsoft Visual Studio 。 5、
VC
6.0
通用补丁:特别适合于解决错误信息:“Compiling... , Error spawning cl.exe” 使用方法:退出
VC
,运行此文件,单击"是",再启动
VC
,可解决大部分问题。 6、系统安装后,如果考试系统提示没有安装
VC
,不影响使用, 自行从桌面的快捷方式启动
vc
,然后打开需要调试的程序,调试即可, 不影响考试系统评分。 7、其他
VC
++版本和更多的二级备考资料下载: http://hi.baidu.com/jsj08 二级C语言加油站
vc
++
6.0
串口程序源码
本程序是用
vc
++
6.0
,是上位机与下位机
通信
的基础。
用
VC
6.0
实现上位机串口
通信
.rar_KRY_
VC
6.0
实现上位机串口
通信
_WIN32 上位机_win32串口_串口API
用Win32 API设计串行
通信
的基本思路,在实际应用中,我们可以利用Win32 API设计出满足各种需要的串行
通信
程序。
SerialBuffer.zip_serial buffer_
vc
6.0
目录串口
通信
高级编程提供了一个能够进行串口
通信
的类,能够方便地进行各种数据
通信
。 本程序在
vc
6.0
中调试通过 由于本程序设计到硬件编程,因此,如果读者的串口
通信
设备 没有连接好,可能会有问题 本程序重在介绍一个串口
通信
类,因此开发具体应用 的时候可以直接使用这个类。
VC
6.0
FreeBird软件源码 仿飞鸽传书,可聊天 传输文件.rar
VC
6.0
自写的FreeBird仿飞鸽传书,可聊天 传输文件程序源码,我耗费一个月上百度、参考网上代码,和不断调试出来的一个网络文件传输小软件。可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个
应用程序
、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 做这个小软件的目的不是为了给别人使用,而是想通过开发这么一个小小和软件,体会软件设计的过程和了解网络
通信
是个大概什么样的东西(这也是我摸索了好久,现在才彻底明白原来Socket
通信
是这么一回事的)。总而言之:目的是为了学习。
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章