对于进程间的通信学习,主要知识点如下。
1. OpenClipboard()功能:打开剪贴板。
返回值:如果通过CWnd打开了剪贴板,则返回非零值。如果其他应用程序或窗口已经打开了剪贴板,则返回零。
在调用Windows的CloseClipboard函数之前,其他应用程序将不能修改剪贴板的内容。在调用Windows的EmptyClipboard函数之前,当前CWnd对象将不会成为剪贴板的拥有者。
2. HANDLE SetClipboardData( UINT uFormat,HANDLE hMem);把指定数据按照指定格式放入 剪切板中,window API函数
.
uFormat 用来指定要放到剪切板中的数据的格式.
hMem 指定具有指定格式的数据的 句柄,该参数可以是空.
如果hMem为空则表明直到有其他程序对剪切板中的数据进行请求时,该程序才会将指定格式的数据写入到剪切板中.
延迟提交所说的就是第二个参数留空.
调用该函数以后,hMem所指定的内存对象被系统拥有,程序不应当将他释放,或者锁定。
3. GlobalAlloc是一个Windows API 函数。该函数从堆中分配一定数目的字节数。Win32 内存管理器并不提供相互分开的局部和全局堆。提供这个函数只是为了与16位的Windows相兼容。简称全局堆分配.
HGLOBALGlobalAlloc(
UINTuFlags, // 分配属性(方式)
DWORDdwBytes // 分配的字节数
);
uFlags指定如何分配内存,若指定为0,则是默认的GMEM_FIXED.这个值可以是下面其中一个或几个位标识(那些指明不兼容的组合除外)
dwBytes指定要申请的字节数.若该参数为 0 且参数 uFlags 指定为 GMEM_MOVEABLE 则该函数返回一个内存对象的 句柄,该内存对象被标识为discarded(可抛弃的)。
若函数调用成功,则返回一个新分配的内存对象的 句柄。若函数调用失败,则返回 NULL。可调用 GetLastError以获得更多错误信息。
4.GlobalLock函数将一个全局内存对象锁定,并返回该块内存首字节 指针. 除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效。 Windows为每个内存对象都维持着一个锁定计数。对这个函数的每次调用都应有一个对应的 GlobalUnlock 调用 返回值Long,如成功,返回内存块的地址;如出错,或者这是一个已被丢弃的“可丢弃”内存块,则返回零。会设置GetLastError 参数表
LPVOID GlobalLock(
HGLOBAL hMem // handle to global memory object
);
hMem[输入参数]全局内存对象句柄。该句柄由函数GlobalAlloc或 GlobalReAlloc返回。
5.BOOL IsClipboardFormatAvailable (UINT format //剪贴板格式);参数:UINT format 可以使用任何标准剪切板格式“Standard Clipboard Formats”
若应用程序要识别多个剪贴板格式,应使用函数GetPriorityClipboardFormat 达到目的。
6.GetClipboardData是一个函数,用来打开剪贴板并获取剪贴板内容。
EnumClipboardFormats加while来循环出一个可用的剪贴板格式
使用GetClipboardData获得剪贴板的内存块首地址
用GlobalLock锁定剪贴板那内存块
GlobalSize可以用来获取该内存块的大小
使用GlobalUnlock解除锁定
CloseClipboard关闭剪贴板
7.CreatePipe创建一个匿名管道,并从中得到读写管道的句柄。
BOOL CreatePipe(PHANDLE hReadPipe, // 指向读句柄的指针
PHANDLE hWritePipe, // 指向写句柄的指针
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性的指针
DWORD nSize // 管道大小);
8.CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
BOOL CreateProcess
(
LPCTSTR lpApplicationName,//应用程序的名称
LPTSTR lpCommandLine,//命令行参数
LPSECURITY_ATTRIBUTES lpProcessAttributes。//进程的属性
LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程的属性
BOOL bInheritHandles,//是否继承父进程的属性
DWORD dwCreationFlags,//创建标志
LPVOID lpEnvironment,//环境变量
LPCTSTR lpCurrentDirectory,//当前目录
LPSTARTUPINFO lpStartupInfo,//传给新进程的信息
LPPROCESS_INFORMATIONlpProcessInformation//进程返回的信息
如果函数执行成功,返回非零值。如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。
9.GetStdHandle是一个Windows API函数。它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值)。可以嵌套使用。
HANDLE GetStdHandle(
DWORD nStdHandle );
GetStdHandle()返回标准的输入、输出或错误的设备的 句柄,也就是获得输入、输出/错误的屏幕 缓冲区的句柄。
10.ReadFile 从 文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的 地址空间中。FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作.如果文件要交互使用的话,当 函数调用完毕时要记得调整文件指针。从文件中读出数据。与fread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、 套接字以及邮槽。
BOOL
ReadFile(
HANDLE
hFile,
LPVOID
lpBuffer,
DWORD
nNumberOfBytesToRead,
LPDWORD
lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
11.
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。
12.WriteFile 将数据写入一个文件。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理.
BOOL
WriteFile(
HANDLE
hFile,
LPCVOID
lpBuffer,
DWORD
nNumberOfBytesToWrite,
LPDWORD
lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
调用成功,返回非0,调用不成功,返回为0
13.
OnCreate后窗口产生, 然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。简单点,就是 ONCREATE只是产生VIEW的基本结构和变量而在OnInitialUpDate()中,主要初始化视图中控件等。对各个变量进行初始化操作。
14.CreateNamedPipe 创建一个 命名管道。返回的句柄由管道的 服务器端使用.
HANDLEWINAPICreateNamedPipe(
__in LPCTSTRlpName,
__in DWORDdwOpenMode,
__in DWORDdwPipeMode,
__in DWORDnMaxInstances,
__in DWORDnOutBufferSize,
__in DWORDnInBufferSize,
__in DWORDnDefaultTimeOut,
__in LPSECURITY_ATTRIBUTESlpSecurityAttributes);
返回值Long,如执行成功,返回管道的
句柄
。INVALID_HANDLE_VALUE表示失败。会设置GetLastError
lpName String,指定管道名,采用的形式是:
\\.\
管道\管道名。最多可达256个字符的长度,而且不用区分大小写。如果存在指定名字的一个管道,则创建那个管道的一个新实例
dwOpenMode Long,下述常数组的一个组合
下述常数之一(对于管道的所有实例都要一样):
PIPE_ACCESS_DUPLEX 管道是双向的
PIPE_ACCESS_INBOUND 数据从客户端流到服务器端
PIPE_ACCESS_OUTBOUND 数据从服务器端流到客户端
下述常数的任意组合
FILE_FLAG_WRITE_THROUGH 在网络中建立的字节型管道内,强迫数据在每次读写操作的时候通过
网络传输
。否则传输就可能延迟
FILE_FLAG_OVERLAPPED 允许(但不要求)用这个管道进行异步(重叠式)操作
常数WRITE_DAC, WRITE_OWNER 和 ACCESS_ SYSTEM_SECURITY提供了附加的安全选项
dwPipeMode Long,下述常数组的一个组合:
下述常数之一(管道的所有实例都必须指定相同的常数)
PIPE_TYPE_BYTE 数据作为一个连续的字节数据流写入管道
PIPE_TYPE_MESSAGE 数据用
数据块
(名为“消息”或“
报文
”)的形式写入管道
下述常数之一:
PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出
PIPE_READMODE_MESSAGE 数据以名为“消息”的
数据块
形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)
下述常数之一:
PIPE_WAIT 同步操作在等待的时候挂起线程
PIPE_NOWAIT(不推荐!) 同步操作立即返回。这样可为
异步传输
提供一种落后的实现方法,已由Win32的重叠式传输机制取代了
nMaxInstances Long,这个管道能够创建的最大实例数量。必须是1到常数PIPE_UNLIMITED_INSTANCES间的一个值。它对于管道的所有实例来说都应是相同的
nOutBufferSize Long,建议的输出缓冲区长度;零表示用默认设置
nInBufferSize Long,建议的输入缓冲区长度;零表示用默认设置
nDefaultTimeOut Long,管道的默认等待超时。对一个管道的所有实例来说都应相同
lpSecurityAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或者传递零值(将参数声明为ByVal As Long,并传递零值),以便使用不允许继承的一个默认描述符
15.创建服务器的步骤如下:
1)使用API函数CreateNamedPipe,创建一个命名管道实例句柄。
2)使用API函数ConnectNamedPipe,在命名管道实例上监听客户机连接请求。
3)分别使用ReadFile和WriteFile这两个API函数,从客户机接收数据,或将数据发给客户机。
4)使用API函数DisconnectNamedPipe,关闭命名管道连接。
5)使用API函数CloseHandle,关闭命名管道实例句柄。
16.ConnectNamedPipe的定义如下:
BOOL ConnectNamedPipe(
HANDLE hNamedPipe, //由CreateNamedPipe函数返回的句柄
LPOVERLAPPED lpOverlapped //在使用FILE_FLAG_OVERLAPPED标志创建命名管道的情况下,可以使用这个参数让这个连接以异步方式工作,如果这个参数为NULL,则以锁定模式工作.
); 一个命名管道客户机成功建立了与服务器的连接之后,ConnectNamedPipe的调用便会结束。随后,服务器可用WriteFile函数,向客户机自由地发送数据;或者使用ReadFile函数,从客户机那里接收数据。服务器完成了与一个客户机的通信之后,便应调用DisconnctNamedPipe函数,以关闭此次通信会话。
17.API函数ImpersonateNamedPipeClient,令自己的执行线程在客户机的安全环境下工作。
该函数的定义如下:BOOL ImpersonateNamedPipe(HANDLE hNamedPipe);
其中,hNamedPipe参数对应于由CreateNamedPipe返回的管道实例句柄。调用了这个函数之后,操作系统便会将服务器的线程安全环境变成客
户机的安全环境。这样一来,服务器便能保持对资源的访问控制,而无论由谁启动了这个进程。
18.命名管道客户机:
步骤如下:
1)调用API函数WaitNamedPipe,等候一个命名管道实例可供使用。
2)调用API函数CreateFile,打开命名管道实例并建立连接。
3)调用API函数WriteFile和ReadFile,分别向服务器发送数据和从中接收数据。
4)调用API函数CloseHandle,关闭打开的命名管道会话。
19.WaitNamedPipe的定义如下:
BOOL WaitNamedPipe(
LPCTSTR lpNamedPipeName, //要检查的命名管道的名字
DWORD nTimeout //等待超时的时间值。
);
20.HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
参数说明:
1)lpFileName参数指定希望打开的那个管道的名字。
2)dwDesiredAccess参数定义了访问模式,应将其设为GENERIC_READ(用于从管道上读取数据),或设为GENERIC_WRITE(用于将数据写入管
道),或者用OR操作组合起来。
3)dwShareMode参数应设为0,因为一次只能有一个客户机访问一个管道实例。
4)lpSecurityAttributes参数应设为NULL,因为CreateFile不能创建命名管道。
5)dwCreationDisposition参数则应设为OPEN_EXISTING,意味着CreateFile函数会在命名管道不存在的情况下调用失败。
6)dwFlagsAndAttributes无论如何都要有标志FILE_ATTRIBUTE_NORMAL。另外,该参数还可以选择
21.CallNamedPipe函数允许客户机应用建立与一个消息类型的管道的连接(假如当时没有可用的管道实例,便会一直等候下去),然后在管道上读写数据,最后关闭管道。
BOOL CallNamedPipe(
LPCTSTR lpNamedPipeName, //命名管道的名字
LPVOID lpInBuffer, //指向发送数据缓冲区
DWORD nInBufferSize, //发送数据缓冲区的大小
LPVOID lpOutBuffer, //指向接收数据缓冲区
DWORD NOutBufferSize, //接收数据缓冲区的大小
LPDWORD lpBytesRead, //从管道读回的字节数。
DWORD nTimeout //在一个命名管道可用之前,最长能等待多久的时间。
);
22.TransactNamedPipe函数既可在客户机应用中使用,亦可在服务器应用中使用。设计它的目的是为了将读操作与写操作整合到一个API调用之中。这样一来,由于减轻了MSNP重定向器收发数据的负担,所以能在一定程度上优化网络I/O的性能。TransactNamedPipe的定义如下:
BOOL TransactNamedPipe(
HANDLE hNamedPipe, //由CreateNamedPipe或CreateFile返回的命名管道的句柄
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesRead, //以上参数同CallNamedPipe
LPOVERLAPPED lpOverlapped //指向一个OVERLAPPED结构以便让该函数以重叠I/O方式工作。
);
23.■GetNamedPipeHandleState 用于获得命名管道的信息,如:运行模式(消息或字节模式)、管道实例数和缓冲区信息等。在一个管道实例
的“存在时间”内,不同时间由该函数返回的信息可能会发生变化。该函数的定义如下:
BOOL GetNamedPipeHandleState(
HANDLE hNamedPipe, //命名管道句柄。
LPDWORD lpState, //工作模式,返回值可能有两个,一个是PIPE_NOWAIT,另一个是PIPE_READMODE_MESSAGE。
LPDWORD lpCurInstances, //管道实例的数量。
LPDWORD lpMaxCollectionCount, //实例发送给服务器之前,打算在客户机上收集的最大字节数。
LPDWORD lpCollectDataTimeout, //收集数据的超时值,超过这个值,命名管道就会通过网络付出信息。
LPTSTR lpUserName,
DWORD nMaxUserNameSize //lpUserName和nMaxUserNameSize定义了一个缓冲区,用来接收一个“空终止”字符串,它是客户机应用的用户名。
);
■SetNamedPipeHandleState 可以更改命名管道的状态信息,定义如下:
BOOL SetNamedPipeHandleState(
HANDLE hNamePipe, //命名管道的句柄
LPDWORD lpMode, //工作模式
LPDWORD lpMaxCollectionCount, //同GetNamedPipeHandleState
LPDWORD lpCollectDataTimeout //同GetNamedPipeHandleState
);
■GetNamedPipeInfo 也可以获得命名管道的信息,定义如下:
BOOL GetNamedPipeInfo(
HANDLE hNamedPipe, //命名管道的句柄
LPDWORD lpFlags, //命名管道的类型,可判断它是服务器还是客户机以有工作模式(字节或消息模式)
LPDWORD lpOutBufferSize, //输出缓冲区的大小。
LPDWORD lpInBufferSize, //输入缓冲区的大小。
LPDWORD lpMaxInstances //可以创建的命名管道实例的最大数量
);
■PeekNamedPipe 可对命名管道内的数据进行浏览,而不会将管道内的数据移出来。假如应用程序希望对进入的数据进行“轮询”,以免
调用ReadFile时发生锁定,便可使用这个函数;另外,如果应用程序需要在数据实际接收之前,先作一番检查,这个函数也是很有用的,
例如:应用程序可以先检查进入的消息的长度,再调节接收数据的缓冲区大小,然后再正式接收数据。PeekNamedPipe的定义如下:
BOOL PeekNamedPipe(
HANDLE hNamedPipe, //命名管道的句柄
LPVOID lpBuffer, //
DWORD nBufferSize,//lpBuffer和nBufferSize指定缓冲区和大小,用来从管道接收数据
LPDWORD lpBytesRead, //实际从管道中接收到的字节数
LPDWORD lpTotalBytesAvail, //可以从管道内接收到的字节总数
LPDWORD lpBytesLeftThisMessage //只对消息模式有用,当一条消息长度大于nBufferSize指定的缓冲区大小时,返回消息剩余数据的长度。在字节模式下,返回0。
);
24.CreateMailslot创建一个邮路。返回的句柄由邮路服务器使用(收件人).
HANDLE WINAPI CreateMailslot(
_In_ LPCTSTR lpName,
_In_ DWORD nMaxMessageSize,
_In_ DWORD lReadTimeout,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
lpName String,指定邮路的名字,采用的形式如下:\\.\邮路\[ 路径\]邮路名
nMaxMessageSize Long,指定一个邮路消息的最大长度。零表示无限长。请注意,对于穿越一个网络域到多个邮路的广播消息,最大长度是400
lReadTimeout Long,等待指定的数据时,用这个参数指定邮路使用的默认超时设置,以毫秒为单位。零表示不等待。常数MAILSLOT_WAIT_FOREVER表示一直等到数据到达
lpSecurityAttributes SECURITY_ATTRIBUTES,指定一个结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符
返回值Long,如执行成功,返回邮路的句柄;INVALID_HANDLE_VALUE表示失败。会设置GetLastError
25.GetMailslotInfo获取与一个邮路有关的 信息.
BOOL WINAPI GetMailslotInfo(
_In_ HANDLE hMailslot,
_Out_opt_ LPDWORD lpMaxMessageSize,
_Out_opt_ LPDWORD lpNextSize,
_Out_opt_ LPDWORD lpMessageCount,
_Out_opt_ LPDWORD lpReadTimeout
);
hMailslot Long,指定一个邮路的 句柄
lpMaxMessageSize Long,指定一个长整数 变量,用于装载这个邮路的最大消息长度
lpNextSize Long,指定一个长整数变量,用于装载下一条消息的长度。如没有消息准备好,则可设为常数MAILSLOT_NO_MESSAGE
lpMessageCount Long,指定一个长整数变量,用于装载邮路中准备好的消息数量
lpReadTimeout Long,指定一个长整数变量,用于装载邮路的默认阅读超时
返回值Long,非零表示成功,零表示 失败。会设置GetLastError