Имя: Пароль:
1C
1С v8
Внешняя компонента на C# и интерфейс IPlatformInfo
0 mike124
 
21.10.18
16:38
Исходные условия: платформа 8.3.10 и внешняя компонента, написанная на C#.
Необходимо узнать версию вызывающей платформы из компоненты.

Я использую стандартный (так написано в документах 1С) интерфейс IPlatformInfo. При попытке получить его из IDispatch, который получаю при выполнении Init мне прилетает сообщение, что интерфейс с идентификатором "AAABE126-2230-4A7D-9DDA-8987FD2A62BA" (это гуид IPlatformInfo) не поддерживается.
При этом, другая внешняя компонента, но написанная на С++ прекрасно получает этот интерфейс.

В шарпе IPlatformInfo описан так:

[Guid("AAABE126-2230-4A7D-9DDA-8987FD2A62BA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IPlatformInfo
  {
   UInt32 GetPlatformInfo(ref IntPtr app_info);
  }
//----------------------------------------------------------
public enum AppType :int
  {
   eAppUnknown = -1,
   eAppThinClient = 0,
   eAppThickClient,
   eAppWebClient,
   eAppServer,
   eAppExtConn
  }
//----------------------------------------------------------
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode, Pack=8)]
public struct AppInfo
  {
   [MarshalAs(UnmanagedType.BStr)] public string AppVersion;
   [MarshalAs(UnmanagedType.BStr)] public string UserAgentInformation;
   public int Application;
  }

GetPlatformInfo пробовал объявлять по-разному:
UInt32 GetPlatformInfo(ref AppInfo app_info);
UInt32 GetPlatformInfo(out AppInfo app_info);
UInt32 GetPlatformInfo(ref object app_info);

Ничего не помогло.

Все остальные интерфейсы 1С прекрасно находятся. Подозревал, что что-то не так с объявлением GetPlatformInfo, но оказалось, что до проверки совместимости даже не доходит. Пробовал у доступных интерфейсов менять объявления функций до полной несовместимости, но эти интерфейсы прекрасно находятся.

Думал, гуид неверный, но ВК на С++ получает интерфейс IPlatformInfo именно по этому гуиду. Да и в примерах 1С другого гуида для IPlatformInfo нет :(

Подскажите, кто знает, в чем косяк?
1 Dmitry1c
 
21.10.18
17:17
А ты хочешь нативную компоненту?
2 mike124
 
21.10.18
20:18
СОМ, конечно.
Там же интерфейсы с гуидами - явно не нативная.
3 mike124
 
23.10.18
16:29
Похоже, рано я хвалил компоненты на С++...
IPlatformInfo вообще недоступен внешним компонентам. Только драйверам.
Но для работы с драйверами используются другие инструменты. Судя по всему, именно поэтому драйверам и доступен этот интерфейс. Внешним компонентам инфа о платформе недоступна через стандартные интерфейсы. Хоть на C# их пиши, хоть на ассемблере :(
4 Garykom
 
гуру
23.10.18
16:54
(0) Можешь задачу популярнее объяснить?

Что ты хочешь сделать для чего тебе нужно знать описание платформы 1С?
5 Garykom
 
гуру
23.10.18
16:56
И да в 1С нет никаких "драйверов", есть только драйвера ТО (и прочего внешнего оборудования и/или расширения функционала) в виде ВК (по технологии com или native)

Кроме этого еще сама платформа 1С представляет COM интерфейс для использования из чего то внешнего что это умеет.
6 PloAl
 
23.10.18
16:59
Посмотрел описание СОМ компонент, не нашел про драйвера ничего.
Пример с описанием там тоже есть для с++.
Думаю в (3) вы ошибаетесь.
Возможно проблема с guid, попробуйте погуглить его в реестре.
Также как вариант, из COM насколько помню можно вызывать встроенные и написанные в конфигурации функции.
7 Dmitry1c
 
23.10.18
17:00
(2) не проще передавать вызывая из платформы компоненту соответствующую информацию в компоненту?
8 Garykom
 
гуру
23.10.18
17:46
(7) Я подозреваю что он подключается извне к 1С из проги на C# и хочет узнать к какой платформе подрубился
9 mike124
 
25.10.18
22:06
Не надо гадать: сделайте ВК на все равно на чем, и продемонстрируйте, что IPlatformInfo доступен.

Что касается драйверов: естественно, я имел в виду драйвера ТО. С ними 1С работает посредство других функций. Соответственно, там и инфа другая драйверу доступна. В том числе и интерфейсы. Про них подробно написано в документе "Требования к разработке драйверов подключаемого оборудования".
Что касается, на чем писать ВК: да без разницы. Шарп, С++ - заявленные интерфейсы должны быть доступны.

По поводу зачем: да пофиг, зачем. Надо! В частности, зная версию 1С и тип клиента ВК может как-то изменять свое поведение: это очевидно.
10 Garykom
 
гуру
25.10.18
22:21
(9) Вы чего то путаете, "драйвера ТО" это обычные ВК (COM или NativeAPI), вся разница что они обычно используют механизм "внешних событий"
Хотя это совсем не обязательно и обычная "ВК не драйвер" вполне может их тоже использовать.

Кроме ВК 1С еще умеет работать с обычными COM объектами (не дописанными по формату 1С) и все, больше ничего нет.