Вход | Регистрация
    1  2  3   

Пишу COM-ВК для 1C на С#

Пишу COM-ВК для 1C на С#
Я
   Гений 1С
 
23.12.20 - 14:11
Возникло пару вопросов к уважаемому ALL по материалам ветки: Собираюсь писать ВК для 1С на C#

Почему то при обращении COM-объекта к DLL-библиотеке ANVIZ NET ожидает встретить 32 или 64-разрядную dll библиотеку tc-b_new_sdk.dll в папке рядом
с моей компонентой AnvizCCH.dll.
Иначе пишет, что попытка запустить плохой файл.
Как сделать универсально, чтобы в зависимости от системы запускался тот или иной файл DLL.
AnvizCCH.dll зарегистрировал через regasm и для 32 и для 64.

В C# коде связывание tc-b_new_sdk.dll по имени tc-b_new_sdk
Я пока вижу только переименовать в tc-b_new_sdk32 и tc-b_new_sdk64 и сделать два проекта для 32 и 64 разрядных ОС. Но это как-то криво.
Можно проще как-то?

P.s: и как убрать мигающую елку справа, закрывает окно написания поста?
   Serginio1
 
4 - 23.12.20 - 14:17
Я тебе уже кучу раз ссылки давал на это

Собираюсь писать ВК для 1С на C#
   Serginio1
 
5 - 23.12.20 - 14:18
   Serginio1
 
6 - 23.12.20 - 14:19
Там несколько вариантов почитай про делегаты
https://metanit.com/sharp/tutorial/3.13.php
   Serginio1
 
7 - 23.12.20 - 14:21
Но проще через SetDllDirectory
Смотри как сделано в SDK
   Serginio1
 
8 - 23.12.20 - 14:22
И про статические конструкторы вспомни тоже ссылки давал
   УдавВПопугаях
 
9 - 23.12.20 - 14:22
нууу так не интересно, в век капитализма и рыночных отношений
   Гений 1С
 
10 - 23.12.20 - 14:27
(5) ок, гляну.
   Garykom
 
11 - 23.12.20 - 14:43
(0) 1. не тупи и делай разные версии 32 и 64
   Garykom
 
12 - 23.12.20 - 14:43
(11)+ потому что http://rsdn.org/forum/dotnet/1000458.all не освоишь

2. Елка убирается так же как и реклама
   Serginio1
 
13 - 23.12.20 - 14:45
(11) Не надо. Просто 2 папки для 32 и 64 разрядных нативных библиотек.
   Serginio1
 
14 - 23.12.20 - 14:47
Если одна библиотека то просто
static class MyDll
{
    static MyDll()
    {            
        var myPath = new Uri(typeof(MyDll).Assembly.CodeBase).LocalPath;
        var myFolder = Path.GetDirectoryName(myPath);

        var is64 = IntPtr.Size == 8;
        var subfolder = is64 ? "\\win64\\" : "\\win32\\";

        LoadLibrary(myFolder + subfolder + "MyDll.dll");
    }

    [DllImport("kernel32.dll")]
    private static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("MyDll.dll")]
    public static extern int MyFunction(int var1, int var2);
}
   Serginio1
 
15 - 23.12.20 - 14:49
Смотри статический конструктор, он выполняется раньше всех. В данном случае загружается нужная библиотека, а затем уже ищутся методы в загруженной библиотеке
   H A D G E H O G s
 
16 - 23.12.20 - 14:54
Кхаб должен страдать.
   Гений 1С
 
17 - 23.12.20 - 17:00
(14) спасибо, попробую. Отчитаюсь тут
   acht
 
18 - 23.12.20 - 17:14
(17) > Отчитаюсь тут
А может не надо, а?
   Garykom
 
19 - 23.12.20 - 17:34
(18) нет уж сразу на боевых серваках клиентов пусть пробует - во они обрадуются когда их сервера попадают
   Ненавижу 1С
 
20 - 23.12.20 - 18:02
(19) в ларьках нет серверов
   Гений 1С
 
21 - 23.12.20 - 19:41
(20) (19) вот-вот, какие сервера, от чего попадают? ;-) Прям Скайлинк и Терминатор
   Йохохо
 
22 - 23.12.20 - 20:16
(21) Скайлинк
i am your father, Manhole
   NorthWind
 
