powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OLE, Stack Overflow.
25 сообщений из 31, страница 1 из 2
OLE, Stack Overflow.
    #39849468
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLE сервер:
Код: pascal
1.
2.
3.
4.
function TMP_DataInt.UniMessage(ParamIn1, ParamIn2: OleVariant): OleVariant;
begin
  Result:=UniMessageHandler(ParamIn1, ParamIn2);
end;



OLE клиент:
Код: pascal
1.
2.
3.
4.
function TMBData.UniMessage(const Command: string; const Parameters: OleVariant): OleVariant;
begin
   Result:=DataInt.UniMessage(Command,Parameters); // <-- тут изредка падает, без возможности обработать ошибку.
end;


Как забороть Stack Overflow в клиенте на этой строке?
Какие причины могут быть?
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849571
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
ты случайно это не в методах отрисовки вызываешь?
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849574
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Код: pascal
1.
const 


Может стоит привести к одному описанию?
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849658
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanrgreat
Код: pascal
1.
const 


Может стоит привести к одному описанию?
Изначально без const было.
Это я уже пытался забороть stack overflow.
Не помогло.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849660
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Да, графика там может использоватся.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849663
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увеличение размера стека приводит к out of memory.

Причем передаваемые параметры не больше 100 кб суммарно.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849674
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЭто я уже пытался забороть stack overflow.
Для обеих функций const пробовал?
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849680
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Как я в type library это сделаю?
Ну и опять таки в сервере ошибки не происходит.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849935
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatkealon(Ruslan),

Да, графика там может использоватся.в проце прорисовки нельзя вызвать методы COM-объектов из других потоков (соответственно и процессов)

WM_PAINT и ряд других сообщений обрабатываются во время ожидания внешней процедуры, соответственно и может получиться рекурсивный вызов с переполнением стека
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849952
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)в проце прорисовки нельзя вызвать методы COM-объектов из других потоков (соответственно и процессов)

WM_PAINT и ряд других сообщений обрабатываются во время ожидания внешней процедуры, соответственно и может получиться рекурсивный вызов с переполнением стекаХм. Интересно.

Вроде у меня в процессе прорисовки оно не вызывается. Но гляну в эту сторону. Спасибо.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849996
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

А под отладчиком самого стека вызовов не видно?
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39849999
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и добавить что-то типа такого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function TMBData.UniMessage(const Command: string; const Parameters: OleVariant): OleVariant;
begin
  Log('Enter TMBData.UniMessage');
  Result:=DataInt.UniMessage(Command,Parameters); // <-- тут изредка падает, без возможности обработать   
  Log('Leave TMBData.UniMessage');
ошибку.
end;

и посмотреть, проблема в рекурсивном вызове TMBData.UniMessage или нет
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850050
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_rgreat,

А под отладчиком самого стека вызовов не видно?Битый он какой-то.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850077
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После всяких тестов добился что теперь стабильно утекает не стек а память.

Вызов происходит такого вида:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  Command: string;
  Buff: AnsiString;
begin
  Command:='qwerty';
  Buff:=набор байтов в 8-битной строке.
  UniMessage(Command,Buff)
end;



Код: pascal
1.
2.
3.
4.
function TMBData.UniMessage(const Command: string; const Parameters: OleVariant): OleVariant;
begin
  Result:=DataInt.UniMessage(Command,Parameters); // <-- тут
end;



Надо как-то очищать/деинициализировать OleVariant?!
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850079
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, с поточностью все хорошо.

Поток 1, зацикливаний нет.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850418
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНадо как-то очищать/деинициализировать OleVariant?!Если импорт интерфейсов правильный, а не как здесь , то не нужно. IDL описание метода покажи

Из замечаний - в OleVariant нельзя записать AnsiString и string (UnicodeString). Только WideString. Поэтому у тебя вначале происходит конвертация AnsiString -> WideString и string->WideString, а потом WideString -> OleVariant (убедится в этом можно вызвав VarType(Parameters) и получить при этом varOleStr = 8).

Т.к. все три типа являются управляемыми, то, возможно делфя забывает у кого-то уменьшить счетчик ссылок.

Попробуй сделать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  Command: string;
  Buff: AnsiString;
  Cmd: OleVariant;
  Params: OleVariant;
begin
  Command:='qwerty';
  Buff:=набор байтов в 8-битной строке.
  Cmd := Command;
  Params := Buff;
  UniMessage(Cmd, Params)
end;


Ну и версию Делфи озвучь
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850422
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот так - не течет.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function TMBData.UniMessage(const Command: string; const Parameters: OleVariant): OleVariant;
var
  Buff   : OleVariant;
begin
  Buff:=Parameters;
  Result:=DataInt.UniMessage(Command,Buff);
  Buff:=Unassigned;
end;



Мдя.
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850424
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Ну и версию Делфи озвучьXE3
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850427
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatА вот так - не течет.Давай IDL. Явный косяк импорта
rgreatXE3Сам на ней сижу и активно юзаю интерфейсы - полет нормальный
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850429
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Давай IDL.И pas описание метода интерфейса
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850430
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_rgreatНадо как-то очищать/деинициализировать OleVariant?!IDL описание метода покажи
Код: plaintext
1.
2.
    [id(0x0000010C)]
    HRESULT _stdcall UniMessage([in] VARIANT ParamIn1, [in] VARIANT ParamIn2, [out, retval] VARIANT* ParamOut);
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850431
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
    function UniMessage(ParamIn1, ParamIn2: OleVariant): OleVariant; safecall;
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850451
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не повторяется

