如何在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
相关产品推荐
相关产品推荐

