You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LCDHype插件中返回包含空格的字符串?

解决LCDHype Delphi插件返回带空格字符串丢失的问题

问题回顾

你用Delphi给LCDHype写插件时遇到了麻烦:返回带空格的字符串时,空格莫名被移除,没法正常显示。你的示例代码是这样的:

...
implementation
...
var gReturnValue: String;

// Plugin.Foo.GetBar
function Library_GetBar(const AParameter: PScriptFunctionImplementationParameter): PWideChar; stdcall;
begin
  gReturnValue := 'This is a bar';
  result := PWideChar(gReturnValue);
end;

为啥会出现这个问题?

我帮你梳理了两个最可能的原因:

  • Delphi字符串的内存自动管理坑:Delphi的String是自动托管的,函数执行完之后,哪怕是全局变量,后续如果有其他操作覆盖或者内存被回收,你返回的PWideChar指向的内存内容就可能被破坏,空格丢失其实就是内存乱码的一种表现。
  • LCDHype插件接口的字符串要求:咱们的LCDHype插件框架对返回的字符串内存有特定要求——得是持久化分配的内存(比如用系统的COM内存分配函数),直接指向Delphi托管字符串的内存的话,框架处理的时候可能会误判,把空格当成截断标记给去掉了。

怎么解决?

给你两个靠谱的方案,按需选:

方案1:用COM内存分配(最推荐)

作为Windows应用,LCDHype完全兼容COM内存规则,用CoTaskMemAlloc分配字符串内存,框架会自动帮你释放,绝对稳:

uses
  SysUtils, ActiveX;

function Library_GetBar(const AParameter: PScriptFunctionImplementationParameter): PWideChar; stdcall;
var
  TempStr: String;
  StrByteLen: Integer;
begin
  TempStr := 'This is a bar';
  // 算上终止符,计算宽字符串需要的字节数
  StrByteLen := (Length(TempStr) + 1) * SizeOf(WideChar);
  // 分配内存
  Result := CoTaskMemAlloc(StrByteLen);
  if Assigned(Result) then
    // 把字符串复制到分配好的内存里
    StringToWideChar(TempStr, Result, StrByteLen);
end;

划重点:别手动释放这块内存,LCDHype会按照COM约定负责清理,你只管分配和复制就行。

方案2:用全局WideString(临时测试用)

如果你只是临时测试,不想改太多代码,可以把全局变量换成WideString——这是COM兼容的字符串类型,内存生命周期更长,不容易被回收:

var
  gReturnValue: WideString; // 替换原来的String

function Library_GetBar(const AParameter: PScriptFunctionImplementationParameter): PWideChar; stdcall;
begin
  gReturnValue := 'This is a bar';
  Result := PWideChar(gReturnValue);
end;

提醒:这个方案不适合正式插件,全局变量容易有线程安全问题,多实例调用的时候可能出bug。


声明:我是LCDHype的作者。

内容的提问来源于stack exchange,提问作者ViRuSTriNiTy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:57:16