标题并未完全体现问题的本质。
我有一个返回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;
答案 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);