环境:
    VS2005
描述:
    在一个dll中有一个导出类,里面定义一个接口,参数是一个vector的引用,试图在接口中实现对这个vector的修改。
    参数可以正确传入接口中,并且在其中更改有效,但当函数调用完毕返回exe的时候,发现那个vector并没有被更改。
问题:
    在接口中可以参数可以是vector的引用吗?如何才能让vector在接口中的更改反映到接口外面?源代码:
//    头文件.H
#ifdef VIDEO_DLL
    #define VIDEO_DLL_DECLARE    _declspec(dllexport)
    #define EXPIMP_TEMPLATE
#else
    #define VIDEO_DLL_DECLARE    _declspec(dllimport)
    #define EXPIMP_TEMPLATE extern
#endifEXPIMP_TEMPLATE template class VIDEO_DLL_DECLARE std::vector<wstring>;class VIDEO_DLL_DECLARE CVideo
{
public:
    CVideo(void);
    ~CVideo(void);public:
    void Test(WStringArray& words);
};#endif
///////////////////////////////////////////////////////////////////////////
//    CPP文件
void CVideo::Test(WStringArray& words)
{
    //   在这个地方修改words
}
////////////////////////////////////////////////////////////////////////////
//    测试程序EXE
CVideo video;
WStringArray words;
video.Test(words);    //  执行完之后发现words并没有被更改,而且words没有任何元素PS:跟踪到CPP文件的时候,发现在函数里面words确实发生了变更,何以函数调用结束之后,words还是原来那样?

解决方案 »

  1.   

    你的dll和exe的编译选项是什么?
      

  2.   

    指向指针的指针
    WStringArray **这样传进去行不?
      

  3.   

    在CVideo::Test最后要return那里设个断点断住,看一下words的内容,再反汇编,按F10继续执行,回到exe里,看看执行了哪些汇编指令,这些指令应该不会修改words内容的啊。
      

  4.   

    在函数的内部,执行了words.push_back(),而且发现在函数中,words里面的内容确实是更改了,可是当函数返回的时候发现words在函数中的更改无法反映到exe,也就是说出来之后words还是传进去的words一样
      

  5.   

    其实只要导出vector的模板类就可以了,只是这样牺牲了通用性。最好还是避免在dll中用stl吧
      

  6.   

    还有没有人有更好的方法呢?如果需要在exe和dll之间传递stl
      

  7.   

    应该为const vector<wstring>&
    不要做修改,因为在dll中赋值会引起内存分配释放不再一个模块的问题.不然你看看那个API使用了STL的东西?就是因为有问题.
    而且STL这东西没二进制标准,非常的不通用.