powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / метод com-объекта не возвращает packed record
15 сообщений из 15, страница 1 из 1
метод com-объекта не возвращает packed record
    #39824957
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Создал com-объект, один из методов Item должен возвращать packed record.
при вызове метода в ранее созданном объекте
mycomobject.GetCerts.Item(1).Name

возникает ошибка
Invalid variant operation

хотя к примеру метод mycomobject.GetCerts.Count нормально работает. т.е. дело в неправильной реализации метода.

код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  TCertificate = packed record
    Name: WideString;
    StartDate: WideString;
    EndDate: WideString;
    Stamp: WideString;
  end;

...

function TCertificates.Item(i: Integer): TCertificate;
var
  C: TCertificate;
begin
  C.Name:='';
  C.StartDate:='';
  C.EndDate:='';
  C.Stamp:='';
  result:=C;
end;



что я делаю не так?
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39824983
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала покажите idl. Потом как эта tlb проимпортировалась в pas и само описание класса реализации,

Далее, это настоящий COM? Т.е. вы создаете объект через CreateComObject или простой интерфейс?
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39824998
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

я вызываю ком-объект из клиента по имени
mdlp := CreateOleObject('MyComObj.MyComObjC');
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825001
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще и OLE. Не будет так работать.

Давайте так_Vasilisk_Для начала покажите idl.а дальше будем рихтовать
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825015
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Еще и OLE. Не будет так работать.

