Archive | 5 月, 2015

Tags: ,

wininet,winhttp,xmlhttprequest,ServerXmlHttpRequest各版本区别

Posted on 22 5 月 2015 by simon

一、标准API接口WinINet(Microsoft Windows Internet)和WinHTTP(Microsoft Windows HTTP)

实现Http访问,微软提供了二套API:WinINet, WinHTTP(分别封装于system32目录下的wininet.dll和winhttp.dll内)
二者主要区别在于后者更为安全和稳定,可以说WinHTTP是WinINet的升级版
LZ所提的UDF WinHTTP.au3就是直接调用标准接口写成的自定义函数库文件

二、COM对象XMLHttpRequest和WinHttpRequest和ServerXMLHTTPRequest

XMLHttpRequest是基于WinInet封装的,
而WinHttpRequest和ServerXMLHTTPRequest则是基于WinHTTP封装的
所以三者的稳定性属XMLHttpRequest为最差
封装成COM形式主要是为了方便js vbs等脚本的调用,还具有易书写、降低开发难度等许多特点把

三、对象版本和封装位置

1、XMLHttpRequest对象版本和对应的封装dll文件
Microsoft.XMLHTTP 对应 msxml.dll
MSXML2.XMLHTTP 对应 msxml2.dll
MSXML2.XMLHTTP.3.0 对应 msxml3.dll
MSXML2.XMLHTTP.4.0 对应 msxml4.dll
MSXML2.XMLHTTP.5.0 对应 msxml5.dll(此版本是伴随office2007发布的,所以目录下可能找不到该版本的dll)
MSXML2.XMLHTTP.6.0 对应 msxml6.dll
如上各个dll的发布一般都是以补丁的形式发布,win7默认都集成了吧

2、ServerXMLHTTP对象版本和对应的封装dll文件
Msxml2.ServerXMLHTTP 对应 msxml2.dll(win7自带,下同!)
Msxml2.ServerXMLHTTP.3.0 对应 msxml3.dll
Msxml2.ServerXMLHTTP.4.0 对应 msxml4.dll
Msxml2.ServerXMLHTTP.5.0 对应 msxml5.dll
Msxml2.ServerXMLHTTP.6.0 对应 msxml6.dll

3、WinHttpRequest对象
WinHttp.WinHttpRequest.5.1 对应 Winhttp.dll

(如上高版本的通常稳定性会好一点)

四、对象成员(属性、方法、事件等),主要优缺点

XMLRequest成员参考
缺点:和浏览器挂钩,大多情况下会共享cookies,session,不支持单独设置代理
优点:和浏览器挂钩,大多情况下会共享cookies,session

ServerXMLHTTP成员参考
缺点:系统没有对应dll的情况下程序需要外挂一个dll文件
优点:脱离浏览器,使用代理方便

WinHttpRequest成员参考
缺点:暂无
优点:脱离浏览器,使用代理方便

Continue Reading

Comments (0)

Tags: , ,

windows多进程间数据通信:内存映射

Posted on 19 5 月 2015 by simon

啥是进程?进程是一个正在运行的程序的实例,主要由两部分组成:(1)一个操作系统用来管理进程的内核对象。(2)创建时系统所分配的资源,主要是内存地址空间。

为啥要了解进程间数据通信?如果需要在多进程运行下进行协同工作,那么就需要掌握该知识。进程间通信是指在多进程环境下,使用的数据交互、事件通知等方法使各进程协同工作。

常用的有4种:消息传递、共享内存、管道、剪贴板:

(1)消息传递:不以进程为界限,处理消息的是窗体(包括子窗体、控件等),而与是否在同一进程无关。
如SendMessage(hwnd,WM_COPYDATA,wParam,lParam); 其中wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//用户定义数据
DWORD cbData;//数据大小
PVOID lpData;//指向数据的指针
};该结构用来定义用户数据。

(2)共享内存:在一个进程内创建内存映射,却能够在其他都个进程中使用。这些进程共享的是物理存储器的同一个页面,在把这些物理内存映射到虚拟内存时各个进程的虚拟地址并不一定相同。当一个进程将数据写入共享内存时,其他进程可以立即获取数据变更情况。

(3)管道和邮槽:其实是对共享内存的两种不同的封装机制。

(4)剪贴板:Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局共享内存,可用于被各进程暂时存储数据。写入进程首先创建一个全局内存块,并将数据写到该内存块;接受数据的进程通过剪贴板机制获取此内存块的句柄,并完成对该内存块数据的读取。

关于内存映射:如果物理内存只有一份,让这份内存在不同的进程中,映射到各自的虚拟地址空间上,每个进程都可以读取同一份数据,是一种最高效的数据交换方法。

下面开始讲述共享内存映射的方式

首先使用函数CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用OpenFileMapping函数在另一个进程里打开共享文件的名称,这样就可以实现不同的进程共享数据

比如有A、B两个进程,

1、A进程中调用内存映射API函数CreateFileMapping创建一个有名字标识的共享内存;

CreateFileMapping原型:
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect, //保护设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
LPCTSTR lpName //共享内存名称
);

2、再调用MapViewOfFile函数来映射本进程的地址空间(MapViewOfFile支持映射一个超过4G大小的文件,但地址空间最大只有 4G,可以通过设置Offset来只映射一部分文件 )

LPVOID WINAPI MapViewOfFile(
__in HANDLE hFileMappingObject,
__in DWORD dwDesiredAccess,
__in DWORD dwFileOffsetHigh,
__in DWORD dwFileOffsetLow,
__in SIZE_T dwNumberOfBytesToMap
);

hMemFile = CreateFileMappingA (-1, 0, 4, 0, 文本长度, 指针名)’内存文件映射对象
LPSTR = MapViewOfFile (hMemFile, 2, 0, 0, 0) ‘ FILE_MAP_WRITE = 2‘
将待置入的文本写到内存中,用完共享内存,再调用 UnmapViewOfFile 回收内存地址空间UnmapViewOfFile (LPSTR)

3、B进程中读取该内存地址:

hMemFile = OpenFileMappingA (4,True, Lpname)’打开文件映射对象
LPSTR = MapViewOfFile (hMemFile, 4, 0, 0, 0) ‘ FILE_MAP_READ = 4‘MapViewOfFile函数来映射该内存地址
读取指针上数据到文本,再调用UnmapViewOfFile回收内存地址空间UnmapViewOfFile (LPSTR)

 

相关链接:

1、Windows 下的进程间通讯及数据共享:

http://blog.codingnow.com/2005/10/interprocess_communications.html

2、win32下进程间通信——共享内存

http://blog.csdn.net/sszgg2006/article/details/8573348

2、Windows编程专家张静盛指点进程间通信

http://developer.51cto.com/art/200807/82340_all.htm

Comments (0)

斗牛SEO工具