尝试为UDF返回PChar或OleVariant时编译错误

时间:2016-12-09 16:28:16

标签: excel delphi-7

标题并未完全体现问题的本质。

我有一个返回PChar的UDF函数。

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

这工作正常但我意识到如果找不到accountId我想返回#N / A.

我发现了CVErr(xlErrNA)并更改了Signature以返回OleVariant。 但现在我收到[错误]不兼容的类型:'OleVariant'和'PAnsiChar'。

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

我尝试传递一个字符串,该字符串已编译但产生了“无效变体类型”的运行时错误。

完整的代码是:

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是否负责销毁字符串或者是我的清理工作?我应该创建副本还是应该返回指向现有字符串的指针。输入后我觉得我应该返回一个指针。

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

现在使用:

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

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

end;

1 个答案:

答案 0 :(得分:1)

您不需要PChar强制转换,您可以直接将String分配给OleVariant(它将由RTL转换为BSTR接收者然后在完成后使用它自由):

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

至于报告错误,您的Delphi代码中是否有可行的CVErr()函数?在VB中,CVErr()返回Variant类型Error(Delphi中为varError),其中包含错误代码(xlErrNA为2042)。 Delphi具有VarAsError()功能,用于同样的目的:

Result := VarAsError(2042);