Delphi的Sharemem – 当不需要时
发布时间:2020-12-15 04:30:04 所属栏目:大数据 来源:网络整理
导读:我知道当我在Delphi APP和Delphi DLL之间分享字符串时,我需要在应用和dll项目源中添加Sharemem作为uses子句中的第一个单元. 但是,如果dll导出只接受Pchars的函数,但是在某些dll方法中,我使用字符串,我还应该使用sharemem吗?让我看看一个示例代码: procedur
我知道当我在Delphi APP和Delphi DLL之间分享字符串时,我需要在应用和dll项目源中添加Sharemem作为uses子句中的第一个单元.
但是,如果dll导出只接受Pchars的函数,但是在某些dll方法中,我使用字符串,我还应该使用sharemem吗?让我看看一个示例代码: procedure ShowMyCustomMessage(aMessage : Pchar); var vUselessString : string; begin vUselessString := aMessage; ShowMessage(vUselessString); end; exports ShowMyCustomMessage; 在这种简单而无用的情况下,dll正在接受Pchar,但是在导出的方法中,dll会创建一个字符串var.我应该添加ShareMem吗? WideString呢?传递WideString参数是否需要使用Sharemem? 解决方法
当且仅当在一个模块(即DLL / EXE)中分配内存并在另一个模块中释放内存时,才需要使用Sharemem.当您正在模块之间传递字符串时通常会发生这种情况.
在给出的例子中,没有必要使用Sharemem. PChar的记忆由被叫方分配,不被被呼叫方释放.被调用者中的字符串被分配并被释放在被调用者中. 这里有一个你需要Sharemem的例子: function GetString: string; begin Result := 'hello'; end; 这里的字符串的内存被分配在被叫方中,但是将被调用方释放. WideString的情况非常特别. WideString是COM BSTR类型的封装.它使用共享COM分配器分配和释放.因此,它不使用Delphi分配器,并且您可以安全地在不使用Sharemem的情况下在模块之间传递WideString. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Go语言使用空接口实现可以保存任意值的字典
- vb.net – Web.config jsonSerialization maxJsonLength被忽
- ANTS Memory Profiler - .NET内存泄漏分析工具
- 亚马逊提供的大数据分析公共数据集(海量)
- delphi7生成简单的验证识别码
- vb.net – 使用DirectCast,CType,TryCast来投射DataTypes
- VB MSHFLEXGRID MSHFLEXGRID 绑定 CHECKBOX 另一法,推荐
- 执行Lua脚本的Android恶意程序
- Django将request对象传入模板配置
- LeetCode题解(Golang实现)--Longest Substring Without Rep