注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

Windows共享数据段内的全局变量  

2011-01-01 00:16:29|  分类: Windows开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Windows共享数据段内的全局变量
http://blog.163.com/wangpf2008@126/blog/static/3515511920077765318482/
http://blog.tianya.cn/blogger/post_show.asp?BlogID=695169&PostID=12416673


        将A.dll注入到explorer进程,但是GetExitCodeThread总是0!于是一路追查,最后发现,原来A.dll隐式链接了B.dll、C.dll,所以,在explorer进程通过显式加载A.dll之前,应该显式加载B.dll、C.dll。
        于是,写了一个类,负责专门显式加载dll。为了通用性,这个类本身不需要知道要加载哪些dll,类的成员变量是一个list链表。但是,其他进程无法知道到底要加载哪些dll,所以,我把这个类的实例对象放到dll的全局共享数据段。
        接着,奇怪的事情再次发生了。dll并没有加载!TRACE打印,发现链表为空!怎么会清空了!于是,我仔细想了一下,觉得自己写得有问题。链表是这样的:
list<CAtlString> m_list;
        为什么会这样呢?原因有两个。一个是list本身,list是new动态分配节点内存的;另外一个是CAtlString,也是动态分配内存的。也就是说,他们使用的是堆内存。很显然,本进程的堆内存,其他进程没法访问的!
       于是,我写了一个栈内存的类,用来替换CAtlString;使用数组代替list链表。再试,还是不行!

       根据TRACE信息,我感觉,每个进程加载dll的时候,似乎都调用了这个全局共享对象的构造函数。在构造函数里面加TRACE,果然如此!
       去掉所有虚函数,还是一样!

       想来,可能是类会调用构造函数吧。我就改成结构体,也一样。其实这是很显然的,C++中的结构体和类差不多的。

      最后查资料,看了上面两篇日志,收获就是我自己花了一天的时间试验出的结论。但是,问题并没有解决!对象,或许真不应该放到全局共享数据段中。放弃,明天改用其他方法实现。

附上string类:

template<int TempSize=MAX_PATH>
class CStackAtlString
{
public:
    CStackAtlString(void)
    {
        memset(m_buffer, 0, sizeof(m_buffer));
    }

    ~CStackAtlString(void)
    {

    }

protected:
    TCHAR m_buffer[TempSize];

public:
    CStackAtlString(const CStackAtlString & r)
    {
        *this=r;
    }

    LPCTSTR GetBuffer(int i=0)
    {
        return m_buffer;
    }

    int GetLength()
    {
        return (int)_tcslen(m_buffer);
    }

    CAtlString Left(int i)
    {
        CAtlString str;
        str=m_buffer;
        return str.Left(i);
    }

    int ReverseFind(TCHAR tch)
    {
        CAtlString str;
        str=m_buffer;
        return str.ReverseFind(tch);
    }

    operator LPCTSTR()
    {
        return m_buffer;
    }

    CStackAtlString & operator=(const CStackAtlString & r)
    {
        _tcscpy_s(m_buffer, sizeof(m_buffer)/sizeof(TCHAR), r.m_buffer);

        return *this;
    }

    CStackAtlString & operator=(LPCTSTR r)
    {
        _tcscpy_s(m_buffer, sizeof(m_buffer)/sizeof(TCHAR), r);

        return *this;
    }
};

使用方法:
CStackAtlString<1024> str;

By:zhanyonhu

  评论这张
 
阅读(838)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016