23 - 23.12.20 - 21:43
Скайлинк? Это пров сотовой связи такой был лет 15 назад.
При чем он тут?
   TormozIT
 
24 - 23.12.20 - 22:35
О, уже второй сезон сериала =)
   Serginio1
 
25 - 25.12.20 - 12:32
(17)>> Отчитаюсь тут
Сергей как успехи? Как продвижение в изучении и реализации C#.
Есть вопросы? Волнуемся, переживаем!
Чем помочь?
   Garykom
 
26 - 25.12.20 - 13:01
(25) Можно ли управляемый код на C# вызывать из неуправляемого на C++ ?
   Garykom
 
27 - 25.12.20 - 13:02
(26)+ без реализации COM сервера, обычная c-shared DLL
   Ненавижу 1С
 
28 - 25.12.20 - 13:11
   Garykom
 
29 - 25.12.20 - 13:38
(28) хмм получается ну да таким макаром можно на C# ваять Native API ВК для 1С
через прокладку на C++ вызывать сборки на C#
   Serginio1
 
30 - 25.12.20 - 13:43
(26) Конечно! Ты забыл про Ъ
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux
http://catalog.mista.ru/1c/articles/534901/

Правда я писал еще под под .Net Core 1
Сейчас для .Net Core >3 другой апи
https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting
 
 
   Serginio1
 
31 - 25.12.20 - 13:49
Для некросплатформенного есть https://docs.microsoft.com/ru-ru/cpp/dotnet/mixed-native-and-managed-assemblies?view=msvc-160
Есть вариант взаимодействия через COM "CLR Hosting API"
Использование .NET сборок в 1С 8.2, 8.3 без установки и без регистрации в реестре.
http://catalog.mista.ru/public/300091/
   Serginio1
 
32 - 25.12.20 - 13:58
   Garykom
 
33 - 25.12.20 - 13:59
(30) дык тоже dll прокладка, подразумевал что всего одна dll на C# которую можно вызывать из C++ unmanaged
   Serginio1
 
34 - 25.12.20 - 14:01
(33) Смотри 32
   Serginio1
 
35 - 25.12.20 - 14:08
(33) Все в одном это С++ CLI. Вызов из нативного кода C# DLL это CLR Hosting API и nethost.h и hostfxr.h или CoreClrHost
Все они вызываются и нативного кода.
Я просто сделал универсальную прокладку.
Для отдельной ты сам можешь написать свою ВК без всяких Ъ
   Serginio1
 
36 - 30.12.20 - 11:22
(0) Сергей с наступающим тебя новым годом!
Расскажи о достижениях!
   qwerty
 
37 - 30.12.20 - 11:25
(36) - он таки смог поставить Visual Studio
   Garykom
 
38 - 30.12.20 - 11:26
(37) не ту поставил и не настроил sdk v120
   qwerty
 
39 - 30.12.20 - 11:33
(38) - ужос...

Ждем новый сезон "Гений проводит тонкую настройку Tomcat".

Жанр: фильм - катастрофа

Трейлер показывали в 2013м году:
https://www.youtube.com/watch?v=E3418SeWZfQ
   Гений 1С
 
40 - 30.12.20 - 11:51
(38) поставил последнюю, 2019-ю.
   Гений 1С
 
41 - 30.12.20 - 11:52
(36) Спасибо. О достижениях рассказываю на Geni1s.ru. Как говорится, "вы еще не слышали о Гение 1С, но скоро вы о нем еще услышите"!
   H A D G E H O G s
 
42 - 30.12.20 - 12:52
   Serginio1
 
43 - 30.12.20 - 14:14
(42) Ну сам себя не похвалишь, никто не похвалит!
Другое дело, что здесь все Гении. И всех гениев и не только 1С с Новым Годом!
И побольше Гениев не только 1С, но и в разных языках, от этого наша страна станет более гениальной.
А можем жить согласно нашему гению!
   acht
 
44 - 30.12.20 - 14:22
(43) > согласно
Но традиционно таки - вопреки.
   Гений 1С
 
45 - 06.01.21 - 13:08
Возник вопрос с VARIANT и COMSAFEARRAY до кучи (это ж тоже VARIANT)
В VB6 у меня были необязательные параметры методов, они были с типом Variant.
Как мне в C# преобразовать их в число или булево?
Про массивы еще не дошел, но чую тоже понадобятся. Я передаю из 1С ComsafeArray в параметры методов.
   Ненавижу 1С
 
