我使用Delphi Type Library来创建COM +应用程序。当我为一个函数调用创建了78个参数时,出现了访问冲突错误。我意识到COM +功能的参数数量有限制。所以之后,我必须使用一个类型化的结构/ Record来打包参数。然后传递记录而不是简单数据类型参数的数量。
你知道这个限制吗?你的建议是什么?
我做了更多测试,因为涉及到Struct / Record,然后我安装新组件并在调用时出错:
我称之为功能:
ReturnVaule := Clients.updClient2(EmploymentApp.SessionID,
MyClientDetails,
dtLastModificationDate,
ClientServices,
ClientRequestors,
ClientQuestionnaires);
我收到错误:
“将空引用指针传递给存根”
答案 0 :(得分:3)
我不相信Delphi或COM +中有任何此类限制。我不确定是什么原因引起了您的错误,但我认为您需要更详细地描述您的所作所为。
无论如何,拥有那么多参数的方法是不明智的。超过4或5已经拉伸它。将这一事件作为一种温和的暗示,以更易于管理的方式重新思考您的设计。
答案 1 :(得分:3)
正如您所说,您可以使用类型库编辑器声明您的记录类型,然后修改您的方法以使用该类型的参数。
编辑:类型库编辑器中的示例屏幕截图:
类型库编辑器中的类型库声明生成以下代码(摘录):
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参数传输大部分参数,然后将它们作为数组读出。它工作正常,但要知道数组的索引是否映射到哪个参数并不容易。