这个应该是不能进程共享的吧,再说如果能共享这个也太危险了吧。
你可以通过进程之间的通信来间接控制hdc盒hbmp啊

解决方案 »

  1.   

    不同进程都需要一组图片,我把每个图片都装载到hdc 中,用的时候用Bitblt在dc间传送。可是我真的很想所有进程共享一套就够了,每个进程都一套,不仅麻烦,而且有时候还要更换,一更换,你得就通知所有进程一起更换。要是能所有进程共享一套,就不存在这个问题了,还节约空间。
      

  2.   

    “因为我的程序可能会同时运行很多个进程”有一种 多个实例 运行在 一个 进程 的 方法, 如 explorer
      

  3.   

    我的是输入法,本质上是一个DLL文件,看起来是无法运行于同一个实例的。我的那些hdc,就是输入法的皮肤,以及各种缓冲hdc,如果每个应用程序加载输入法,都要创建一套皮肤的hdc,有点浪费。尤其是这个输入法设为默认输入法的时候,你打开电脑,所有应用程序都要加载该输入法。
      

  4.   

    hDC 是不能 跨 线程 的 , 更不要说 进程了。 
      

  5.   

    很浪费内存,其实所有进程共享一个就可以了HDC只不要什么内存的, 关键是HBITMAP占用内存
    你可以使用CreateBitmap, 指定内存区域, 
    这个内存可以使用全系统共用的, 比如DLL共享, FileMap等方法
      

  6.   


    参考:
    "多线程GDI程序"
    http://download.csdn.net/detail/schlafenhamster/5583697
    "这是微软的VC6 安装盘中的一个例子,这个例子说明如何在多线程中使用 GDI 绘制。程序可以开 1,10, 25个线程来绘制 圆,矩形,和直线。"
      

  7.   

    这种控制相当不安全 。 可以考虑下二楼的思路 。 为何不直接用进程之间的通信呢 。其他进程通过消息来通知主进程绘图 ,多方便。虽然你能通过句柄 ,然后获取到dc,但是你获取不到HBITMAP  ,得不偿失
      

  8.   

    因为 。ime 文件 就是 dll ,所以 问题不是 跨 进程 exe, 而 是 dll 共享 hdc。
    注意 要 互鎻 (临界区)
      

  9.   

    我很想用你说的这种方法,只是有一个疑问:
    CreateBitmap这个函数的最后一个参数,是指向一个内在的指针,书上说:CreateBitmap用这块内存的内容来初始化Bitmap,按我的理解是:Bitmap内部数据并不是保存在这块内存的,只不过用这块内存来初始化Bitmap内部数据的。如果是这样,那改变了这块内存,并不能改变Bitmap的内容,另外,Bitmap的真正数据并不是保存这块共享内存中的,所以每个进程的hBitmap还得占用内存。你的意思是不是说:这块内存,就是Bitmap的内部数据?如果是,就太好了,将这块内存设为所以进程的共享内存(所有进程只要一份就够了),然后每个进程的hBitmap虽然不同,但是其内容(内部图片数据)实际上都保存在这块共享内存中,那就实现了我需要的了。请你:CreateBitmap的时候,那个参数指向的内存块,就是Bitmap的内部数据吗?
      

  10.   

    所有 MFC 的 GDI 对象 都是 线程 不 安全的, 需用 handle。
      

  11.   

    CreateBitmap的时候,那个参数指向的内存块,就是Bitmap的内部数据吗你还可以试试这个 CreateDIBSection
      

  12.   

    你也不能确定是不是它的内部数据,是吗?我搜了一下,CreateDIBSection这个函数,它的那个指针,确实指向它的内部数据,这就好了,用内存映射文件的内存(就是所有进程共享的内容),来为hBitmap分配数据,这样修改了那块内在的内容,hBitmap的内容自然就修改了。而且这样一来,hBitmap除了占用那块共享的内存块作为数据以外,并不需要另外存储数据的空间。
    很好,马上试验一下!
      

  13.   

    只不过有个疑问,CreateDIBSection建立的应该是DIB,就是设备无关位图,而选入HDC的好象应该是设备相关位图,也就是DDB,不知这个矛盾怎么解决?
      

  14.   

    因为 。ime 文件 就是 dll ,所以 问题不是 跨 进程 exe, 而 是 dll 共享 hdc。
    注意 要 互鎻 (临界区)
      

  15.   

    对,我现在需要的就是dll共享hdc的问题,一个dll,可能被多个进程使用,dll中如果需要一套hdc, hbitmap,如果每个进程中使用该输入法时都创建一套,就太浪费了。所以想共享一套就行了,有什么好办法吗?
      

  16.   

    // tell compiler
    #pragma data_seg ("Shared")
    HDC hDC=0;// has to been initialized
    #pragma data_seg ()
    // tell link
    #pragma comment (linker," -section:Shared,rws") 
      

  17.   

    这个不行吧?在共享内存段定义HDC,但是DLL是嵌入到各个应用程序的地址空间去的,句柄不能通用的吧?
      

  18.   

    对 DLL而言
    #pragma data_seg ("Shared")
    HDC hDC=0;// has to been initialized
    #pragma data_seg ()hDC 总是 可以 存取的。
      

  19.   

    我听上面的网友说,数据主要存储在hBitmap中,而不是hdc中,如果要用共享内存段来存储hdc和hBitmap这两个句柄,那么hBitmap里面的数据是存储在哪里的?如果只是存储在一个进程中的内存中,那么所有进程都能用吗?
      

  20.   

    我再把我上面的意思说清楚一点,如果在一个进程中,用如下代码建立hdc和hBitmap:hdc = CreateCompatibleDC(NULL);
    hbmp = CreateCompatibleBitmap(hdc, cx, cy);
    SelectObject(hdc, hbmp);而且hdc和hbmp是用你上面说的共享内存段,但是,好象只是这两个句柄值是共享内存段的,真正的hbmp的数据好象不是。这样的话,别的进程能用这个dll里的hdct,用Graphics gramem(hdc)来建立Graphics吗?
      

  21.   

    gdi  句柄 只是 一个  数组 的 index, 有 gdi 管理。