STL跨DLL使用】的更多相关文章

今天在写一个函数,需要将map作为一个引用参数传入函数体内部进行赋值,结果编译通过,执行时总是崩溃,在网上找到了一些作者写的blog,详细解释了这种情况发生的原因,特转载在这里,便于自己今后查询. 原文1:有一个功能模块, 本来是写在主程序当中. 现在觉得有必要将它写成一个 DLL. 于是开始代码的移植. 费了好大的劲. 终于移植完成, 通过编译了. 这时运行程序, CRASH!调试之, 发现是在一个 map 的赋值出现了问题.看 vc6 自带的 STL 的代码: map 的赋值操作, 也就是其…
本文为转载别人的,以作收藏之用 百度了一天,现在把结论放上边: 1.不要用STL(std::string属于STL)来跨模块传输数据,例如:dll(so)之间,dll(so)和exe(elf)之间. 解决方法:使用基本类型.数组.结构体,或者使用下面文章中的方法. 2.不要跨模块申请和释放内存. 解决方法:可以实现一个接口来释放,其他方法参考下面. 今天用个测试exe调用了个dll,有个接口返回std::string,经调试发现挂在该函数return之后,怀疑是string不适合作为返回值,百度…
今天遇到一个问题,在一个dll工程中定义了一个返回值为string,参数为string的函数,然后在一个测试工程中调用,Release模式下一切正常Debug模式下整个函数的执行到return之前都毫无问题,然而在函数return后函数结束时总是堆栈错误崩溃,试了许久之后发现将参数改为char *就可以了,然后一搜发现大家都遇到了类似的问题,那就是:不要跨dll传递STL容器,string, vector, list等,导出的dll一定要用标准数据类型. 参考文章: C++中string跨DLL…
在设置成/MD或/MDd不会导致出错 设置成/MT或/MTd的情况下会导致出错 看了CRT的实现,估计是因为fopen创建了CriticalSection来保护文件,但是在/MT的情况下,一个DLL里面的CriticalSection是不能被另外一个DLL使用的. 只是猜测啊............... 看了VS2008 里的CRT源码,发现_iob这个全局变量,每个操作FILE指针的函数都要操作这个变量处理多线程的功能. 而/MD模式把CRT库编译到同一个静态库里面,所以不会出现bug. 而…
1.问题描述: 在一个MFC应用程序exe中,调用另一个DLL中的函数,函数中的一个形参是string类型的,每次调用都会出现乱码的情况. 调用前: 调用后: 2.原因分析: 不同的模块各自有一份C运行时库代码.或者根本没有C运行时库,导致了各个模块会有各自的堆.如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放. 以STL的string为例,通过修改编译选项验证了这个问题.string在赋值的时候需要释放掉原来的内存空间,然后再申请新的内存空间存储新的内容,如…
说几个STL的缺点吧,虽然都是在比较极端的情况下出现,但是对于一些大项目还是会遇到的 1. 代码膨胀问题每一个实例化过的模板类,都会膨胀出一份独立的代码,比如std::vector<std::string>, std::vector<int>,编译后会产生两份代码,在VC2008下,每份代码大约是3-4kb,这是因为vector比较简单代码少,如果是map则会产生30-50kb的代码,因为map里有个复杂的红黑树.对于数据处理类的代码里一般会定义很多种不同的结构体,不同的结构体放到…
很久以前写在百度空间的这篇文章: [百度空间] [原] 全局operator delete重载到DLL 首先,纠正一个词“重载”,operator new/delete是替换(replacement),不是重载.只要任意一个编译单元定义了替换函数,并不需要全局声明,不用包含头文件,就会替换掉全局的默认operator new/delete, 这个行为非常像gcc的strong symbol/weak symbol. 最近翻看了C++03的标准: 3. The program’s definitio…
一. __declspec(dllexport) Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib 文件中.然后,此 .lib 文件就可以像静态 .lib 那样用于与 DLL 链接. 在更新的编译器版本中,可以使用 __declspec(dllexport) 关键字从 DLL 导出数据.函数.类或类成员函数.__declspec(dllexport) 会将导出指令添加到对象文件中,因此您不需要使用…
VC++2008 用空工程创建 DLL 一.创建 DLL 工程项目: 1)点击菜单[File] -> [New] -> [Project...] 弹出 “New Project” 对话框: 2)在左侧 [Project types:] 树形框中展开 [Visual C++] 选择 [Win32]: 3)在右侧 [Templates:] 视图框中选择 [Win32 Project]: 4)在 [Name:] 对应的文本框中填写好项目名称: 5)在 [Location:] 对应的文本框中选好项目位…
http://bbs.csdn.net/topics/390870532 用delphi xe3写的DLL,delphi7调用,参数都是PAnsiChar,DLL里的函数接收delphi7传的入参,没有问题,为什么返回参数会是乱码??? Delphi XE3的DLL代码: Delphi/Pascal code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 library TestDll;   uses   System.SysUtils,   …
一.问题由来及说明 在实际编程中遇到一些系统模块(或API)调用初始化需要窗口句柄,在主程序中(MFC或者win32)都可以很容易获得,比如mfc中可以直接调用AfxGetMainWnd().GetSafeHwnd()获取窗口句柄.但是如果跨DLL调用就很难拿到主程序的窗口句柄,那么如何获取呢? 二.可用的方法介绍 1. FindWindow/FindWindowEx函数 如果知道主调程序的进程名称,可以用FindWindow枚举并查找系统运行的所有窗口函数. 该函数之所以可以运行,是因为win…
创建编译库文件有个好处就是不容易被修改,加密的,方便调用,但是缺点是不容易查看其中的内容,反编译比较麻烦.下面让我们使用VC创建编译自己的库文件吧.常用的函数,不常更改的,应该放到库文件里,所以库文件的意义非比寻常.但为了(这里需要明白C++库和C++组件(COM组件).插件.OCX的区别) DLL与COM面试问题        DLL和插件的相关性        插件是使用了某种规则的DLL       给自己的程序添加插件功能dll做插件         DLL插件设计思想       使用…
https://msdn.microsoft.com/zh-cn/library/a90k134d.aspx https://msdn.microsoft.com/zh-cn/library/ms235636.aspx 可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数: 生成 DLL 时使用模块定义 (.def) 文件 在主应用程序的函数定义中使用关键字 __declspec(dllimport) 或 __declspec(dllexport) 使用 .def 文件 模块定义 (…
跨越DLL边界传递CRT对象潜在的错误 翻译:magictong(童磊)2013年5月 版权:microsoft 原文地址:http://msdn.microsoft.com/en-us/library/ms235460(v=vs.80).aspx 简介 当你把C运行时(CRT)对象(譬如文件句柄.语言环境和环境变量等等)传入传出DLL时(通过调用DLL里面暴露的一些函数),如果这个DLL加载了一份(与可执行文件)不同的CRT库,可能发现意向不到的事情. 有一个大家可能遇到过,相似的问题是,如果…
https://technet.microsoft.com/zh-cn/learning/bb531344.aspx   当你升级到 Visual C++ 编译器的新版本后,可能会在之前编译并正常运行的代码中遇到编译和/或运行时错误. 新版本中会引起这类问题的更改称为重大更改,通常,修改 C++ 语言标准.函数签名或内存中的对象布局时需要进行这种更改. 若要避免难以检测和诊断的运行时错误,我们建议你永远不静态链接到使用不同编译器版本编译的二进制文件. 此外,当你升级 EXE 或 DLL 项目时,…
http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款02:尽量以const,enum,inline替换#define 条款03:尽可能使用const 条款04:确定对象被使用前已先被初始化 2.构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 条款06:若不想使用编译器自动成生的函数,就该明确拒绝 条款07:为多态基类声明Virtua…
条款18 : 让接口容易被正确使用,不易被误用 欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误操作.  1. 明智而审慎地导入新类型对预防“接口被误用”有神奇疗效.同时也就可以再新类型中对值进行限制.如下: struct Day { explicit Day(int d) :val(d) { } int val; }; struct Month { explicit Month(int m) :val(m) { } int val; }; struct Y…
美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YOURSELF TO CPP 基本须知 1, view c++ as a federation of languages. c: no templates,no exceptions,no overloading object c++: c with classes, encapsulation ,…
1.c/c++申请动态内存 在c++中,申请动态内存是使用new和delete,这两个关键字实际上是运算符,并不是函数. 而在c中,申请动态内存则是使用malloc和free,这两个函数是c的标准库函数,使用它们必须包含stdlib.h,才能编译通过. new/delete和malloc/free的相同之处在于,new和malloc都是手动申请动态内存,释放时new则需要delete释放内存,而malloc则需要free释放内存. 它们的不同之处在于,new和delete会自动调用对象的构造和析…
前言 为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,在进程间通信或者设备之间通信能够提高通信速率.下面介绍 protobuf 在 ARM 平台上的使用. 简介 官方文档给出的定义和描述: protocol buffers 是一种语言无关.平台无关.可扩展的序列化结构数据的方法,它可用于(数据)通信协议.数据存储等. Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是…
extern "C" C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同. extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的.由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也…
目录 1. C/C++中的关键字2. C/C++中的标识符3. 编译选项MD(d).MT(d)编译选项的区别4. C++类模板.函数模板5. C++修饰符6. 调用约定7. 错误处理8. 环境表 9. 内存管理与进程映射 10. 系统调用 11.  文件管理(Unix C) 12. 进程管理 1. C/C++中的关键字 0x1: extern关键字 在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,这是什么原理呢? . C++语言在编译的时…
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类.但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的: 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __…
__declspec(dllexport) 声明一个导出函数,是说这个函数要从本DLL导出.我要给别人用.一般用于dll中 省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类 __declspec(dllimport) 声明一个导入函数,是说这个函数是从别的DLL导入.我要用.一般用于使用某个dll的exe中 不使用 __declspec(dllimport) 也能正确…
http://dearymz.blog.163.com/blog/static/20565742013341916919/ 编辑器: Hierarchy窗口中是场景中的Game Object列表 Project窗口中是磁盘上Assets文件夹中的内容,可用来创建Game Object 调试: 调试用Debug.Log()或者print函数打日志 目前完全无法采用VisualStudio进行调试,只能用MonoDevelop.因Unity采用的是Mono运行时引擎而不是CLR,参考Debuggin…
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类.但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的: 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __…
__declspec(dllexport)2009-03-04 17:25 我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类.但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的: 不使用…
条款18 让接口容易被正确使用,不易被误用 记住: ★“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 ★“阻止误用”的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的资源管理责任(即类的设计者应先发制人). ★tr1::shared_ptr支持定制型删除器.这可防范DLL问题,可被用来自动解除互斥锁等等. -------------------------------------------------------------------------- C++的…
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类.但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的: 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __…
对于一个大型软件系统来说,实现plugin是一件很美妙的事情,一个成功的plugin系统可以使软件增色不少.Plugin最大的功能是在一定程度内提高了软件的灵活度和可扩展性.一个设计精良的server软件plugin系统甚至在server程序不退出的情况下可以调用新加入的plugin,实现不间断服务的升级.那么,Qt是怎样实现它的plugin系统呢? 使用Qt创建plugin和在程序中调用plugin是很简单的事情,Qt提供了很多helper class供大家使用.总体来说,Qt的plugin分…