Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OLE, Stack Overflow. / 25 сообщений из 31, страница 1 из 2
14.08.2019, 20:13
    #39849468
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
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
15.08.2019, 07:01
    #39849571
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
rgreat,
ты случайно это не в методах отрисовки вызываешь?
...
Рейтинг: 0 / 0
15.08.2019, 07:39
    #39849574
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
rgreat
Код: pascal
1.
const 


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


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

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

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

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

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

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

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

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

А под отладчиком самого стека вызовов не видно?
...
Рейтинг: 0 / 0
15.08.2019, 18:59
    #39849999
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
Ну и добавить что-то типа такого
Код: 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
15.08.2019, 21:51
    #39850050
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
_Vasilisk_rgreat,

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

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

Код: 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
15.08.2019, 23:11
    #39850079
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
И да, с поточностью все хорошо.

Поток 1, зацикливаний нет.
...
Рейтинг: 0 / 0
16.08.2019, 15:18
    #39850418
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
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
16.08.2019, 15:28
    #39850422
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
А вот так - не течет.

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

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
16.08.2019, 16:28
    #39850458
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
Может быть там собака порылась в символах #0 в строке?
...
Рейтинг: 0 / 0
16.08.2019, 16:35
    #39850463
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE, Stack Overflow.
rgreatМожет быть там собака порылась в символах #0 в строке?Нет. BSTR может содержать #0

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

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


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