46 - 06.01.21 - 13:29
(45) ну прочти хоть немного про c#. Хотя ты все еще думаешь, что это диалект Си
   Paint_NET
 
47 - 06.01.21 - 13:38
(46) "А чо его изучать, это тот же Си" © фиксин :)
   H A D G E H O G s
 
48 - 06.01.21 - 13:39
Поставим Сергею хорошую песню
https://youtu.be/9aCxDlh5OOc
   H A D G E H O G s
 
49 - 06.01.21 - 13:43
С++ и C# как бэ намекают Сергею, что он ниасилит
https://youtu.be/u0VT75jP-Yo?list=PL46NKry1dUo25uIdsdjl28YNQG0HNumhR&t=981
   Serginio1
 
50 - 06.01.21 - 14:29
(45) Еще раз советую посмотреть класс public class AutoWrap : IReflect
и главное метод  public static object ОбернутьОбъект(object obj)
и
ПолучитьРеальныйОбъект(object obj)

.Net сама преобразует для COM и из COM нужные типы

https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/type-marshaling
   Serginio1
 
51 - 06.01.21 - 14:36
   ДедМорроз
 
52 - 06.01.21 - 14:45
Variant это структура,где хранятся простые типы и ссылки на сложные.
Соответственно,получаем или значение или ссылку на хранимое значение.
Но,нужно не забывать,что для работы со значениями есть свои функции,так как значения требуют выделения и освобождения памяти.
   Гений 1С
 
53 - 06.01.21 - 15:11
(52) вопрос - как это сделать в C#
(50) там фишка в том, что на вход функция COM-Объекта может получать V:Variant, где может быть и число и булево (передаются настройки).

Ну и конечно, еще доживу до COMSafeArray, вот там попотеть придется.
   Serginio1
 
54 - 06.01.21 - 17:07
(53) Я зачем тебе ссылки даю? Автоматом преобразуются как в одну так и в другую сторону. А вот нетовские объекты и классы не помеченные как комовские нужно преобразовывать через IReflect
   Serginio1
 
55 - 06.01.21 - 17:12
   Serginio1
 
56 - 06.01.21 - 17:14
Можешь не спрашивать, а смотреть в отладчике, что получаешь
   Garykom
 
57 - 06.01.21 - 17:26
интересно к концу 2021 осилит?
   Гений 1С
 
58 - 06.01.21 - 18:01
(55) вот как мне на c# в COM-классе объявить что параметр метода - Variant или массив Variant?

public Test(Variant v)
{
  return (long)v + 1;
}

Так не работае, например.

А если ты хочешь сказать, что он автоматом мне преобразует Variant в long, то что будет, если там будет не long, а string:

public Test(long v)
{//Как быть если v - string и мне нужно вернуть ее длину (тестово, допустим)?

  return v + 1;
}
   Гений 1С
 
59 - 06.01.21 - 18:04
(56) я вызываю класс из формы на c#, я там тип Variant не создам. А если из 1С вызывать, то можно трассирокой, в принципе (там отладчик не подхватит), но нужно понимать, какой в C# тип параметра объявлять.
   Serginio1
 
60 - 06.01.21 - 18:12
Для начала объяви
public void Test(object v)
{
//  return (long)v + 1;

и посмотри какой тип приходит
}

скорее всего будет
public int Test(int v)
{
  return v + 1;

}

Если из 1С нужно ссоздать объект А затем из студии оттладка- присоединиться к процессу. Ставь точки останова где тебе нужно и смотри
 
 
   Serginio1
 
61 - 06.01.21 - 18:16
   Гений 1С
 
62 - 06.01.21 - 21:35
(60) а как тип посмотреть? object - это встроенный объект? и как задать не обязательный параметр
Test(object v = Null)?
   Гений 1С
 
63 - 06.01.21 - 21:38
но даже если я увижу там int, как мне его получить? ведь там может быть и string?
(int)v
(string)v
в зависимости от типа v?
   Ненавижу 1С
 
64 - 06.01.21 - 21:56
(62) ты же хвастался, что уже знаешь шарп, а про базовый object не в курсе?
   Serginio1
 
