vpn客户端要实现web登陆,采用activeX是相对来说最便捷、可靠性最好的一种方式,缺点在于activeX只适用于IE浏览器。
那么vpn客户端要为ActiveX提供调用接口和接收相应的参数,一般常用的方式有两种:
1、socket通讯
2、可执行程序的运行参数
如果是socket通讯必须要vpn客户端作监听tcp端口接收处理消息,activeX发消息,实现相对来说比较复杂;
可执行程序的运行参数让activeX调用相对来说非常简单,但是执行可执行程序都是以新开一个系统进程方式执行,那么要实现通讯需要解决:1、vpn客户端在系统中只能有一个进程实例 2、在新进程收到消息后需要收到的消息发送给旧的进程,然后退出。
vc实现进程通讯的实例:
cpp source:
const UINT WM_MYMESSAGE = WM_USER + 1;
CWnd *pWnd=CWnd::FindWindow(NULL,"GMS Version 1.1");//目标进程的窗口的captain
if(pWnd)
{
pWnd->SendMessage(WM_MYMESSAGE, NULL, NULL);
}
窗口对象的 .h:
#define WM_MYMESSAGE WM_USER + 1
afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp);
窗口对象的.cpp:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
...
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
...
END_MESSAGE_MAP()
LRESULT CMainFrame::OnMyMessage(WPARAM wp, LPARAM lp)
{
AfxMessageBox("Hello World");
}
那么vpn客户端要为ActiveX提供调用接口和接收相应的参数,一般常用的方式有两种:
1、socket通讯
2、可执行程序的运行参数
如果是socket通讯必须要vpn客户端作监听tcp端口接收处理消息,activeX发消息,实现相对来说比较复杂;
可执行程序的运行参数让activeX调用相对来说非常简单,但是执行可执行程序都是以新开一个系统进程方式执行,那么要实现通讯需要解决:1、vpn客户端在系统中只能有一个进程实例 2、在新进程收到消息后需要收到的消息发送给旧的进程,然后退出。
vc实现进程通讯的实例:
cpp source:
const UINT WM_MYMESSAGE = WM_USER + 1;
CWnd *pWnd=CWnd::FindWindow(NULL,"GMS Version 1.1");//目标进程的窗口的captain
if(pWnd)
{
pWnd->SendMessage(WM_MYMESSAGE, NULL, NULL);
}
窗口对象的 .h:
#define WM_MYMESSAGE WM_USER + 1
afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp);
窗口对象的.cpp:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
...
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
...
END_MESSAGE_MAP()
LRESULT CMainFrame::OnMyMessage(WPARAM wp, LPARAM lp)
{
AfxMessageBox("Hello World");
}