【问题标题】:COM Exception "Bad Variable Type" Error in Delphi Call of Domino GetDocumentByKey MethodDomino GetDocumentByKey 方法的 Delphi 调用中的 COM 异常“Bad Variable Type”错误
【发布时间】:2015-11-23 21:33:11
【问题描述】:

我有一个旧版 Delphi 2 应用程序,我需要将它从通过 OLE 自动化与 Notes 通信转换为通过 COM 早期绑定进行通信。我使用的是 Delphi 7,因为代码库很大,并且我想避免在最新版本的 Delphi 中处理 Unicode 支持的工作。

基本工作正常:程序打开数据库,然后打开视图并使用 NotesView.GetDocumentByKey 方法搜索特定文档。当第一个参数是转换为 OleVariant 的单个字符串时,GetDocumentByKey 调用起作用,如下所示(打开 DB 和视图未显示)。

var
  Key: OleVariant;
const ExactMatch: WordBool = True;
begin
  Key := 'AKeyValue';
  Doc := View.GetDocumentByKey(Key, ExactMatch);

bad variable type error发生在第一个参数是一个variant数组时,需要基于多列搜索视图时,如下图所示。

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)拒绝。

【问题讨论】:

  • 在字符串的帮助数组中是您需要发送的内容,您是否尝试在 Delphi 中创建一个真正的字符串数组并将其转换为 OleVariant ? (www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.1/…) 注意这不是Help所指出的:如果这个方法在COM下使用,带有数组的keyArray参数,它必须定义为Variant类型的数组。
  • 尝试了创建键数组的想法是一个普通的 Variant 然后转换为 OleVariant 但它会产生相同的错误变量类型错误

标签: delphi com lotus-notes lotus-domino


【解决方案1】:

我无法对此进行测试,所以我不确定这是否有效。

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 OleAuto(后期绑定)的遗留代码要求数组是 varOleStr。显然,关于 COM/OLE 支持的某些内容发生了变化。
  • 上面的代码也被证明可以在 Delphi 10 Seattle 中工作。
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多