Максимальное ограничение числа параметров функции COM + - PullRequest
1 голос
/ 11 октября 2011

Я использовал библиотеку типов Delphi для создания приложения COM +.Я получил ошибку нарушения доступа, когда создал параметры номер 78 для одного вызова функции.Я понял, что есть ограничение на количество параметров для функций COM +.Поэтому после я должен использовать типизированную структуру / запись для упаковки параметров.Затем передайте запись вместо чисел параметров простого типа данных.

Знаете ли вы об этом ограничении и что вы предлагаете?

Я провел больше тестов, задействовав структуру / запись, затемустановите новый компонент и получите сообщение об ошибке:

Type Library with the Record

Я вызываю функцию:

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

и получаю ошибку:

"Пустой указатель ссылки был передан заглушке"

error message

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Как вы сказали, вы можете использовать редактор библиотек типов, чтобы объявить тип вашей записи, а затем изменить свой метод для использования параметра этого типа.

Редактировать: Пример снимка экрана из редактора библиотеки типов:

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;
3 голосов
/ 11 октября 2011

Я не верю, что в Delphi или COM + есть такое ограничение.Я не уверен, что вызвало вашу ошибку, но я думаю, что вам нужно описать, что вы сделали более подробно.Более 4 или 5 уже растягивают его.Воспринимайте этот инцидент как мягкую подсказку, чтобы переосмыслить ваш дизайн более управляемым образом.

0 голосов
/ 17 октября 2011

Наконец, я использую параметр Variant для передачи большинства параметров, а затем считываю их как массив. Он работает нормально, но нелегко узнать, какой индекс массива соответствует какому параметру.

...