65 - 06.01.21 - 22:52
(62) object это по сути variant любой тип можно привести к object
по типу можно преобразовать к нужному типу. Есть GetType(), is as и switch
https://docs.microsoft.com/ru-ru/dotnet/csharp/pattern-matching

Про необязательные параметры и прочее. Прочитай https://metanit.com/sharp/tutorial/2.9.php
Это снимет кучу вопросов.
Test(object v = null)
   Serginio1
 
66 - 06.01.21 - 22:59
Если ты знаешь какой тип передаешь то  пиши метод с нужным типом
public int Test(int v)
(62) В отладчике vj;yj nbg gjcvjnhtnm https://docs.microsoft.com/ru-ru/visualstudio/debugger/debugger-feature-tour?view=vs-2019
https://docs.microsoft.com/ru-ru/visualstudio/get-started/csharp/tutorial-debugger?view=vs-2019
   ДедМорроз
 
67 - 06.01.21 - 23:15
Object это базовый тип,любой сложный тип(то есть объект)это потомок object.
Но,простые типы,типа int,на самом деле,не есть потомки object.
Просто,для них создаётся дополнительный тип,который является объектом,но с одним значением простого типа.

Variant же,это структура.
Она в object напрямую не переносится.
Кроме того,object живёт в пространстве виртуальной машины net,а variant живёт в пространстве процесса,вызывающего код net.
Далее, есть специальный интерфейс IMarshal,который передает данные из пространства одного процесса в другой,и в его реализации можно спокойно сделать трансляцию одного в другое.
Но,лучше не использовать массивы для передачи,так как трансляция массива не всегда очевидна.
Кроме того,в variant могут быть переданы интерфейсы объектов,что для net подсистемы не совсем очевидно.
   Гений 1С
 
68 - 07.01.21 - 07:33
(66) я ж говорю, что не знаю. а вот в (67) пишут, что variant в object не конвертируется...
гм, вроде простые вещи, а вызывают затруднения у корифеев, до всего самому чую доходить придется.
(67) интерфейсы я не планирую передавать, только массивы (COMSAFEARRAY) и произвольный тип (VARIANT)
   Serginio1
 
69 - 07.01.21 - 12:46
(68) Говорят, что кур доят. Я тебе кучу ссылок давал. Все конвертируется автоматически.
Ты хоть попробовал?
COMSAFEARRAY преобразуются к массивам нужного типа в зависимости от типа элемента int[], string[] итд
   Кирпич
 
70 - 07.01.21 - 13:00
(69) "Ты хоть попробовал?"
Лучше пусть не пробует. А то гениальность так полыхнет, что таблетки придется пить.
   Serginio1
 
71 - 07.01.21 - 13:04
Для проверки сделай 2 метода

public string[] TestGetArray()
{

return new string[]{первый, второй, третий};
}

public void TestSetArray( object array)
{
 var i=0;// cnfdm njxre jcnfyjdf
}

из 1С
мас=Новый COMSafeArray("VT_I1",1); 
мас.SetValue(0,127);

нетобъект.TestSetArray(мас);
   Serginio1
 
72 - 07.01.21 - 13:05
ну скобки забыл поставить
{"первый", "второй", "третий"};
И cnfdm njxre jcnfyjdf это ставь точку останова
   ДедМорроз
 
73 - 07.01.21 - 13:23
Так 1с передает Array с типом vt_variant,так что там немного сложнее.
С другой стороны,array of object тоже вполне себе жилец.
И я нигде не писал,что не конвертируется,я просто объяснял,что преобразования достаточно непрозрачные,так как адресные пространства разные.
Ну и windows для типа variant точно также использует сериализации,только для этого есть специальный интерфейс,так как можно захотеть сериализовать свои интерфейсы.
Но,1с умеет только IDispatch,так что лезть в дебри бессмысленно.
   Serginio1
 
74 - 07.01.21 - 13:35
(73) Адресные пространства одинаковы. Среда .Net Jit ит все в нативный код.
Для ком создаются оболочки которые отвечают не только за конвертацию но и за подсчет ссылок
https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/com-wrappers

ну и таблица преобразования variant
https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/customize-struct-marshaling#marshal-systemobject
   ДедМорроз
 
75 - 07.01.21 - 19:33
У среды .Net свое адресное пространство.
То,что система делает преобразование - это понятно.
Только преобразование - это потеря производительности.
   Serginio1
 
