COM 异常 "Bad Variable Type" Domino GetDocumentByKey 方法调用 Delphi 错误
COM Exception "Bad Variable Type" Error in Delphi Call of Domino GetDocumentByKey Method
我有一个遗留 Delphi 2 应用程序,我需要将其从通过 OLE 自动化与 Notes 通信转换为通过 COM 早期绑定进行通信。我正在使用 Delphi 7,因为代码库很大,我想避免在 Delphi.
的最新版本中处理 Unicode 支持的工作
基本原理是有效的:程序打开数据库,然后查看并使用 NotesView.GetDocumentByKey 方法搜索特定文档。当第一个参数是转换为 OleVariant 的单个字符串时,GetDocumentByKey 调用有效,如下所示(打开数据库和视图未显示)。
var
Key: OleVariant;
const ExactMatch: WordBool = True;
begin
Key := 'AKeyValue';
Doc := View.GetDocumentByKey(Key, ExactMatch);
bad variable type 错误,当第一个参数是variant array 时,需要根据多列搜索视图,如下所示。
var
TwoKeysV: OleVariant;
const ExactMatch: WordBool = True;
begin
TwoKeysV := VarArrayCreate([0, 1], varOleStr);
TwoKeysV[0]:= WideString('Key1');
TwoKeysV[1]:= WideString('Key2');
Doc := View.GetDocumentByKey(TwoKeysV, ExactMatch);
我对这两个键赋值语句尝试了多种变体,但均未成功。例如,仅在没有转换的情况下分配键字符串仍然会产生错误的变量类型,并且使用 StringToOleString 函数会被编译器拒绝为无效分配(PWideChar 到 Variant)。
我无法测试这个,所以我不确定它是否有效。
HELP:如果在COM下使用该方法,keyArray参数为数组,必须定义为Variant类型的数组
因此您需要传递:Variant 类型的数组
基于How to use variant arrays in Delphi.
注意: 代码由 Keeloid 编辑以匹配通过将密钥字符串转换为 WideString 的代码。
var
TwoKeysV: OleVariant;
const ExactMatch: WordBool = True;
begin
TwoKeysV := VarArrayCreate([0, 1], varVariant);
TwoKeysV[0]:= WideString('Key1'); {WideString = varOleStr}
TwoKeysV[1]:= WideString('Key2');
Doc := View.GetDocumentByKey(TwoKeysV, ExactMatch);
我有一个遗留 Delphi 2 应用程序,我需要将其从通过 OLE 自动化与 Notes 通信转换为通过 COM 早期绑定进行通信。我正在使用 Delphi 7,因为代码库很大,我想避免在 Delphi.
的最新版本中处理 Unicode 支持的工作基本原理是有效的:程序打开数据库,然后查看并使用 NotesView.GetDocumentByKey 方法搜索特定文档。当第一个参数是转换为 OleVariant 的单个字符串时,GetDocumentByKey 调用有效,如下所示(打开数据库和视图未显示)。
var
Key: OleVariant;
const ExactMatch: WordBool = True;
begin
Key := 'AKeyValue';
Doc := View.GetDocumentByKey(Key, ExactMatch);
bad variable type 错误,当第一个参数是variant array 时,需要根据多列搜索视图,如下所示。
var
TwoKeysV: OleVariant;
const ExactMatch: WordBool = True;
begin
TwoKeysV := VarArrayCreate([0, 1], varOleStr);
TwoKeysV[0]:= WideString('Key1');
TwoKeysV[1]:= WideString('Key2');
Doc := View.GetDocumentByKey(TwoKeysV, ExactMatch);
我对这两个键赋值语句尝试了多种变体,但均未成功。例如,仅在没有转换的情况下分配键字符串仍然会产生错误的变量类型,并且使用 StringToOleString 函数会被编译器拒绝为无效分配(PWideChar 到 Variant)。
我无法测试这个,所以我不确定它是否有效。
HELP:如果在COM下使用该方法,keyArray参数为数组,必须定义为Variant类型的数组
因此您需要传递:Variant 类型的数组
基于How to use variant arrays in Delphi.
注意: 代码由 Keeloid 编辑以匹配通过将密钥字符串转换为 WideString 的代码。
var
TwoKeysV: OleVariant;
const ExactMatch: WordBool = True;
begin
TwoKeysV := VarArrayCreate([0, 1], varVariant);
TwoKeysV[0]:= WideString('Key1'); {WideString = varOleStr}
TwoKeysV[1]:= WideString('Key2');
Doc := View.GetDocumentByKey(TwoKeysV, ExactMatch);