Windows平台进程间通信: dll共享变量

        进程间通信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连接数据库

作者: kgisme170   发布时间: 2010-11-08