COM +功能参数的最大数量限制

时间:2011-10-11 19:17:57

标签: delphi com+ typelib

我使用Delphi Type Library来创建COM +应用程序。当我为一个函数调用创建了78个参数时,出现了访问冲突错误。我意识到COM +功能的参数数量有限制。所以之后,我必须使用一个类型化的结构/ Record来打包参数。然后传递记录而不是简单数据类型参数的数量。

你知道这个限制吗?你的建议是什么?

我做了更多测试,因为涉及到Struct / Record,然后我安装新组件并在调用时出错:

Type Library with the Record

我称之为功能:

ReturnVaule := Clients.updClient2(EmploymentApp.SessionID,
                                MyClientDetails,
                                dtLastModificationDate,
                                ClientServices,
                                ClientRequestors,
                                ClientQuestionnaires);

我收到错误:

  

“将空引用指针传递给存根”

error message

3 个答案:

答案 0 :(得分:3)

我不相信Delphi或COM +中有任何此类限制。我不确定是什么原因引起了您的错误,但我认为您需要更详细地描述您的所作所为。

无论如何,拥有那么多参数的方法是不明智的。超过4或5已经拉伸它。将这一事件作为一种温和的暗示,以更易于管理的方式重新思考您的设计。

答案 1 :(得分:3)

正如您所说,您可以使用类型库编辑器声明您的记录类型,然后修改您的方法以使用该类型的参数。

编辑:类型库编辑器中的示例屏幕截图:

enter image description here

类型库编辑器中的类型库声明生成以下代码(摘录):

type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
  ITest = interface;
  ITestDisp = dispinterface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
  Test = ITest;


// *********************************************************************//
// Declaration of structures, unions and aliases.
// *********************************************************************//
  TestRecord = packed record
    Field1: Integer;
    Field2: WideString;
    Field3: TDateTime;
  end;


// *********************************************************************//
// Interface: ITest
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {F3EA5C38-23A6-4919-A51F-31C46DB6012D}
// *********************************************************************//
  ITest = interface(IDispatch)
    ['{F3EA5C38-23A6-4919-A51F-31C46DB6012D}']
    procedure TestMethod(TestParam: TestRecord); safecall;
  end;

// *********************************************************************//
// DispIntf:  ITestDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {F3EA5C38-23A6-4919-A51F-31C46DB6012D}
// *********************************************************************//
  ITestDisp = dispinterface
    ['{F3EA5C38-23A6-4919-A51F-31C46DB6012D}']
    procedure TestMethod(TestParam: {??TestRecord}OleVariant); dispid 201;
  end;

答案 2 :(得分:0)

最后,我使用Variant参数传输大部分参数,然后将它们作为数组读出。它工作正常,但要知道数组的索引是否映射到哪个参数并不容易。