76 - 07.01.21 - 20:32
(75) >> У среды .Net свое адресное пространство.
Можно ссылочку на такие заявления?

Адресное пространство тоже.
http://catalog.mista.ru/1c/articles/448668/

Вот здесь замер скорости, всего в 2.25 раза медленнее обычного 1С метода.
Если бы был межпроцессный маршалинг, вызов бы был в сотни раз медленнее.
Опять же при отладке подключаемся к процессу 1С, а не какому ни будь суррогату.
   Гений 1С
 
77 - 07.01.21 - 20:35
(69) с массивом попробую. Но у меня есть и просто параметр (не массив) Variant, Который может быть int и boolean. Как тут быть?
   Serginio1
 
78 - 07.01.21 - 20:39
76+ Суть не в скорости, а в возможностях. ВК то нужны для расширения возможностей 1С
Если нужна скорость можно заполнять объекты 1С из .Net
   Serginio1
 
79 - 07.01.21 - 20:45
(77) Еще раз

public void TestVariant( object variant)
{
 var i=0// ставь точку останова и смори какой тип
}

если передаешь любой тип то ссылку на преобразование типов я тебе уже давал
https://docs.microsoft.com/ru-ru/dotnet/csharp/pattern-matching

Кроме того, если бы наконец то соизволил посмотреть код
ще раз советую посмотреть класс public class AutoWrap : IReflect
и главное метод  public static object ОбернутьОбъект(object obj)

То там сравтение типов

public static object ОбернутьОбъект(object obj)
        {
            if (obj != null)
            {

                Type Тип = obj.GetType();

                if (Тип==typeof(System.IntPtr) || Тип==typeof(System.UIntPtr))
                    return new AutoWrap(obj);

                if (Тип == typeof(System.Char))
                    return System.Convert.ToString(((char)obj));

                if (ЭтоСемерка)
                {
                  
                    if (Тип == typeof(System.Decimal)) return ((Decimal)obj).ToString(CultureInfo.InvariantCulture);
                    if (Тип.IsPrimitive)
                    {
                        if ((Тип == typeof(System.Int64) || Тип == typeof(System.UInt32) || Тип == typeof(System.UInt64) || Тип == typeof(System.UInt16) || Тип == typeof(System.SByte)))
                            obj = Convert.ChangeType(obj, typeof(string), CultureInfo.InvariantCulture);
                    }
                    else if (!(Тип == typeof(System.DateTime)
                               || Тип == typeof(System.String)
                               || Тип == typeof(System.Decimal)
                               || Тип.IsCOMObject)
                             )
                        obj = new AutoWrap(obj);
                }
                else
                {
                    if (Тип.IsArray)
                    {
                        Type ТипМассива = Тип.GetElementType();
                        if (ТипМассива != null)
                            Тип = ТипМассива;
                    }

                    if (!(Тип.IsPrimitive
                    || Тип == typeof(System.Decimal)
                    || Тип == typeof(System.DateTime)
                    || Тип == typeof(System.String)
                    || Тип.IsCOMObject)
                          )
                        obj = new AutoWrap(obj);
                }
            }
            return obj;
        }
   Serginio1
 
80 - 07.01.21 - 20:46
Я тебе ссылки не зря даю. Там все конкретно есть по твоим вопросам. Ты бы уже давно мог все проверить и написать кучу тестов
   Гений 1С
 
81 - 07.01.21 - 20:57
(79) о, вот это то что нужно вроде. сегодня COM не ковырял, завтра буду, проверю на деле. Спасибо. ;-)
   Гений 1С
 
82 - 07.01.21 - 20:57
(80) Завтра буду тестить. Спасибо.
   H A D G E H O G s
 
83 - 07.01.21 - 21:36
Сергей вдупляет в ComSafeArray, внутри которого передаются из 1С в ВК параметры вызванного метода, я же правильно понимаю?
   Гений 1С
 
84 - 07.01.21 - 22:03
(83) не уверен, что я правильно понимаю, о чем ты спрашиваешь.
   Serginio1
 
85 - 07.01.21 - 22:32
(84) Наверное ты решил сделать всетаки ВК?
И использовать ILanguageExtender?
ILanguageExtender
{
   ......
    void CallAsProc(int lMethodNum, [MarshalAs(UnmanagedType.SafeArray)] ref Array paParams);
    void CallAsFunc(int lMethodNum, ref object pvarRetValue, [MarshalAs(UnmanagedType.SafeArray)] ref Array paParam);

}

