首页 如何从DLL中导出带STL实例的类

如何从DLL中导出带STL实例的类

举报
开通vip

如何从DLL中导出带STL实例的类如何从DLL中导出带STL实例的类 , 问题内容:如何从DLL中导出带STL实例的类, , 原讨论链接:, 所属论坛:进程/线程/DLL 审核组:VC/MFC , 提问者:P_hantom 解决者:laiyiling , 感谢: , 关键字: , 答案: 我要从DLL中导出一个类,这个类中有一个成员是STL的queue,我在导出以后用exe 生成这个类的实例,可是在销毁的时候报Runtime Error,如何解决, 附带一个例子,这个例子就有上面的这个问题 /////////////////// ...

如何从DLL中导出带STL实例的类
如何从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 #include #include __declspec(dllimport) std::map* GiveMeAMap(int n); __declspec(dllimport) void ShowMeTheMap(std::map *amap); __declspec(dllexport) const char* MapItemX (std::map *m, int x ); int main () { // Create the map in the DLL int x = 6; std::map *p = GiveMeAMap(x); // Display the contents of the map from the DLL printf("Showing contents from the DLL\n"); ShowMeTheMap(p); // Display the contents of the map from the EXE // using the accessor function from the DLL so we // aren't directly accessing the map printf("Showing contents from the EXE using accessor\n"); int i = x; while (i--) { printf("%d = %s\n",i,MapItemX(p,i)); } // Access Violation when accessing the map that // was created in the DLL from the EXE printf("Showing contents from the EXE directly\n"); while (x--) { printf("%d = %s\n",x,(*p)[x].c_str()); } return 0; } //--------------------------------------------------------- // AVDLL.CPP // Compile options needed /GX #pragma warning (disable : 4786) #include #include #include // Create the map here in the DLL __declspec(dllexport) std::map* GiveMeAMap(int n) { std::map *m = new std::map; while(n--) { char b[33]; itoa(n,b,2); (*m)[n] = std::string(b); } return m; } // We can access the map without error from the executable // image where the map was created __declspec(dllexport) void ShowMeTheMap(std::map *p) { int x = p->size(); while (x--) { printf("%d = %s\n",x,(*p)[x].c_str()); } } // An accessor method to return the associated C string // for key x __declspec(dllexport) const char* MapItemX (std::map *m, int x) { return (*m)[x].c_str(); } 2 编译a.dll的时候, 在preprocessor中添加"_DLL"宏 当定义_DLL宏的时候,标准库会导出相关的类,这样就可以在成员变量或函数参数中可 以使用标准库中的类了。 3参考: 如何在Dll中导出STL类
本文档为【如何从DLL中导出带STL实例的类】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_314871
暂无简介~
格式:doc
大小:20KB
软件:Word
页数:6
分类:
上传时间:2018-04-04
浏览量:16