OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 16 Апрель, 2024 11:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 06 Июнь, 2006 18:30 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Вот "склеил" код Ильи и примера по работе с Excel из Obx...
Реакция на события в workbook какя-то присутствует, т.к. в ответ на операции с отображением таблицы вываливаются трапы... Или такая "склейка" некорректна? (На закрытие документа без CtlT.Disconnect(wbe, wb) реакции нет).

Код:
NIL dereference (read)

 CtlT.OutDispatch.Invoke   [000004BBH]
   .dispIdMember   INTEGER   304
   .lcid   INTEGER   0
   .n   INTEGER   0
   .puArgErr      NIL VARPAR
   .riid   COM.GUID   {00000000-0000-0000-0000-000000000000}
   .this   CtlT.OutDispatch   [0103F0B0H]


Код:
MODULE EventsExcel;

   IMPORT
      CtlT, CtlExcel := CtlExcel9, Dates, Views, Containers,
      OleViews, TextModels, TextViews, TextMappers, StdLog, WinApi;
      
   TYPE
      WorkbookEvents = POINTER TO RECORD (CtlExcel.WorkbookEvents) END;
      
   VAR
      wbe: WorkbookEvents;
      
   PROCEDURE (this: WorkbookEvents) SheetChange (Sh: CtlT.Object; Target: CtlExcel.Range);    BEGIN
      StdLog.String("Sheet was changed. Col: "); StdLog.Int(Target.Column());
      StdLog.String("Row: "); StdLog.Int(Target.Row()); StdLog.Ln;
   END SheetChange;
   
   PROCEDURE (this: WorkbookEvents) Activate;
   BEGIN
      StdLog.String("Activate");  StdLog.Ln;
   END Activate;
   
   PROCEDURE (this: WorkbookEvents) AddinInstall;
   END AddinInstall;
   
   PROCEDURE (this: WorkbookEvents) AddinUninstall;
   END AddinUninstall;
       
   PROCEDURE (this: WorkbookEvents) BeforeClose (VAR Cancel: BOOLEAN);
   END BeforeClose;
       
   PROCEDURE (this: WorkbookEvents) BeforePrint (VAR Cancel: BOOLEAN);
   END BeforePrint;
   
   PROCEDURE (this: WorkbookEvents) BeforeSave (SaveAsUI: BOOLEAN; VAR Cancel: BOOLEAN);
   END BeforeSave;

   PROCEDURE (this: WorkbookEvents) Deactivate;
   END Deactivate;
   
   PROCEDURE (this: WorkbookEvents) NewSheet (Sh: CtlT.Object);
   END NewSheet;
   
   PROCEDURE (this: WorkbookEvents) Open;
   END Open;

   PROCEDURE (this: WorkbookEvents) SheetActivate (Sh: CtlT.Object);
   END SheetActivate;

   PROCEDURE (this: WorkbookEvents) SheetBeforeDoubleClick (Sh: CtlT.Object; Target: CtlExcel.Range; VAR Cancel: BOOLEAN);
   END SheetBeforeDoubleClick;

   PROCEDURE (this: WorkbookEvents) SheetBeforeRightClick (Sh: CtlT.Object; Target: CtlExcel.Range; VAR Cancel: BOOLEAN);
   END SheetBeforeRightClick;

   PROCEDURE (this: WorkbookEvents) SheetCalculate (Sh: CtlT.Object);
   END SheetCalculate;

   PROCEDURE (this: WorkbookEvents) SheetDeactivate (Sh: CtlT.Object);
   END SheetDeactivate;

   PROCEDURE (this: WorkbookEvents) SheetFollowHyperlink (Sh: CtlT.Object; Target: CtlExcel.Hyperlink);
   END SheetFollowHyperlink;

   PROCEDURE (this: WorkbookEvents) SheetSelectionChange (Sh: CtlT.Object; Target: CtlExcel.Range);
   END SheetSelectionChange;

   PROCEDURE (this: WorkbookEvents) WindowActivate (Wn: CtlExcel.Window);
   END WindowActivate;

   PROCEDURE (this: WorkbookEvents) WindowDeactivate (Wn: CtlExcel.Window);
   END WindowDeactivate;

   PROCEDURE (this: WorkbookEvents) WindowResize (Wn: CtlExcel.Window);
   END WindowResize;

   
   PROCEDURE ShowExcel*;
      VAR ws: CtlExcel.Worksheet; wb: CtlExcel.Workbook; 
         range: CtlExcel.Range;
         a: ARRAY 3 OF INTEGER;
         d: Dates.Date; t: Dates.Time;
         date: CtlT.OleDate; (* = REAL *)
         cy: CtlT.OleCy;  (* = LONGINT *)
         v: Views.View;
         text: TextModels.Model; out: TextMappers.Formatter;
   BEGIN
      v := OleViews.NewObjectView("Excel.Sheet");
      IF v # NIL THEN
         (* in excel 8.0 Excel.Sheet is a workbook object ! *)
         wb := CtlExcel.This_Workbook(OleViews.AutoObject(v));
         ws := CtlExcel.This_Worksheet(wb.Worksheets().Item(CtlT.Int(1)));
         
         
         range := ws.Range(CtlT.Str("A1"), NIL);
         range.PUTValue(CtlT.Str("Hello World"));
         range.PUTColumnWidth(CtlT.Int(12));   (* unit = width of "0" in standard font *)
         ws.Range(CtlT.Str("B1"), NIL).PUTValue(CtlT.Int(13));
                  
         text := TextModels.dir.New();
         out.ConnectTo(text);
         out.WriteString("Excel Automation Example");
         out.WriteLn; out.WriteLn; out.WriteLn;
         out.WriteTab; out.WriteTab; out.WriteView(v);
         out.WriteLn; out.WriteLn; out.WriteLn;
         Views.OpenView(TextViews.dir.New(text));
         
         
         (* == КОННЕКТ ==*)
      
         NEW(wbe);
         CtlT.Connect(wbe, wb) ;   
      
         (* == КОННЕКТ ==*)
            
      ELSE
         StdLog.String("cannot open excel object"); StdLog.Ln
      END
   END ShowExcel;

    
   
   
