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);