您的当前位置:首页如何从DLL中导出带STL实例的类

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

2024-05-07 来源:乌哈旅游
问题内容:如何从DLL中导出带STL实例的类?原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4473613所属论坛:进程/线程/DLL提问者:P_hantom感谢:关键字:答案:我要从DLL中导出一个类,这个类中有一个成员是STL的queue,我在导出以后用exe生成这个类的实例,可是在销毁的时候报RuntimeError,如何解决?附带一个例子,这个例子就有上面的这个问题/////////////////////dll///////////////////#includeusingnamespacestd;//此类是从dlltest.dll导出的class__declspec(dllexport)Cdlltest{dequem_Queue;};//////////////////////exe////////////////////int_tmain(intargc,_TCHAR*argv[]){Cdlltesta;return0;}在程序退出的时候会报错,如何解决。如果问题解决还可以加分!---------------------------------------------------------------你的析构函数怎样---------------------------------------------------------------1审核组:VC/MFC解决者:laiyilingZT:在多个DLL(exe)之间通过指针或者引用传递STL对象时会发现操作失败现象。MSDN上给出了完整的解决方法。在开发应用程序的过程中需要认真对待。现象:在不同的DLL或EXE中通过指针或引用操作另一个DLL或EXE中的STL对象时,会遇到严重的程序错误,包括数据错乱或丢失。原因:标准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//Compileoptionsneeded:/GX#pragmawarning(disable:4786)#include#include#include__declspec(dllimport)std::map*GiveMeAMap(intn);__declspec(dllimport)voidShowMeTheMap(std::map*amap);__declspec(dllexport)constchar*MapItemX(std::map*m,intx);intmain(){//CreatethemapintheDLLintx=6;std::map*p=GiveMeAMap(x);//DisplaythecontentsofthemapfromtheDLLprintf(\"ShowingcontentsfromtheDLL\\n\");ShowMeTheMap(p);//DisplaythecontentsofthemapfromtheEXE//usingtheaccessorfunctionfromtheDLLsowe//aren'tdirectlyaccessingthemapprintf(\"ShowingcontentsfromtheEXEusingaccessor\\n\");inti=x;while(i--){printf(\"%d=%s\\n\}//AccessViolationwhenaccessingthemapthat//wascreatedintheDLLfromtheEXEprintf(\"ShowingcontentsfromtheEXEdirectly\\n\");while(x--){printf(\"%d=%s\\n\}return0;}//---------------------------------------------------------//AVDLL.CPP//Compileoptionsneeded/GX#pragmawarning(disable:4786)#include#include#include//CreatethemaphereintheDLL__declspec(dllexport)std::map*GiveMeAMap(intn){std::map*m=newstd::map;while(n--){charb[33];itoa(n,b,2);(*m)[n]=std::string(b);}returnm;}//Wecanaccessthemapwithouterrorfromtheexecutable//imagewherethemapwascreated__declspec(dllexport)voidShowMeTheMap(std::map*p){intx=p->size();while(x--){printf(\"%d=%s\\n\}}//AnaccessormethodtoreturntheassociatedCstring//forkeyx__declspec(dllexport)constchar*MapItemX(std::map*m,intx){return(*m)[x].c_str();}2编译a.dll的时候,在preprocessor中添加\"_DLL\"宏当定义_DLL宏的时候,标准库会导出相关的类,这样就可以在成员变量或函数参数中可以使用标准库中的类了。3参考:如何在Dll中导出STL类http://www.vckbase.com/document/viewdoc/?id=1263

因篇幅问题不能全部显示,请点此查看更多更全内容