END EventsExcel.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 06 Июнь, 2006 19:05 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Вячеслав Бойко писал(а):
На закрытие документа без CtlT.Disconnect(wbe, wb) реакции нет

Реакция есть. Если не вызвать CtlT.Disconnect(wbe, wb), то при следующем старте ShowExcel сразу трап.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 06 Июнь, 2006 21:52 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вячеслав, при работе с OLE-объектом могут быть нюансы. Тут (формально) лучше использовать Excel.AppEvents и подключать вызовом OleViews.Connect(appEv, view) / Disconnect. Однако обрабатываться события все равно не обрабатываются. Я уже ничего посоветовать не могу, у меня практика работы с COM небольшая. А с офисом - и того меньше. Вариантом было бы посмотреть, как реализованы в Дельфе компоненты для работы с Офисом, но не уверен, что там есть исходные коды. Впрочем, я сейчас гляну еще одну книжку по COM/автоматизации...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 07 Июнь, 2006 09:36 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Странно, у меня события обрабатываются. Сделал wb переменной модуля, а не процедуры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 07 Июнь, 2006 10:53 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
GUEST писал(а):
Странно, у меня события обрабатываются. Сделал wb переменной модуля, а не процедуры.
:shock:
А какая у Вас версия Офиса? Исходники можно глянуть? Я делал wb переменной модуля, но ничего не менялось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 07 Июнь, 2006 11:12 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Илья Ермаков писал(а):
Впрочем, я сейчас гляну еще одну книжку по COM/автоматизации...

Спасибо за Вашу помощь!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 07 Июнь, 2006 16:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вячеслав Бойко писал(а):
А какая у Вас версия Офиса?

Да, от версии это может зависеть. Только не от самой версии, а от сочетания версий Офиса и системы. У меня, например, Офис 2003 работает на Windows 2000, и это может сказываться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 07 Июнь, 2006 17:22 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Илья Ермаков писал(а):
Вариантом было бы посмотреть, как реализованы в Дельфе компоненты для работы с Офисом, но не уверен, что там есть исходные коды...

Исходников в Дельфе нет. Но в Дельфе все прекрасно работает. Думаю, что от версии Excel или ОС зависимости нет. На WorkbookEvents в Дельфе реакции нет, обрабытываются только события AppEvents.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 07 Июнь, 2006 17:26 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
2000-ый. Однако толку от того, что они обрабатываются не много.
Код:
IF pDispParams.cNamedArgs # 0 THEN RETURN 80020007H (* DISP_E_NONAMEDARGS *) END;
, а pDispParams.cNamedArgs=2 увы. Удалось найти примеры с правильно сформированными параметрами?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 07 Июнь, 2006 18:26 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Вячеслав Бойко писал(а):
Исходников в Дельфе нет