Зачем тебе ВК непонятно. COM вполне достаточно
Если хочешь получить параметры смотри
https://docs.microsoft.com/ru-ru/dotnet/api/system.array?view=net-5.0

Опять же смотри NetObjetToIDispatch45 там есть класс ВК GlobalContext1C : IInitDone, ILanguageExtender
   H A D G E H O G s
 
86 - 07.01.21 - 22:33
Вот так это делается у нас, в Дельфи

function TBaseVKObject.GetParamAsInt64(lIndex: integer): int64;
var
  varGet: OleVariant;
begin
  SafeArrayGetElement(g_Params, lIndex, varGet);
  try
    result := varGet;
  except
    ErrorCode := -1 * (lIndex + 1);
    Raise Exception.Create('Параметр номер ' + inttostr(lIndex + 1) +
      ' не может быть преобразован в целое 8-ми байтовое беззнаковое.');
  end;

end;
   Serginio1
 
87 - 07.01.21 - 22:38
(86) Эх я на Паскале Delphi лет 25 писал, но увы .Net больше возможностей.
Но ностальгирую
(84) Еще посмотри http://rsdn.org/forum/dotnet/2213356.1
   Serginio1
 
88 - 07.01.21 - 22:42
Кстати про маршалинг массивов
https://docs.microsoft.com/ru-ru/dotnet/framework/interop/default-marshaling-for-arrays

(86) В .Net так
public void CallAsFunc(int lMethodNum, ref object pvarRetValue, ref System.Array paParams)
        {    //Здесь внешняя компонента выполняет код функций.

//
          
 switch(lMethodNum)//Порядковый номер метода

            {      
                case (int)Methods.methShowErrorLog:  //Реализуем метод для показа сообщения об ошибке

                {
                    string s1;
                    s1 = (string)paParams.GetValue(0);
   Гений 1С
 
89 - 08.01.21 - 07:22
(85) нет, я не буду делать ВК, я остаюсь с COM
   rphosts
 
90 - 08.01.21 - 07:28
(89) старого пса нельзя научить новым фокусам
   Гений 1С
 
91 - 08.01.21 - 07:31
(90) просьба не оффтопить в тематической ветке
   rphosts
 
92 - 08.01.21 - 08:12
(91) ок, но и ты не оффтопь
   Гений 1С
 
93 - 08.01.21 - 08:24
(92) в этой ветке я пишу сугубо про COM
   УдавВПопугаях
 
94 - 08.01.21 - 09:35
так если просто ком, то зачем ленгвиджекстендер маршаллинг и остальное
   УдавВПопугаях
 
95 - 08.01.21 - 09:36
для просто кома достаточно сделать саму длл комвидимой и интерфейс один/два/сколько надо, регать в реестре и использовать, больше ничего
   Гений 1С
 
96 - 08.01.21 - 11:50
(94) потому что в параметры передается из 1С и в 1С ComSafeArray
   Гений 1С
 
97 - 08.01.21 - 11:50
Робята, скажите, часто в функциях объявляю буфер:
IntPtr pBuff;
int len = 32000;
pBuff = Marshal.AllocHGlobal(len);

Могу я его вынести в функцию, чтобы он там выделялся, а удаляться будет при удалении переменной pBuff?
   jbond
 
98 - 08.01.21 - 12:18
(97)  зачем здесь делать рефакторинг единственого вызова?

Это какой язык? Если си или кресты - то можно попытаться сделать макро.

Но опять же - зачем?
   Гений 1С
 
99 - 08.01.21 - 12:19
Гм, вот счас мне надо в 1С вернуть массив строк, на Басик-зольдатен я просто возвращал массив, созданный DIM, и она маршаллировал в COMSAFEARRAY, посмотрим, что в Шарпе будет
   Гений 1С
 
100 - 08.01.21 - 12:20
(98) есть десяток функций, каждая из них вызывает функцию обработки очереди сообщений, которая возвращает сообщение.
сообщение нужно разместить в неком буфере. я бы не против чтобы функция обработки очереди сообщений создавала этот буфер, но он не сотрется при выходе из функции? Надо попробовать, в принципе.
  1  2  3   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.