Не работает IErrorLog в 1С
От: HowardLovekraft  
Дата: 09.07.10 14:35
Оценка:
Привет.

Есть 1С-addin, писанный на шарпе.
Все замечательно работает кроме одного момента — хочу перехватить .NET-исключение и передать его в 1С для того, чтобы остановить выполнение 1С-ного модуля ну и отобразить исключение в окне сообщений. Для этого использую IErrorLog, который прекрасно работает в неуправляемых addin'ах:
    [Guid("3127CA40-446E-11CE-8135-00AA004BB851")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IErrorLog
    {
        void AddError(String pszPropName, System.Runtime.InteropServices.ComTypes.EXCEPINFO pExepInfo);
    }

        public void Init(Object connection)
        {
            Connection = connection;
            ErrorLog = (IErrorLog)Connection;
        }

        protected void PostException(Exception ex)
        {
            if (ErrorLog == null)
                return;

            var info = new EXCEPINFO
            {
                wCode = 1006,
                bstrDescription = String.Format(_addinError, ex.GetType(), ex.Message, ex.StackTrace),
                bstrSource = AddInName,
                scode = 1
            };

            ErrorLog.AddError("", info);
        }

На вызове ErrorLog.AddError получаю AccessViolation, 1С это спокойно проглатывает и радостно работает дальше.
Более того, если просто выбросить в .NET-коде необработанное исключение, 1С пофигу, хотя даже б-гмерзкий Delphi в этом случае падает с OLE-шным исключением.

Проверял на версиях платформы 7.7 и 8.2.
Перепробовал все распостранненые в интернетах примеры 1С-ных addin'ов, определений IErrorLog и структуры EXCEPINFO. Результат один и тот же.
На GDN'не нашелся один счастливец, столкнувшийся с этой проблемой, решивший ее и запостивший исходник с решением на сервер, откуда его уже благополучно удалили.

Какие есть идеи?
Re: Не работает IErrorLog в 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.07.10 15:10
Оценка: 6 (1) +1
Здравствуйте, HowardLovekraft, Вы писали:
HL>[c#]
HL> [Guid("3127CA40-446E-11CE-8135-00AA004BB851")]
HL> [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
HL> public interface IErrorLog
HL> {
HL> void AddError(String pszPropName,ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExepInfo);
HL> }

может ref добавить
и солнце б утром не вставало, когда бы не было меня
Re: Не работает IErrorLog в 1С
От: Jolly Roger  
Дата: 10.07.10 04:49
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL> public void Init(Object connection)

HL> {
HL> Connection = connection;
HL> ErrorLog = (IErrorLog)Connection;
HL> }

А прямое привидение типов выливается в вызов QueryInterface ? Может надо Marshal.QueryInterface ?
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re[2]: Не работает IErrorLog в 1С
От: HowardLovekraft  
Дата: 12.07.10 06:15
Оценка: 5 (1)
Здравствуйте, Jolly Roger, Вы писали:

JR>А прямое привидение типов выливается в вызов QueryInterface ? Может надо Marshal.QueryInterface ?

Отсюда:

Использование QueryInterface для COM-объекта аналогично выполнению операции приведения в управляемом коде.

Re[3]: Не работает IErrorLog в 1С
От: Jolly Roger  
Дата: 12.07.10 07:02
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Отсюда:

HL>

HL>Использование QueryInterface для COM-объекта аналогично выполнению операции приведения в управляемом коде.


Эта фраза сформулировано довольно неоднозначно, и понять её можно по-разному. Впрочем, коль Вы говорите, что вызывает, значит так оно и есть.
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re[2]: Не работает IErrorLog в 1С
От: HowardLovekraft  
Дата: 12.07.10 07:02
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>может ref добавить

Именно, спасибо!

Более того, на pinvoke, куда я почему-то не добрался, определение IErrorLog с ref, т.е. рабочее.

А вот как это объяснить?
1) IErrorLog.AddError Method (Microsoft.Office.Interop.InfoPath):
void AddError (
    [InAttribute] string pszPropName,
    [InAttribute] ref EXCEPINFO pExcepInfo
)

Тут вроде все хорошо.

2) IErrorLog.AddError Method (Microsoft.VisualStudio.OLE.Interop):
void AddError (
    [InAttribute] string pszPropName,
    [InAttribute] EXCEPINFO[] pExcepInfo
)

На такой вариант 1С честно говорит E_INVALIDARG.

3) interface IErrorLog (WPF/XNA SilverlightViewport):
[PreserveSig]
        int AddError([In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName, 
                      [In, MarshalAs(UnmanagedType.Struct)] System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo);

Эти парни, IMHO, круче всех. У них AddError вместо void стал int.
Падаем с AV.

4) Ну и наконец, раскрутившие себя в поисковиках (запрос "внешнаяя компонента для 1с на C#") и загадившие рунет (т.к. по их шаблону пишут компоненты много страждущих, видимо, потому что первый находится в поиске) оригиналы из mista.ru:
    [Guid("3127CA40-446E-11CE-8135-00AA004BB851"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IErrorLog
    {
        void AddError(string pszPropName, ExcepInfo pExepInfo);
    }
    //----------------------------------------------------------
    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode, Pack=8)]
    public struct ExcepInfo
    {
        public short wCode;
        public short wReserved;
        [MarshalAs(UnmanagedType.BStr)] public string bstrSource;
        [MarshalAs(UnmanagedType.BStr)] public string bstrDescription;
        [MarshalAs(UnmanagedType.BStr)] public string bstrHelpFile;
        public int dwHelpContext;
        public System.IntPtr pvReserved;
        public System.IntPtr pfnDereffered;
        public int scode;
    }

