尝试 return PChar 或 OleVariant 用于 UDF 时编译错误

Compile Error when trying to return PChar or OleVariant for UDF

标题没有抓住问题的本质。

我有一个 UDF 函数,它 return 是一个 PChar。

function AccountDescription(sAccountId: PChar) : PChar; stdcall;

这工作正常,但我意识到如果找不到 accountId,我想 return#N/A。

我发现了 CVErr(xlErrNA) 并将签名更改为 return OleVariant。 但现在我收到 [Error] 不兼容的类型:'OleVariant' 和 'PAnsiChar'.

我找不到任何关于如何解决这个问题的信息,所以我认为我对问题的理解一定是不正确的。

我尝试只传递一个字符串,该字符串已编译但产生了 "Invalid variant type" 的运行时错误。

完整代码为:

function AccountDescription(sAccountId: PChar): OleVariant; stdcall;
var
  strResult: string;
  strPChar : PChar;
begin

    try
        strResult:= repo.GetAccount(sAccountId).Description;
        strPChar := strAlloc(length(strResult)+1) ;
        StrPCopy(strPChar, strResult) ;
        Result := strPChar;
    except
      Result := CVErr(xlErrNA);
    end;

end;

注意:excel 负责破坏字符串还是我的清理工作?我应该创建一个副本还是应该 returning 一个指向现有字符串的指针。输入后我觉得我应该 returning 一个指针。

更新: 删除了示例中一些不相关的代码。

正在使用:

function AccountDescription(sAccountId: PChar): OleVariant; stdcall;
var
  strResult: string;
begin

    try
        Result := PChar(repo.GetAccount(sAccountId).Description);            
    except
      Result := CVErr(xlErrNA);
    end;

end;

您不需要 PChar 转换,您可以将 String 直接分配给 OleVariant(它会被 RTL 转换为 BSTR接收器将在使用完成后释放):

Result := repo.GetAccount(sAccountId).Description;     

至于报错,你的Delphi代码里有可行的CVErr()函数吗?在 VB、CVErr() returns 中 Error 类型的 Variant(Delphi 中的 varError)包含错误代码(xlErrNA 是 2042)。 Delphi 有一个用于相同目的的 VarAsError() 函数:

Result := VarAsError(2042);