Давайте так_Vasilisk_Для начала покажите idl.а дальше будем рихтовать

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
[
  uuid(E038B7F4-BDD3-4A74-BEAF-F97FB95262DF),
  version(1.0),
  helpstring("MyComObj Library")

]
library MyComObj
{

  importlib("stdole2.tlb");

  [
    uuid(25DBA330-010B-4776-8807-F8181BF0C362),
    version(1.0),
    helpstring("MyComObjC Object")
  ]
  coclass MyComObjC
  {
    [default] interface IMyComObjC;
  };

  [
    uuid(37F55512-75B4-44F8-A49D-4D97BA760EBB),
    version(1.0)
  ]
  coclass Certificates
  {
    [default] interface ICertificates;
  };

  [
    uuid(4C51E6A1-C632-4C05-8529-08646EABB560),
    version(1.0)
  ]
  typedef struct tagTCertificate
  {
    BSTR Name;
    BSTR StartDate;
    BSTR EndDate;
    BSTR Stamp;
  } TCertificate;

  [
    uuid(3A1292A9-FD00-4679-A0A0-4C6D4810B49C),
    version(1.0),
    helpstring("Dispatch interface for MyComObjC Object"),
    dual,
    oleautomation
  ]
   interface IMyComObjC: IDispatch
  {
    [
    id(0x000000C9)
    ]
    HRESULT _stdcall GetCerts([out, retval] ICertificates ** GetCerts /*Warning: unable to validate structure name: */ );
    [
  };

  [
    uuid(2A5BE8DA-B486-44D5-8533-238D60AB5535),
    version(1.0),
    dual,
    oleautomation
  ]
   interface ICertificates: IDispatch
  {
    [
    id(0x000000C9)
    ]
    HRESULT _stdcall Item([in] long i, [out, retval] TCertificate * Item /*Warning: unable to validate structure name: */ );
    [
    id(0x000000CA)
    ]
    HRESULT _stdcall Count([out, retval] VARIANT * Count );
  };

};
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825017
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
убрал лишнее

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
type
  TMyComObj = class(TAutoObject, IMyComObj)
  protected
    function GetCerts: ICertificates; safecall;
  end;

  TCertificates = class(TAutoObject, ICertificates)
  protected
    function Count: OleVariant; safecall;
    function Item(i: Integer): TCertificate; safecall;
  end;


...


initialization
  TAutoObjectFactory.Create(ComServer, TMyComObj, Class_MyComObjC,
    ciMultiInstance, tmApartment);
  TAutoObjectFactory.Create(ComServer, TCertificates, CLASS_Certificates,
    ciMultiInstance, tmApartment);
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825022
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_tlb.pas
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
unit MyComObj_TLB;
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. 
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
  

// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:        
//   Type Libraries     : LIBID_xxxx                                      
//   CoClasses          : CLASS_xxxx                                      
//   DISPInterfaces     : DIID_xxxx                                       
//   Non-DISP interfaces: IID_xxxx                                        
// *********************************************************************//
const
  // TypeLibrary Major and minor versions
  MyComObjMajorVersion = 1;
  MyComObjMinorVersion = 0;

  LIBID_MyComObj: TGUID = '{E038B7F4-BDD3-4A74-BEAF-F97FB95262DF}';

  IID_IMyComObjC: TGUID = '{3A1292A9-FD00-4679-A0A0-4C6D4810B49C}';
  CLASS_MyComObjC: TGUID = '{25DBA330-010B-4776-8807-F8181BF0C362}';
  IID_ICertificates: TGUID = '{2A5BE8DA-B486-44D5-8533-238D60AB5535}';
  CLASS_Certificates: TGUID = '{37F55512-75B4-44F8-A49D-4D97BA760EBB}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary                    
// *********************************************************************//
  IMyComObjC = interface;
  IMyComObjCDisp = dispinterface;
  ICertificates = interface;
  ICertificatesDisp = dispinterface;

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


// *********************************************************************//
// Declaration of structures, unions and aliases.                         
// *********************************************************************//
  TCertificate = packed record
    Name: WideString;
    StartDate: WideString;
    EndDate: WideString;
    Stamp: WideString;
  end;


// *********************************************************************//
// Interface: IMyComObjC
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {3A1292A9-FD00-4679-A0A0-4C6D4810B49C}
// *********************************************************************//
  IMyComObjC = interface(IDispatch)
    ['{3A1292A9-FD00-4679-A0A0-4C6D4810B49C}']
    function GetCerts: ICertificates; safecall;
  end;

// *********************************************************************//
// DispIntf:  IMyComObjCDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {3A1292A9-FD00-4679-A0A0-4C6D4810B49C}
// *********************************************************************//
  IMyComObjCDisp = dispinterface
    ['{3A1292A9-FD00-4679-A0A0-4C6D4810B49C}']
    function GetCerts: ICertificates; dispid 201;
  end;

// *********************************************************************//
// Interface: ICertificates
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {2A5BE8DA-B486-44D5-8533-238D60AB5535}
// *********************************************************************//
  ICertificates = interface(IDispatch)
    ['{2A5BE8DA-B486-44D5-8533-238D60AB5535}']
    function Item(i: Integer): TCertificate; safecall;
    function Count: OleVariant; safecall;
  end;

// *********************************************************************//
// DispIntf:  ICertificatesDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {2A5BE8DA-B486-44D5-8533-238D60AB5535}
// *********************************************************************//
  ICertificatesDisp = dispinterface
    ['{2A5BE8DA-B486-44D5-8533-238D60AB5535}']
    function Item(i: Integer): {??TCertificate}OleVariant; dispid 201;
    function Count: OleVariant; dispid 202;
  end;

// *********************************************************************//
// The Class CoMyComObjC provides a Create and CreateRemote method to          
// create instances of the default interface IMyComObjC exposed by              
// the CoClass MyComObjC. The functions are intended to be used by             
// clients wishing to automate the CoClass objects exposed by the         
// server of this typelibrary.                                            
// *********************************************************************//
  CoMyComObjC = class
    class function Create: IMyComObjC;
    class function CreateRemote(const MachineName: string): IMyComObjC;
  end;

// *********************************************************************//
// The Class CoCertificates provides a Create and CreateRemote method to          
// create instances of the default interface ICertificates exposed by              
// the CoClass Certificates. The functions are intended to be used by             
// clients wishing to automate the CoClass objects exposed by the         
// server of this typelibrary.                                            
// *********************************************************************//
  CoCertificates = class
    class function Create: ICertificates;
    class function CreateRemote(const MachineName: string): ICertificates;
  end;

implementation

uses ComObj;

class function CoMyComObjC.Create: IMyComObjC;
begin
  Result := CreateComObject(CLASS_MyComObjC) as IMyComObjC;
end;

class function CoMyComObjC.CreateRemote(const MachineName: string): IMyComObjC;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_MyComObjC) as IMyComObjC;
end;

class function CoCertificates.Create: ICertificates;
begin
  Result := CreateComObject(CLASS_Certificates) as ICertificates;
end;

class function CoCertificates.CreateRemote(const MachineName: string): ICertificates;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_Certificates) as ICertificates;
end;

end.
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825023
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgen29Создал com-объект, один из методов Item должен возвращать packed record.