Даже не поленились написать свое определение ExcepInfo. Результат — Падаем с AV.
Я понимаю, что вопрос "на кой черт выкладывать нерабочие исходники" в данном случае — риторический, но тем не менее... cтатья раскручена в поисковиках . Кстати, я не VB-шник, любопытно, вот этот их код работает (из этой же статьи):
                Dim ei As ExcepInfo = New ExcepInfo()
                ei.wCode = 1004 '//Вид пиктограммы
                ei.scode = 1 '//Генерируем ошибку времени исполнения
                ei.bstrDescription = s '//Сообщение
                ei.bstrSource = c_AddinName

                V7Data.ErrorLog.AddError(c_AddinName, ei)


Напоминаю, что речь идет о стандартном для COM интерфейсе. И все эти определения используют один и тот же IID.
Ппц.
Re[3]: Не работает IErrorLog в 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.07.10 07:15
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Даже не поленились написать свое определение ExcepInfo. Результат — Падаем с AV.

HL>Я понимаю, что вопрос "на кой черт выкладывать нерабочие исходники" в данном случае — риторический, но тем не менее... cтатья раскручена в поисковиках . Кстати, я не VB-шник, любопытно, вот этот их код работает (из этой же статьи):
Я тоже, но в VB как кстати и в 1С параметры передаются по ссылке. В Delphi кстати для вызовов методов через вариант параметры тоже передаются по ссылке.
HL>
HL>                Dim ei As ExcepInfo = New ExcepInfo()
HL>                ei.wCode = 1004 '//Вид пиктограммы
HL>                ei.scode = 1 '//Генерируем ошибку времени исполнения
HL>                ei.bstrDescription = s '//Сообщение
HL>                ei.bstrSource = c_AddinName

HL>                V7Data.ErrorLog.AddError(c_AddinName, ei)
HL>


HL>Напоминаю, что речь идет о стандартном для COM интерфейсе. И все эти определения используют один и тот же IID.

HL>Ппц.
и солнце б утром не вставало, когда бы не было меня
Re[3]: Не работает IErrorLog в 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.07.10 08:01
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

Кстати отсюда http://www.kb.mista.ru/article.php?id=56

Imports System.Runtime.InteropServices

<Guid("3127CA40-446E-11CE-8135-00AA004BB851"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IErrorLog
Sub AddError(ByVal pszPropName As String, ByRef pExepInfo As ExcepInfo)
End Interface
'----------------------------------------------------------
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, Pack:=8)> _
Public Structure ExcepInfo
Public wCode As Short
Public wReserved As Short
<MarshalAs(UnmanagedType.BStr)> Public bstrSource As String
<MarshalAs(UnmanagedType.BStr)> Public bstrDescription As String
<MarshalAs(UnmanagedType.BStr)> Public bstrHelpFile As String
Public dwHelpContext As Integer
Public pvReserved As IntPtr
Public pfnDereffered As IntPtr
Public scode As Integer
End Structure
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.