none
VS2005下加载com的难题(急) RRS feed

  • 问题

  •  

    我在2005下使用C#语言加载C++编写的DLL,然后该DLL加载一个COM组件,该COM是一个非可视组件,能够接受系统消息

    实现方法是将COM继承CWindowImpl类,然后在组件的FianlConstruct中创建一个弹出窗口(不可视)

    代码如下:

    HRESULT FinalConstruct()
     {
           m_pDeviceCallback = NULL;   //用于回调

           RECT rect = {0, 0, 10, 10};
           if (Create(NULL rect, NULL, WS_POPUP) == NULL)   //弹出窗口创建,不可见
           {
                  return E_FAIL;
           }

            return S_OK;
     }

    在DLL中使用LoadLibarary方法加载com,

    执行中出现写保护内存错误,单步调试发现是在Create方法中出错,观看汇编代码发现是由于atlwin.h中使用thunk技术跳转代码时执行mov dword ptr [esp+4],This过程中,提示向只读内存写入出错,

    奇怪的是在2005使用MFC加载DLL再加载COM没有任何异常

    对比两种方法的mov dword ptr [esp+4],This,没发现问题,只是C#下esp的值是0x002xxxxx地址,而mfc下esp的值是

    0x001xxxxx地址,难道跟地址有关?

     

    急盼高手解决,不胜感激!!!!

    2008年1月16日 7:37

答案

  • 已经大概猜测到原因所在,我的COM是使用vs2003编译的,如果用vs2005编译该com就没有问题

    而且如果将vs2005中允许访问非托管代码开关关闭,使用F5可以将程序跑起来,

    原因大概出在2003或2005的编译上

    不知道是否有人遇到过此类问题,或推荐个高手帮忙解决原因所在

    2008年1月17日 11:31

全部回复

  • 是在同一台机器上吗?

     

    先把加载com的代码去掉看有没问题

     

    2008年1月17日 2:43
    版主
  • 已经大概猜测到原因所在,我的COM是使用vs2003编译的,如果用vs2005编译该com就没有问题

    而且如果将vs2005中允许访问非托管代码开关关闭,使用F5可以将程序跑起来,

    原因大概出在2003或2005的编译上

    不知道是否有人遇到过此类问题,或推荐个高手帮忙解决原因所在

    2008年1月17日 11:31