最近需要做个小程序实现对word文档的操作,功能都已经实现了,但我想先把操作word那部分代码做成动态链接库(MFC 扩展DLL)再使用,可问题却出现了。当选择“在静态库中使用MFC”时,就会出现“无法解析外部符号”的错误,当选择“在共享DLL 中使用MFC”,生成的程序可以正常运行,可在调试状态下运行程序,却出现“0x7c94ab33处未处理的异常 0xc0000005写入位置0x00030ffc时发生访问冲突”,这是为何啊。另外当执行下面语句时wstring wstr[] = {_T(""),_T("daf"),_T("gdasf"),_T("gadf")};
vector<wstring> vstr;
vstr.assign(str,str+4);
wd.writetabletext(vstr);           //wd是封装成dll类的对象如果操作word的类不做成dll,直接使用源文件,上面代码是可以正常执行的啊,可做成dll后,出现下面的错误:Run-Time Check Failu #2-Stack around the avriable 'wd' was corrupted.
希望各位大侠给予指点

解决方案 »

  1.   

    Run-Time Check Failu #2-Stack around the avriable 'wd' was corrupted. 这个明显是数组写越界了.
    注意不要导出模板类
      

  2.   

    stdcall和cdecl调用约定不一致吧?
      

  3.   

    “0x7c94ab33处未处理的异常 0xc0000005写入位置0x00030ffc时发生访问冲突”关于这个错误,今天上午我跟踪了一下,发现一个变量m_wdSel(Selection对象)的m_lpDispatch指向的值在析构前值突然变成0xffffffff。在dll源代码中,w_wdSel是这样定义的      m_wdSel = m_wdApp.GetSelection();   //m_wdApp是_Application的对象GetSelection是这样定义的:(在msword.cpp)     LPDISPATCH result;
        InvokeHelper(0x5,DISPATCH_PROPERTYGET,VT_DISPATCH,(void*)&result,NULL);
        return result;在客户端程序是这样使用dll的
    1、{
    2、   AFXOleInit();
    3、   CWordWriter wd;           //被封装成dll的类
     
    4、    wd.Create();
    5、   wd.ShowApp();
    6、}程序运行在行6之前,m_wdSel.m_lpDispatch中的值都不会变,运行到行6执行CWordWriter析构函数时,值就变了,更奇怪的是CWordWriter中其他的变量的lpDispatch中的值都不变,唯独wdSel。何解啊????
      

  4.   

    请大家注意 InvokeHelper(0x5,DISPATCH_PROPERTYGET,VT_DISPATCH,(void*)&result,NULL);
    中的0x5和“0x7c94ab33处未处理的异常 0xc0000005写入位置0x00030ffc时发生访问冲突”中的0xc0000005是一样的吧
      

  5.   


    那就是在类的导出导入前都加上stdcall或cdecl么
      

  6.   

    AFX_EXT_CLASS 导出的类前面加keyword.
      

  7.   

    看来是找不到答案了。另外我想问其他一个问题我现在在用2008 sp1,做界面确实漂亮多了,相比较以前版本,做出来的多文档对窗口具有记忆功能,这挺不错,可我不想用它,想把这个功能给取消,找了半天也没找到保存和读取窗口位置尺寸的地方。有了这个功能,我在PreCreateWindow还是OnCreate里控制窗口大小位置都会失败。
      

  8.   

    1 针对无法解析外部符号问题
      我以前是做lua时有碰到过 当时是没有引入lib文件造成的
      我那是
    #if defined (_DEBUG) 
    #pragma comment( lib, "lua5.1.lib" ) // Lua Support 
    #else
    #pragma comment( lib, "lua51.lib" ) // Lua Support 
    #endif 
      就好了 你看看是不是适当的改一下2 获取窗口位置 GetWindowRect()