Прошу прощения! Исходники есть. ExcelXP(2000,97).pas в директории <Delphi>\Ocx\Servers\


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 12 Июнь, 2006 17:54 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Я все еще пытаюсь победить события в Excel :)
Илья Ермаков писал(а):
А вот пример прямой работы через COM. Однако ничего не меняется...

Код:
   
   PROCEDURE ConnectEvents* ;
      VAR res: COM.RESULT;
   BEGIN
      (* Регистрируем приемник событий, который реализует
         интерфейс  с GUID ["00024413-0000-0000-C000-000000000046"]
         При этом наш класс получает уникальный идентификатор
         cookie, который  нужно сохранить, чтобы иметь возможность отключиться от источника
         событий *)
      NEW(ape);
      res := cp.Advise(ape.disp, cookie)
   END ConnectEvents;


В этой процедуре res # 0 (res = RPC_E_SERVERFAULT)! Т.е. клиентский интерфейс обработчика событий на сервере не регистрируется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 09 Октябрь, 2006 02:10 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Пробовал работать с Explorer-ом. Сделал модуль CtlSHDocVw для Microsoft Internet Controls при помощи DevComInterfaceGen.
Код:
MODULE TestWeb;

   IMPORT
      Web := CtlSHDocVw, CtlT, StdLog;

   TYPE
      BrowserEvents = POINTER TO RECORD (Web.DWebBrowserEvents2)
      END;

   VAR
      w: Web.WebBrowser;
      wEvents: BrowserEvents;

   PROCEDURE (this: BrowserEvents) StatusTextChange* (Text: ARRAY OF CHAR);
   BEGIN
      StdLog.String("Statusbar text changed."); StdLog.Ln;
   END StatusTextChange;

   PROCEDURE (this: BrowserEvents) ProgressChange* (Progress: INTEGER; ProgressMax: INTEGER), EMPTY;
(* и т. д. - все остальные методы "обработчики событий" определены пустыми *)

   PROCEDURE Do*;
   BEGIN
      w.PUTVisible(TRUE);
      w.PUTTheaterMode(TRUE);
      w.Navigate("http://www.blackbox.metasystems.ru/", NIL, NIL, NIL, NIL);
   END Do;

   PROCEDURE T1*;
   BEGIN
      w := Web.NewInternetExplorer();
      NEW(wEvents);
      CtlT.Connect(wEvents, w)
   END T1;

END TestWeb.

При выполнении TestWeb.Do события сыпятся как из рога изобилия. Однако, видно это было не в логе, куда выводились тестовые сообщения, а по куче трэпов, которые сыпались вместе с событиями при попытке вызова обработчиков:
Вячеслав Бойко писал(а):
Вот "склеил" код Ильи и примера по работе с Excel из Obx...
Реакция на события в workbook какя-то присутствует, т.к. в ответ на операции с отображением таблицы вываливаются трапы...

Проблема оказалась в модуле CtlT:
Код:
   TYPE
      Variant* = WinOleAut.VARIANT;
      ParList* = ARRAY [untagged] OF Variant;
   ...   
   PROCEDURE (obj: OutObject) Invoke* (id, n: INTEGER; VAR par: ParList; VAR ret: Variant), NEW, ABSTRACT;
   ...
   PROCEDURE (this: OutDispatch) Invoke (dispIdMember: WinOleAut.DISPID; IN riid: COM.GUID; lcid: WinOle.LCID;
                                       wFlags: SHORTINT; VAR [nil] pDispParams: WinOleAut.DISPPARAMS;
                                       OUT [nil] pVarResult: WinOleAut.VARIANT;
                                       OUT [nil] pExcepInfo: WinOleAut.EXCEPINFO;
                                       OUT [nil] puArgErr: INTEGER): COM.RESULT;
      VAR n: INTEGER;
   BEGIN
      ...
      this.obj.Invoke(dispIdMember, n, pDispParams.rgvarg^, pVarResult);
      RETURN 0
   END Invoke;

