尝试 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);
标题没有抓住问题的本质。
我有一个 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);