跨内存管理器边界传递 Delphi const 字符串参数是否安全?

2023-11-27

主题。我想使用字符串而不是 PChar 因为这样可以省去很多转换,但如果我这样做

procedure SomeExternalProc(s: string); external SOMEDLL_DLL;

然后使用非共享内存管理器在其他一些项目中实现它:

library SeparateDll;
procedure SomeExternalProc(s: string);
begin
  //a bla bla bla
  //code here code here
end;

我(正式)不能保证 Delphi 不会出于任何原因决定更改字符串、修改其引用计数器、复制或唯一它,或其他任何内容。例如

var InternalString: string;

procedure SomeExternalProc(s: string);
begin
  InternalString := s;
end;

Delphi 增加 refcounter 并复制一个指针,就是这样。我想让德尔福复制数据。由于这个原因,将参数声明为“const”是否会使其安全?如果没有,有办法做到吗?将参数声明为 PChar 似乎不是一个解决方案,因为您每次都需要对其进行强制转换:

procedure SomeExternalProc(s: Pchar); forward;
procedure LocalProc;
var local_s: string;
begin
  SomeExternalProc(local_s); //<<--- incompatible types: 'string' and 'PAnsiChar'
end;

只要您只使用在同一版本的 Delphi 中编译的代码中的 DLL,这可能会起作用。内部格式为string众所周知,版本之间会发生更改,并且您无法正式保证它不会再次更改。

如果您想避免在使用它的任何地方进行强制转换,请尝试包装该函数,如下所示:

procedure SomeExternalProc(s: Pchar); external dllname;
procedure MyExternalProc(s: string); inline;
begin
  SomeExternalProc(PChar(local_s));
end;

然后在你的代码中,你调用MyExternalProc代替SomeExternalProc,大家都很高兴。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨内存管理器边界传递 Delphi const 字符串参数是否安全? 的相关文章

  • Delphi AES 库 (Rijndael) 使用 KAT Vectors 进行测试

    对于这两个库 Delphi 加密概要 v 5 2 http code google com p delphidec TurboPower 密码箱 v 2 07 http lockbox seanbdurkin id au tiki list
  • 以编程方式将字符串宽度值插入到 sprintf() 中

    我正在尝试以编程方式将字符串宽度值插入到sprintf 格式 期望的结果是 sprintf 20s hello 1 hello 但我想插入20在同一通话中即时进行 因此它可以是任何号码 我努力了 sprintf ds 20 hello 1
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • Delphi 5 中的 Oracle 数据库连接

    我正在使用 Delphi 5 版本 我想连接到 Oracle 数据库 我有 TDatabase 组件 我不知道如何通过 Delphi 连接到数据库 请提供连接数据库的步骤 谢谢 The TDatabase http docwiki emba
  • std::setw 如何处理字符串输出?

    我正在尝试使用设置宽度setw但是 对于将字符串输出到输出文件 我无法使其工作 我有下面的例子 setw example include
  • c++ 最大 std::string 长度由堆栈大小或堆大小决定?

    正如问题中所问 std string myVar 它可以容纳的最大字符是由堆栈还是堆决定的 谢谢 默认情况下 分配的内存为std string是动态分配的 注意std string has a max size 函数返回实现支持的最大字符数
  • 如何在Python字符串中替换括号及其中的文本

    我有两个这样的字符串 string1 Today I went to the market to pick up some fruit string2 Today I went to school to learn algebra and
  • python中的StringIO实际用途是什么?

    StringIO到底是用来做什么的 我一直在互联网上寻找一些例子 然而 几乎所有的例子都非常抽象 他们只是展示 如何 使用它 但它们都没有表明 为什么 和 在什么情况下 应该 将使用它 附注不要与 stackoverflow 上的这个问题混
  • 屏蔽字符串

    我需要将收到的字符串放入以下格式 在打字稿 javascript中 Eg 12 34 56 789 我知道有string mask以及通过 JQuery 的某种方式 有没有更简单的方法来做到这一点 您可以用所需的数据替换每个模式部分 fun
  • 无法理解寄存器和变量之间的汇编mov指令

    我在 64 位 Linux 上使用 NASM 汇编器 有一些关于变量和寄存器的东西我无法理解 我创建一个名为 msg 的变量 msg db hello world 现在 当我想写入标准输出时 我移动msg to rsi注册 但我不明白mov
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • 在 JavaScript 中声明 const 有什么意义

    我一直认为 JavaScript 中的 const 变量是常量 就像 不能改变的变量 所以我一直认为使用 const 相对于 let var 的好处是减少资源使用 但经过快速测试后 它看起来像一个 const 几乎就像一个 let 变量 它
  • 解析分隔字符串

    我怎样才能得到 connect 100 username example 从这个字符串 ngg connect gt 100 username gt example Using std string find有参数 and gt and s
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • 如何实现 Vec 的修剪?

    Rust 提供了字符串的修剪方法 str trim http doc rust lang org stable std primitive str html method trim删除前导和尾随空格 我想要一个对字节串执行相同操作的方法 应
  • 如何检查字符串是否为有效日期

    我有一个字符串 31 02 2010 并想检查它是否是有效日期 最好的方法是什么 我需要一个方法 如果字符串是有效日期 则返回 true 如果不是 则返回 false require date begin Date parse 31 02
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • delphi THashSHA2 在大文件上返回错误的 SHA256

    Data Cloud CloudAPI pas has class function TCloudSHA256Authentication GetStreamToHashSHA256Hex const Content TStream str