Во-первых, использовать packed (и вообще record) в СОМ - необычно.
Во-вторых, если уж используешь - все поля записи должны быть COM-совместимыми. То есть
исключительно OleString вместо WideString.
В-третьих, Дельфийские баги не позволяют методам интерфейса возвращать что-либо кроме
HRESULT, то есть одни должны быть объявлены как safecall. То есть объявление в первом
посте не соответствует ему в последнем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825029
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovevgen29Создал com-объект, один из методов Item должен возвращать packed record.

Во-первых, использовать packed (и вообще record) в СОМ - необычно.
Во-вторых, если уж используешь - все поля записи должны быть COM-совместимыми. То есть
исключительно OleString вместо WideString.
В-третьих, Дельфийские баги не позволяют методам интерфейса возвращать что-либо кроме
HRESULT, то есть одни должны быть объявлены как safecall. То есть объявление в первом
посте не соответствует ему в последнем.


ну я создаю архитектуру объекта через пункт View->Type Library
Widestring вполне нормально обрабатывается, если я задаю его результатом функции-Метода с возвращаемым типом OleVariant;

но тут возвращаться должна packed record.
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825043
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgen29ну я создаю архитектуру объекта через пункт View->Type Library
Widestring вполне нормально обрабатывается, если я задаю его результатом функции-Метода с возвращаемым типом OleVariant;

но тут возвращаться должна packed record.так его и задавай, вот только из скриптовых языков ты потом разрулить такой результат не сможешь
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825049
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovисключительно OleString вместо WideString.WideString это настоящий BSTR
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825052
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращайте вместо записи интерфейс
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
[
  uuid(E038B7F4-BDD3-4A74-BEAF-F97FB95262DF),
  version(1.0),
  helpstring("MyComObj Library")

]
library MyComObj
{

  importlib("stdole2.tlb");

  [
    uuid(25DBA330-010B-4776-8807-F8181BF0C362),
    version(1.0),
    helpstring("MyComObjC Object")
  ]
  coclass MyComObjC
  {
    [default] interface IMyComObjC;
  };

  [
    uuid(37F55512-75B4-44F8-A49D-4D97BA760EBB),
    version(1.0)
  ]
  coclass Certificates
  {
    [default] interface ICertificates;
  };

  [
    uuid(4C51E6A1-C632-4C05-8529-08646EABB560),
    version(1.0),
    dual,
    oleautomation
  ]
  interface ICertificateInfo: IDispatch
  {
    [
      id(1),
      propget
    ]
    HRESULT Name([out, retval] BSTR * AVal);
    [
      id(1),
      propput
    ]
    HRESULT Name([in] BSTR AVal);  // Если нужен сеттер
    [
      id(2),
      propget
    ]
    HRESULT StartDate([out, retval] BSTR * AVal);  // Может, нужен тип DATE?
    [
      id(2),
      propput
    ]
    HRESULT StartDate([in] BSTR AVal);  // Если нужен сеттер
    .................
  }

  [
    uuid(3A1292A9-FD00-4679-A0A0-4C6D4810B49C),
    version(1.0),
    helpstring("Dispatch interface for MyComObjC Object"),
    dual,
    oleautomation
  ]
   interface IMyComObjC: IDispatch
  {
    [
    id(0x000000C9)
    ]
    HRESULT _stdcall GetCerts([out, retval] ICertificates ** GetCerts);
    [
  };

  [
    uuid(2A5BE8DA-B486-44D5-8533-238D60AB5535),
    version(1.0),
    dual,
    oleautomation
  ]
   interface ICertificates: IDispatch
  {
    [
    id(0x000000C9)
    ]
    HRESULT _stdcall Item([in] long i, [out, retval] ICertificate ** Item);
    [
    id(0x000000CA)
    ]
    HRESULT _stdcall Count([out, retval] VARIANT * Count );
  };
};

...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825159
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть мнение, что в IDL не указано выравнивание. Надо или в Delphi исправить на 8 (по умолчанию), или в IDL добавить pragma pack .
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39825207
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker,

да он просто пытается дуальный интерфейс создать, а они не поддерживают записи
...
Рейтинг: 0 / 0
метод com-объекта не возвращает packed record
    #39826224
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем сделал. Подключаю дополнительный модуль работы с сертификатами, где храню массив записей и в initialization его заполняю, а в finalization очищаю. Возвращаю интерфейс со свойствами, каждое из которых лезет по индексу в этот массив записей и возвращает значение нужного мне поля. В принципе, так и планировал в плане B, но думал, что дуальный интерфейс поддерживает записи. Не поддерживает )
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / метод com-объекта не возвращает packed record
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]