【问题标题】:Delphi 2010 variant to unicode problemDelphi 2010变体到unicode问题
【发布时间】:2010-03-17 14:57:47
【问题描述】:

我正在使用 Delphi 2010 中的 DLL。它导出一个接收一系列变体的过程。我希望能够采用其中一种变体,并将其转换为字符串,但我不断得到 ?????

我无法更改输入变量 - 它必须是一个变体数组。 无法更改调用 DLL 的主机应用程序。它是用 Delphi 2006 编写的。

示例 DLL 代码:

Procedure TestArr(ArrUID : array of variant); stdcall;  
var 
  i: integer;  
  s: string;
begin  
  s:= string(String(Arruid[0]));  
  showmessage(s);  
end;  

使用 D2006 我的 DLL 工作正常。我试过使用VartoStr - 不走运。当我检查VarType 时,我得到了varString。有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: delphi unicode delphi-2010 variant


    【解决方案1】:

    您的主机应用程序正在发送 AnsiString,而您的 dll 正在等待 UnicodeString
    Unicode 字符串是在 Delphi 2009 中引入的,它在 Delphi 2006 中不存在。如何修复它?尝试[未经测试]:

    Procedure TestArr(ArrUID : array of variant); stdcall;  
    var 
      i: integer;  
      s: AnsiString;
    begin  
      s:= Ansistring(VarToStr(Arruid[0]));  
      showmessage(s);  
    end;  
    

    或者可能[也未经测试]:

    Procedure TestArr(ArrUID : array of variant); stdcall;  
    var 
      i: integer;  
      s: AnsiString;
    begin  
      s:= Ansistring(AnsiString(Arruid[0]));  
      showmessage(s);  
    end;  
    

    您还可以检查是否有像VarToStr 这样接受AnsiStrings 的函数(可能在AnsiStrings 单元中?)。

    【讨论】:

    • 您不能使用 ShareMem 解决 D2006 和 D2010 之间有关 Unicode/Ansi 的问题。他们使用完全不同形式的内存管理器。
    • @Ken White 你是对的,我的错。我忘了 embarcadero 也改变了内存管理器(现在它使用 fastmm)。
    【解决方案2】:

    1/ 你是如何调用VarToStr() 函数的? VarToString(Arruid[0])?

    2/ 您的 Delphi2006 应用程序是否将 AnsiString 或 WideString 发送到 DLL ? 如果是这样,并且如果 (1) 不起作用,请尝试转换为 AnsiString 而不是 string

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2011-11-15
      相关资源
      最近更新 更多