进程间通信ipc机制,利用各种资源作为中间桥梁。中间资源一般都是某种内核变量: 当然也可以是一个动态链接库。由于dll的变量有写时copy的机制,所以用data_seg()来声明。当然,如果有初始值,那么这样的全局变量默认就是在数据段里面的,可以省略data_seg()。下面的程序中,主程序和子程序都访问dll当中的变量pi,这个pi只有一个拷贝,使得++操作可以连续的进行。当然,如果主从程序都退出了,那dll也就释放了。下次再运行,还是从初始状态开始。
主程序:
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <WinBase.h>
int _tmain(int argc, _TCHAR* argv[]){
HMODULE hLib=LoadLibrary("..\\Debug\\Win32dll.dll");
if(NULL==hLib){
printf("LoadLibrary failed\n");
return 1;
}
STARTUPINFO StartupInfo;
ZeroMemory(&StartupInfo,sizeof(STARTUPINFO));
StartupInfo.cb=sizeof(STARTUPINFO);
PROCESS_INFORMATION ProcessInformation;
BOOL ret=CreateProcess(_T("..\\Debug\\client.exe"),0,0,0,
TRUE,CREATE_DEFAULT_ERROR_MODE,0,0,&StartupInfo,&ProcessInformation);
WaitForSingleObject(ProcessInformation.hProcess,INFINITE);
if(FALSE==ret){
printf("%d\n",GetLastError());
return 1;
}
printf("主进程等待结束\n");
FreeLibrary(hLib);
return 0;
}
|
子进程程序:
#include "stdafx.h"
#include<Windows.h>
#include<stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
printf("\n子进程 开始\n");
HMODULE hLib=LoadLibrary("..\\Debug\\Win32dll.dll");
FreeLibrary(hLib);
printf("\n子进程 退出\n");
return 0;
}
|
动态库程序:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include<stdio.h>
#pragma data_seg("mydata")
int pi;
#pragma data_seg()
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
printf("进入dll,++pi=%d\n",++pi);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("process attach %d\n",hModule);
break;
case DLL_THREAD_ATTACH:
printf("thread attach %d\n",hModule);
break;
case DLL_THREAD_DETACH:
printf("thread detach %d\n",hModule);
break;
case DLL_PROCESS_DETACH:
printf("process detach %d\n",hModule);
break;
}
return TRUE;
}
|
程序运行输出:
进入dll,++pi=3
rocess attach 268435456
子进程 开始
进入dll,++pi=3
rocess attach 268435456
进入dll,++pi=4
rocess detach 268435456
子进程 退出
主进程等待结束
进入dll,++pi=4
rocess detach 268435456
ress any key to continue . . .
漫谈RPC
漫谈组件技术:从OLE到COM到ActiveX到SOAP
Windows RPC编程入门
Windows Com编程入门
Windows编程: 再见MFC
Windows编程: 写一个系统服务
Windows编程 最简单的窗口实例
Windows编程 用MSXML来操纵一个xml文件
Windows平台进程间通信: 剪切板
Windows平台进程间通信: 内存映射
Windows平台进程间通信: dll共享变量
C++编程 Visitor模式(访问者)
C++ 用Ado连接数据库