testole.idl
Код: plaintext
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.
[
  uuid(157EF74F-0CF2-4BD2-95D2-A11B394877E0),
  version(2.0),
]
library testole
{
  importlib("stdole2.tlb");

  [
    uuid(D1C67572-8795-4746-8CD4-050F9D500709),
    version(1.0),
    oleautomation,
    dual
  ]
   interface ITestOle: IDispatch
  {
    [id(0x0000010C)]
    HRESULT _stdcall UniMessage([in] VARIANT ParamIn1, [in] VARIANT ParamIn2, [out, retval] VARIANT* ParamOut);
  };

  [
    uuid(25358394-662E-432D-BAEE-C0500262498F),
    version(1.0),
  ]
  coclass TTestOle {
    [default] interface ITestOle;
  };

};


testole_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.
[/SRC]unit testole_TLB;

// ************************************************************************ //
// WARNING                                                                    
// -------                                                                    
// The types declared in this file were generated from data read from a       
// Type Library. If this type library is explicitly or indirectly (via        
// another type library referring to this type library) re-imported, or the   
// 'Refresh' command of the Type Library Editor activated while editing the   
// Type Library, the contents of this file will be regenerated and all        
// manual modifications will be lost.                                         
// ************************************************************************ //

// $Rev: 52393 $
// File generated on 16.08.2019 15:45:34 from Type Library described below.

// ************************************************************************  //
// Type Lib: testole.tlb (1)
// LIBID: {157EF74F-0CF2-4BD2-95D2-A11B394877E0}
// LCID: 0
// Helpfile: 
// HelpString: 
// DepndLst: 
//   (1) v2.0 stdole, (C:\Windows\SysWOW64\stdole2.tlb)
// SYS_KIND: SYS_WIN32
// Cmdline:
//   "C:\Program Files (x86)\Embarcadero\RAD Studio\10.0\bin\tlibimp.exe"  -P+ -R- "testole.tlb" -Ha- -Hs- -Hr- -O- -Yc- -Pt-
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. 
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
{$ALIGN 4}

interface

uses Winapi.Windows, System.Classes, System.Variants, System.Win.StdVCL, Vcl.Graphics, Vcl.OleServer, Winapi.ActiveX;
  

// *********************************************************************//
// 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
  testoleMajorVersion = 2;
  testoleMinorVersion = 0;

  LIBID_testole: TGUID = '{157EF74F-0CF2-4BD2-95D2-A11B394877E0}';

  IID_ITestOle: TGUID = '{D1C67572-8795-4746-8CD4-050F9D500709}';
  CLASS_TTestOle: TGUID = '{25358394-662E-432D-BAEE-C0500262498F}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary                    
// *********************************************************************//
  ITestOle = interface;
  ITestOleDisp = dispinterface;

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


// *********************************************************************//
// Interface: ITestOle
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {D1C67572-8795-4746-8CD4-050F9D500709}
// *********************************************************************//
  ITestOle = interface(IDispatch)
    ['{D1C67572-8795-4746-8CD4-050F9D500709}']
    function UniMessage(ParamIn1: OleVariant; ParamIn2: OleVariant): OleVariant; safecall;
  end;

// *********************************************************************//
// DispIntf:  ITestOleDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {D1C67572-8795-4746-8CD4-050F9D500709}
// *********************************************************************//
  ITestOleDisp = dispinterface
    ['{D1C67572-8795-4746-8CD4-050F9D500709}']
    function UniMessage(ParamIn1: OleVariant; ParamIn2: OleVariant): OleVariant; dispid 268;
  end;

implementation

uses System.Win.ComObj;

end.


server.dpr
Код: 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.
library Server;

uses
  FastMM4,
  System.Win.ComServ, System.Win.ComObj,
  System.SysUtils, System.Variants,
  testole_tlb;

type
  TOleServerImpl = class(TAutoObject, ITestOle)
    function UniMessage(ParamIn1: OleVariant; ParamIn2: OleVariant): OleVariant; safecall;
  end;
  
{$R testole.tlb}

function TOleServerImpl.UniMessage(ParamIn1: OleVariant; ParamIn2: OleVariant): OleVariant; 
begin
  Result := Format(
    '%s, %s',
    [VarTypeAsText(VarType(ParamIn1)), VarTypeAsText(VarType(ParamIn2))]
  );
end;

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;
 
begin
  TAutoObjectFactory.Create(
    ComServer,
    TOleServerImpl,
    CLASS_TTestOle,
    ciMultiInstance,
    tmBoth
  );
end.


client.dpr
Код: 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.
program Client;

{$APPTYPE CONSOLE}

uses
  FastMM4,
  System.SysUtils,
  Winapi.Activex, System.Win.ComObj,
  testole_tlb;

var
  TestSrv: ITestOle;

function UniMessage(const Command: string; const Parameters: OleVariant): OleVariant;
begin
  Result:=TestSrv.UniMessage(Command,Parameters); // <-- тут
end;

procedure Call;
var
  Command: string;
  Buff: AnsiString;
begin
  Command:='qwerty';
  Buff:='1234567890';
  UniMessage(Command,Buff);
end;

procedure Test;
var
  Li: Integer;
begin
  TestSrv := CreateComObject(CLASS_TTestOle) as ITestOle;
  for Li := 0 to Round(1E+6) - 1 do
    Call;
  TestSrv := nil;
end;

begin
  Coinitialize(nil);
  Test;
  Writeln('Passed');
  Readln;
end.

...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850458
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть там собака порылась в символах #0 в строке?
...
Рейтинг: 0 / 0
OLE, Stack Overflow.
    #39850463
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatМожет быть там собака порылась в символах #0 в строке?Нет. BSTR может содержать #0

Попробуй на моем примере воспроизвести ошибку.

Исходники сервера есть? Там импорт функции такой же?
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OLE, Stack Overflow.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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