有成功的例子吗?请高手贴出来让我拜读。

解决方案 »

  1.   

    问题不是共享内存,问题是我把对象用Move拷贝到共享内存后,另一个进程中怎样取出来。
    直接把对象(未实例化的变量)当作指针指向共享内存中的相应位置,就可以使用?!还是用Getmem分配内存,把共享内存中的数据用Move拷贝回来,再....,我试了很多方法,都不行,对象中的内容都不正确。是我写错了,还是要怎样弄?请高手指教。
      

  2.   

    共享内存???你怎么共享的??你在A进程中创建的实例,Getmem分配的内存别的进程是访问不到的.要想在进程间共享内存,最好就是用内存映射文件的方法,当然如果只是简单的传递数字,字符,小对象可以发消息的方式.具体怎么做要好长代码,手边没有,建议找本<WINDOWS核心编程>一书看看,上面都是的C,但调用的都是系统API,DELPHI中实现也要调用这些API的.
      

  3.   

    老大,你说的这些我知道的,内存映射文件就是共享内存,只是我们用的名字不一样,在unix下面一般称为共享内存,我初学windows编程,一时之间没有说得如你那么标准。不过还是谢谢你,我去看看你说的书。
      

  4.   

    老大,你别痴心忘想了,你没看过C++内存分配的方面的书吗?
    一个类的实例不一定放在一块连续的内存的,如果那个类有十M大,到哪找这好好的一块内存啊.
    还是自己override类的assign方法吧.!!!
      

  5.   

    你可以用DLL吗...DLL的类可以被其它进程调用的.但前前提是把DLL加载到本进程空间,从没听说过可以把类放共享内存中.如果你做出来了一定给我发一份!
      

  6.   

    我的程序如下:
      进程1中的程序是这样:
          
          var
            obj:TMyObject;
            pobj:PMyObject;
            psm:Pointer;
          begin
            psm:=GetSharedMem(SHARED_MEM_NAME,SizeOf(TMyObject));
            obj:=TMyObject.Create('objname');
            Move(obj,psm^,SizeOf(TMyObject));
            pobj:=psm;        ShowMessage(pobj.name);
            ....
          end;      正常的显示了"objname"的MessageBox现在,另一个进程(进程2)中:
          var
            psm,p:Pointer;
            pobj:PMyObject;
          begin
            psm:=GetSharedMem(SHARED_MEM_NAME,SizeOf(TMyObject));
            ...有效性检查..
            GetMem(p,SizeOf(TMyObject));
            ...有效性检查..
            DebugOutput('here');
            Move(psm^,p^,SizeOf(TMyObject));
            DebugOutput('here2');
            pobj:=p;
            DebugOutput('here3');
            DebugOutput(pobj.name);
            ....   结果执行到输出"here3"后,访问pobj.name时就报错“..内存.. 不能written..."
       "....内存...不能 read..."
        然后进程2就coredump了。   name属性是从TMyObject的父对象TFatherObject那里继承的,而TFatherObject是这样定义的:     TFatherObject=class(TObject)
         private
            ...
            FName:string;
            ...
         public
            ...
            property Name:string read FName write SetName;      
            ...
         end.这样的对象不能传送到其他进程里使用吗?
      

  7.   

    sorry我发现了,我真是头大,SizeOf(TNormalRuler)竟然等于4,只是一个指针的大小而已,呵呵。等我再试试,谢谢你的提醒,我会参考的,如果弄好了,我一定发给你。
      

  8.   

    回复人: superyys(无血野人) ( ) 信誉:19  2005-06-13 23:47:00  得分: 0  
     
     
       老大,你别痴心忘想了,你没看过C++内存分配的方面的书吗?
    一个类的实例不一定放在一块连续的内存的,如果那个类有十M大,到哪找这好好的一块内存啊.
    还是自己override类的assign方法吧.!!!
      
     
    ----------------------------
    这个连续的 是线性地址的 自然 线性地址都是连续的如果采取分页机制,那么线性地址经过映射后的物理地址就不一定是连续的了, 而没有采用分页的话,那么线性地址就是物理地址。
      

  9.   

    beyondtkl(大龙驹<*BEYOND U*>):你说类是连续的,你可以试一下:
    在一个进程里,先getmem一块内存,再
    将另一个类的实例move过来,大小按常理就是sizeof(类名),
    定义一个类指针去访问,肯定会失败!
    如果是record就可以,这就可以证明类在内存存放是不连续的!
    另一方面,所有类的函数和过程都是共用地址的(面向对象语言编译器都是这样编译的,因为完全一样,着没有必要浪费空间),如果所有的类实例都是一样大小的,而且连续的,
    那类里的函数和方法到底放在哪个实例里边?
      

  10.   

    对不起各们,刚刚我试了,可以用move复制一个类,上次我怎么试都不行,这次一试就成功了,,
    真是怪了,,
    大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!大家别怪我才疏学浅,胡乱说话!
      

  11.   

    MapWrite:#include <iostream>
    #include <windows.h>using namespace std;class CPerson
    {
    public:
    char m_szName[10];
    char m_szSex;
    int  m_nAge;
    public:
    CPerson(char* pName, char Sex, int Age)
    {
    strncpy(m_szName, pName, 10);
    m_szSex = Sex;
    m_nAge  = Age;
    }
    };void main()
    {
    CPerson p("Amazon", 'F', 20);
    cout << p.m_szName << " # " << p.m_szSex << " # " << p.m_nAge << endl; HANDLE hMap;
    hMap = ::CreateFileMapping((HANDLE) 0xFFFFFFFF,
       NULL,
       PAGE_READWRITE,
       0,
       sizeof(CPerson),
       "Person");
    if (hMap == 0)
    {
    cout << " CreateFileMapping failed " << endl;
    return;
    }

    LPVOID pView;
    pView = ::MapViewOfFile(hMap,
    FILE_MAP_WRITE,
    0,
    0,
    sizeof(CPerson));
    if (pView == NULL)
    {
    cout << " MapViewOfFile failed " << endl;
    return;
    } memcpy(pView, &p, sizeof(CPerson));

    system("pause");
    }
      

  12.   

    MapRead:#include <iostream>
    #include <windows.h>using namespace std;class CPerson
    {
    public:
    char m_szName[10];
    char m_szSex;
    int  m_nAge;
    public:
    CPerson(char* pName, char Sex, int Age)
    {
    strncpy(m_szName, pName, 10);
    m_szSex = Sex;
    m_nAge  = Age;
    }
    CPerson()
    {
    memset(m_szName, 0, sizeof(m_szName));
    m_szSex = 'M';
    m_nAge  = 18;
    }
    };void main()
    {
    CPerson p; HANDLE hMap;
    hMap = ::CreateFileMapping((HANDLE) 0xFFFFFFFF,
       NULL,
       PAGE_READWRITE,
       0,
       sizeof(CPerson),
       "Person");
    if (hMap == 0)
    {
    cout << " CreateFileMapping failed error #" << ::GetLastError() << endl;
    return;
    }

    LPVOID pView;
    pView = ::MapViewOfFile(hMap,
    FILE_MAP_WRITE,
    0,
    0,
    sizeof(CPerson));
    if (pView == NULL)
    {
    cout << " MapViewOfFile failed error #" << ::GetLastError() << endl;
    return;
    } memcpy(&p, pView, sizeof(CPerson));
    cout << p.m_szName << " # " << p.m_szSex << " # " << p.m_nAge << endl; ::UnmapViewOfFile(pView);
    CloseHandle(hMap);

    system("pause");
    }
      

  13.   

    说明:我用Delphi写共享类对象的 使用同样的方法居然不成功,,奇怪 ,而单独的变量则是ok的。。所以用vc写了一个
      

  14.   

    Sizeof(TMyObject)总是等于4(指针而已),我如何确定TMyObject的大小呢
      

  15.   

    看看。。TPerson.InstanceSize是哦
      

  16.   

    你用Sizeof(对像)当然不行啦,对像名只是一个指针而已,它只是指向对像的那块内存。所以你这样子是不行的。