В предпоследнем операторе вызвается Invoke из "потомка" OutObject, который, как мы видим не допускает NIL-ссылки в VAR par: ParList; VAR ret: Variant. Однако, NIL там вполне легален. Во-первых, pDispParams.rgvarg = NIL, если pDispParams.cArgs = 0. Во-вторых, OUT [nil] pVarResult: WinOleAut.VARIANT. Т. е. OutObject.Invoke д. б. определена так (что решает проблему необоснованных трэпов):
Код:
   PROCEDURE (obj: OutObject) Invoke* (id, n: INTEGER; VAR [nil] par: ParList; VAR [nil] ret: Variant), NEW, ABSTRACT;

Однако, столкнулся с еще одним трэпом (модуль CtlSHDocVw):
Код:
   PROCEDURE (this: DWebBrowserEvents2) Invoke* (id, n: INTEGER; VAR par: CtlT.ParList; VAR ret: CtlT.Variant);
   BEGIN
      CASE id OF
...
      | 270: ASSERT(n = 1, 11); this.FileDownload(CtlC.VarRefBool(par[0])[0]); CtlC.RetBool(par[0])
...
      END
   END Invoke;

Смотрел документацию в Visual Studio .NET. Событие FileDownload имеет действительно один аргумент. Однако присылаются два. Первый - ссылка на Bool, второй - просто Bool. Остается подозревать M$ Explorer в неправильном формировании параметров... Пришлось ослаблять условие: ASSERT(n >= 1, 11).
GUEST писал(а):
...а pDispParams.cNamedArgs=2 увы. Удалось найти примеры с правильно сформированными параметрами?
По этому поводу считаю, что в BB не поддерживается автоматическая работа с "такими" параметрами. Поэтому они просто запрещены... Но это только мое предположение (детально не разбирался).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 09 Октябрь, 2006 10:00 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Остается подозревать M$ Explorer в неправильном формировании параметров... Пришлось ослаблять условие: ASSERT(n >= 1, 11).


На самом деле ASSERT'у там просто не место. Поскольку Explorer является "внешним миром" по отношению к BB, то бессмысленно пытаться диктовать ему какие-то условия в виде ассеортов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 09 Октябрь, 2006 13:11 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Vlad писал(а):
Евгений Темиргалеев писал(а):
Остается подозревать M$ Explorer в неправильном формировании параметров... Пришлось ослаблять условие: ASSERT(n >= 1, 11).


На самом деле ASSERT'у там просто не место. Поскольку Explorer является "внешним миром" по отношению к BB, то бессмысленно пытаться диктовать ему какие-то условия в виде ассеортов.
Однако, именно моему приложению надо обрабатывать события из этого "внешнего мира". И я делаю все по правилам этого внешнего мира. ASSERT гарантирует, что моя программа вместо глюков просто остановится, если внешний мир вдруг поведет себя не по правилам. Лично я предпочту остановку вместо разбивания головы об стену, например.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 09 Октябрь, 2006 13:20 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Код:
   PROCEDURE (this: OutDispatch) Invoke (dispIdMember: WinOleAut.DISPID; IN riid: COM.GUID; ...): COM.RESULT;
      VAR n: INTEGER;
   BEGIN
   .....
      IF pDispParams.cArgs # 0 THEN ASSERT(pDispParams.rgvarg # NIL, 11) END; (* *** *)
      this.obj.Invoke(dispIdMember, n, pDispParams.rgvarg^, pVarResult);
      RETURN 0
   END Invoke;

Кстати, я бы подстарховался вот-так (***). Если вдруг что-то во внешнем мире забудет сформировать массив с параметрами, или припишет параметры там, где их быть не должно. Тогда ошибку не придется ловить по остальным модулям, где реализованы Invoke для конкретных интерфейсов.

Сразу добавлю: т. к. этот мир ВНЕШНИЙ, я не могу делать никаких предположений о том, что там "все ОК", поэтому никакие проверки не повредят.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 09 Октябрь, 2006 13:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Однако, именно моему приложению надо обрабатывать события из этого "внешнего мира". И я делаю все по правилам этого внешнего мира.


Неправда. Внешний мир ничего не знает об ASSERT в BB. В данном случае правила внешнего мира - это только лишь код ошибки в COM.RESULT. Если внешний мир неправ - ты можешь ему об этом сообщить в виде этого кода ошибки. А вот если что-то неправильно во внутренностях BB - тогда это ASSERT.