随机推荐

  • ubuntu下安卓模拟器没有声音

    我正在 ubuntu 19 10 中运行 android 模拟器 我尝试了以下解决方案 但没有结果 Link 1 Link 2 Link 3 Error 1 10 PM Emulator pulseaudio pa context conn
  • 像在 Java 中一样在 Swift 中使用套接字

    如果我想连接到服务器 在 Java 中我会打开一个 Socket 并使用端口和主机地址对其进行初始化 然后检索输入 输出流并读 写我想要的任何内容 在 Swift 中 我很难这样做 因为它不是那样构建的 我真的很想看到一个简单的示例 说明如
  • dlopen 失败:无法打开共享对象文件:没有这样的文件或目录

    问题是我使用dlopen加载一个库 so是我写的 它不是系统库 但我得到了标题中所示的错误 我已经包括了dlfcn h 在编译器中 我使用了 ldl command 我想要加载的只是源代码文件夹 我尝试添加 L 但没有成功 找出代码出错位置
  • R:通过引用函数传递 data.frame

    我通过一个data frame作为想要更改内部数据的函数的参数 x lt data frame value c 1 2 3 4 f lt function d for i in 1 nrow d if d value i 2 0 d val
  • 如何知道用户点击了“X”或“关闭”按钮?

    在MSDN中我发现CloseReason UserClosing知道用户已决定关闭表单 但我想单击 X 按钮或单击关闭按钮是相同的 那么我如何在代码中区分这两者呢 谢谢大家 假设您需要 WinForms 您可以使用FormClosing 事
  • 在 emacs python shell 中重新加载更改的 python 文件

    在 emacs Python shell 我正在运行 2 Python 中 我正在导入一个正在使用的 py 文件并测试代码 但是 如果我更改代码 我不知道如何再次导入它 从我到目前为止的阅读看来 reload modulename 应该有效
  • 在 AsyncTask 中获取上下文

    我正在尝试获取名为 Opciones 的类的 AsyncTask 中的上下文 该类是唯一调用该任务的类 但我不知道该怎么做 我看到了一些如下代码 protected void onPostExecute Long result Toast
  • 如何指定 FCM 消息的优先级?

    我正在使用 React native firebase 来管理 React native 应用程序上的通知 当应用程序关闭时 我尝试在后台处理 FCM 消息而不显示通知 我正在使用 React native firebase 来管理 Rea
  • 按编号搜索并使用 ABAddressBook 获取图像

    我希望使用号码作为键通过我的应用程序在 iphone 地址簿中进行搜索 然后检索与该联系人关联的图像并将其显示在 UIImageView 上 我尝试使用 ABAddressBook 框架 但无法继续 任何人都可以建议我解决方案或我可以遵循的
  • 绝对导入会导致 ModuleNotFoundError

    Python 3 6 我已经编写了一些组件 并且正在尝试将其中一个组件导入另一个组件中 下面是我的项目结构 components init py extract python3 init py extract py transform py
  • Laravel 5.2 中 auth()->user() 为 null

    我刚刚将 Composer 更新到 Laravel 5 2 无法查看受密码保护的页面 基本上下面的代码行不起作用 auth gt user 有人可以建议为什么这不起作用吗 确保任何需要会话 Auth 使用的 的路由都位于 web 中间件组
  • 使用应用内购买来解锁功能与使用 iPhone 的免费和付费应用版本

    我有一个应用程序 我打算将其作为具有部分全部功能的免费 精简版 版本和具有高级功能的付费完整版本发布 现在 通过在应用程序内购买免费应用程序 我正在考虑走这条路 能够根据需要解锁功能 我不是在谈论过期的试用版 基本上 我希望人们能够试用该应
  • 创建未知类型的数组

    我有一个对象 我必须验证该问题的值 对象的一些属性是自定义对象的数组 这样它将涉及到对数组的各个元素进行一些深入研究 为每个元素执行 getter 例如 AttribGrp x Object getAttribGrp x i getSome
  • 在.net中加载dll而不锁定它

    我正在执行一项任务 其中我必须加载 dll 并从中获取一些信息 例如类名等 但是当我将该 dll 加载到我的代码中时 它被锁定并且无法从源代码构建 直到我关闭加载程序 我尝试了某些解决方案 但没有一个适合我 Shadowcopy 在这种情况
  • 如何在 AngularJS 中动态更改 CSS 属性

    现在我有一个背景图像 URL 硬编码到 CSS 中 我想使用 AngularJS 中的逻辑动态选择背景图像 这是我目前拥有的 HTML div class offer detail image div div CSS offer detai
  • IPython Notebook 错误:加载笔记本时出错

    在过去的几分钟内 我无法访问任何 ipynb以前用Python3 4创建的文件 我进入包含这些文件的子目录 输入 ipython3 notebook 当我打开 新 笔记本时 出现以下错误 Unexpected error while sav
  • 服务层中的授权和用户信息(.NET 应用程序)

    我目前正在 NET 环境 n 层 中使用企业应用程序 我想知道在我的 BusinessLayer BL 中管理身份验证 授权 数据过滤的最佳方法 我们将从多个接口 ASP NET 应用程序和 Web 服务 使用该 BL 我认为我的 Serv
  • 如何使用 MouseListener 查找网格中的特定单元格

    我正在尝试创建一个由单元格组成的 10 x 10 网格的 Java 游戏 网格看起来像这样 public class Grid extends JPanel implements MouseListener public static fi
  • PHP:在mysql中的时间戳值内分割日期和时间

    我在数据库表中有一个名为 时间戳 的字段 它以以下格式存储值 YYYY MM DD HH MM SS 我想分开 然后获取变量中的日期 YYYY MM DD 以及另一个变量中的时间 HH MM SS 例子 timestamp 2012 10
  • 跨内存管理器边界传递 Delphi const 字符串参数是否安全?

    主题 我想使用字符串而不是 PChar 因为这样可以省去很多转换 但如果我这样做 procedure SomeExternalProc s string external SOMEDLL DLL 然后使用非共享内存管理器在其他一些项目中实现