如何从DLL中导出带STL实例的类
, 问题内容:如何从DLL中导出带STL实例的类,
, 原讨论链接:, 所属论坛:进程/线程/DLL 审核组:VC/MFC
, 提问者:P_hantom 解决者:laiyiling
, 感谢:
, 关键字:
, 答案:
我要从DLL中导出一个类,这个类中有一个成员是STL的queue,我在导出以后用exe
生成这个类的实例,可是在销毁的时候报Runtime Error,如何解决,
附带一个例子,这个例子就有上面的这个问题
///////////////////
// dll
///////////////////
#include
using namespace std;
// 此类是从 dlltest.dll 导出的
class __declspec(dllexport) Cdlltest
{
deque m_Queue;
};
////////////////////
// exe
////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
Cdlltest a;
return 0;
}
在程序退出的时候会报错,如何解决。
如果问题解决还可以加分~
---------------------------------------------------------------
你的析构函数怎样
---------------------------------------------------------------
1
ZT:
在多个DLL(exe)之间通过指针或者引用传递STL对象时会发现操作失败现象。MSDN上给出了完整的解决方法。在开发应用程序的过程中需要认真对待。
现象:
在不同的DLL或EXE中通过指针或引用操作另一个DLL或EXE中的STL对象时,会遇到严重的程序错误,包括数据错乱或丢失。
原因:
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
C++库的多数类直接或间接的使用了静态数据成员。由于这些类是通过模板创建实例的,所以每个可执行程序(一般是有DLL或EXE扩展名的)包含了有关类静态数据成员的一份Copy。当STL类中的方法要求操作静态数据成员时,这个类操作的静态数据是此方法代码所在的执行程序中的数据。由于静态成员数据在可执行程序中不能保证同步,所以前面提到的操作会导致读取失败或数据混乱和丢失。
解决方法:
1. 在创建STL对象的可执行程序中输出读取的方法(函数)。这些函数包装STL对象要求的功能。这样,STL对象只能在单个可执行程序中被直接读取。例如:假设MyProgram.EXX需要得到MyLibrary.DLL 内deque中的下一个元素,MyLibrary.DLL则要输出读取方法:“MyClass* DequeNextItem (/*...*/);”。MyProgram.EXE就可以执行此方法来得到队列的下一个元素了。
2. 从一个可执行程序中输出模板实例,在另一个可执行程序中引入此实例。例如:MyLibrary.DLL将vector指针回传给MyProgram.EXE中的一个函数,需要在MyLibrary.DLL中输出MyClass类和vector。在MyProgram.EXE中引入它们后。就可以得到MyLibrary.DLL中静态数据成员的一份Copy了。
例子程序:
//---------------------------------------------------------
// AVEXE.CPP
// Compile options needed: /GX
#pragma warning (disable : 4786)
#include