Евгений Темиргалеев писал(а):
ASSERT гарантирует, что моя программа вместо глюков просто остановится, если внешний мир вдруг поведет себя не по правилам. Лично я предпочту остановку вместо разбивания головы об стену, например.


А никто и не говорит о разбивании головы или об отсутствии проверок. Я говорю о неуместности конкретно ассерта конкретно в данном месте, потому что "внешнему миру" этот ассерт ни о чем не говорит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 09 Октябрь, 2006 20:06 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Vlad писал(а):
А никто и не говорит о разбивании головы или об отсутствии проверок. Я говорю о неуместности конкретно ассерта конкретно в данном месте, потому что "внешнему миру" этот ассерт ни о чем не говорит.
Задача этого ассерта не сообщить "миру" об ошибке, а показать мне, что Explorer не правильно формирует параметры при вызове обработчика. Так я могу принять какие-то меры.
Vlad писал(а):
А вот если что-то неправильно во внутренностях BB - тогда это ASSERT.
Проверки ASSERT предназначны для нераспространения ошибок за границы модуля. Не зависимо от того, как они в этот модуль попали: изнутри или извне.

Кстати, как бы при помощи COM.RESULT мне сообщить Explorer-у об ошибках в его коде? Я могу ошибаться, но, как мне кажется, COM.RESULT тут не помошник...

И еще немного про Explorer и события. В качестве дополнения по вопросу о версионности в COM.

Если мне не изменяет память, про COM я читал, что после опубликования интерфейса, менять его нельзя. Можно делать "расширенный" новый интерфейс. В той документации по DWebBrowserEvents2, что есть у меня (уже, правда, устаревшей), в интерфейсе отсутствует событие NewWindow3, которое (!) оказалось в этом интерфейсе в библиотеке типа.

Плюс, нарвался на трэп "invalid CASE" в методе DWebBrowserEvents2.Invoke из-за недопустимого DISPID. Тут, как я понимаю, Explorer пытается вызвать обработчик события, который отсутствует не только в старой документации по DWebBrowserEvents2, но и в библиотеке типа :D Наверно у меня она тоже устарела...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 09 Октябрь, 2006 22:55 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Vlad писал(а):
если что-то неправильно во внутренностях BB - тогда это ASSERT.


И это тоже, но не только это.

Знаете что такое precondition violated?

ASSERT в Blackbox, среди прочих своих функций выполняет ещё и, скажем, то же самое что System.ArgumentException в .Net.

System.ArgumentException точно так же кидается во внешний мир как и Blackbox-овский ASSERT.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Октябрь, 2006 15:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Задача этого ассерта не сообщить "миру" об ошибке, а показать мне, что Explorer не правильно формирует параметры при вызове обработчика. Так я могу принять какие-то меры.


Для этого есть более цивилизованные методы. Например логгинг. Но даже если ты просто хочешь аварийно завершить приложение в случае такой ошибки (хотя конкретно в случае DLL смысла в этом очень мало) - это не ASSERT, а аварийное завершение приложения из-за ошибки во внешнем мире. Можешь завести какой-нибудь OUTER_ARGUMENT_ASSERT, чтобы отличать одну ситуацию от другой, потому что в общем случае реакция твоего приложения на такие ситуации может отличаться.

Евгений Темиргалеев писал(а):
Кстати, как бы при помощи COM.RESULT мне сообщить Explorer-у об ошибках в его коде? Я могу ошибаться, но, как мне кажется, COM.RESULT тут не помошник...


Например, ты можешь вернуть E_INVALIDARG. Вряд-ли Explorer осмысленно отреагирует на такое, но все равно это лучше, чем если Explorer будет ловить бессмысленный Access Violation, вызванный твоим ASSERT'ом.

Евгений Темиргалеев писал(а):
И еще немного про Explorer и события.


Прокомментровать никак не могу, никогда не писал серьезные расширения к Explorer'у.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Октябрь, 2006 15:58 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
System.ArgumentException точно так же кидается во внешний мир как и Blackbox-овский ASSERT.


Кидается, грубо говоря, в сишную DLL, которая ловит его как обезличенный SEH? А глубинный смысл?

P.S. На некоторых платформах, например на Mac OS X, попытка что-то "бросить" во внешний мир (систему), заканчивается завершеним приложения, которое попыталось это сделать. В случае расширения какого-то компонента системы (аналога Explorer'а) - смысла в этом я не вижу никакого.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB