进程间通信学习摘记

对于进程间的通信学习,主要知识点如下。


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
     //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
     //该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);
调用成功,返回非0, 调用不成功,返回为0



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 //OVERLAPPED结构体指针
);

调用成功,返回非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



你可能感兴趣的:(进程间通信学习摘记)