Имя: Пароль:
1C
1С v8
ПодключитьВнешнююКомпоненту возвращает ложь
,
0 abuca
 
10.12.16
18:20
Куда копать, подскажите...
Уже целый день, дальше 2х строк не сдинулся...

&НаСервере
Процедура ПодключитьНаСервере()
        
    Результат = ПодключитьВнешнююКомпоненту("C:\SDK Guard\ZGuard.dll", "Native", ТипВнешнейКомпоненты.Native);
    
Возвращает ложь, хоть из макета, хоть из файла.

В описании DLL поддерживает NativeAPI

В папке с установленным SDK лежат 2 файла библиотеки:
ZGuard.dll
ZGuard.lib

Это библиотека контроллера системы контроля доступа.
Взято отсюда:
https://ironlogic.ru/il.nsf/htm/ru_sdk-guard

Комментарий оттуда:

"SDK Guard предназначен для облегчения и ускорения интеграции сетевых контроллеров IronLogic с существующими или вновь создаваемыми программными комплексами, например, учета рабочего времени или контроля доступа. Основой SDK является DLL библиотека и программа-драйвер связи позволяющие осуществлять обмен информацией с перечисленными выше контроллерами"
1 Cool_Profi
 
10.12.16
18:23
Пролистав страничку - не увидел там ни слова про 1с.
С какого перепо^Wугу она должна грузиться как внешняя компонента?
2 abuca
 
10.12.16
18:34
т.е., продолжу, dll должна иметь совместимость с 1С?

Знаю, что этот контроллер пихнули в одну из жадных конфигураций "Фитнес". Использовали ли они этот SDK не знаю точно, но эта ссылка (со слов производителя оборудования) была передана разработчику Фитнес-клуба, Корп версия которого поддерживает данные контроллеры.
Значит совместимо...
3 Cool_Profi
 
10.12.16
18:39
"dll должна иметь совместимость с 1С?"

Внезапно, да?


А слова к делу не подошьёшь. Берёшь производителя/поставщика за гланды и заставляешь его показать, как он подключает сей девайс к 1с.
4 abuca
 
10.12.16
18:42
Жаль выходные терять.
Есть, как вариант, обмен с контроллером на Json, однако здесь я несилен. Не имел опыта.
Но если не останется возможности, придется пробовать так.
5 Mauser
 
10.12.16
18:59
(4) >...придется пробовать так
Уж извольте, батенька, не побрезгуйте рукавешки-то засучить.
6 lEvGl
 
гуру
10.12.16
19:02
там есть исходники для ++, шарп, делфи
если напрямую не цепляется, то можно создать свою длл, комвидимую, в нее добавить эту и вызывать, делов на не долго
7 Mauser
 
10.12.16
19:04
Имея заголовочные файлы и библиотеку, компонента пишется за день. Думаю, что разработчики "одной из жадных конфигураций "Фитнес"" так и сделали. По крайней мере плача на мисте от них не слышно.
8 abuca
 
10.12.16
20:16
(6)(7) намек ясен.
9 Serginio1
 
10.12.16
22:30
Или использовать нетовскую DLL через Использование классов .Net в 1С для новичков
10 abuca
 
11.12.16
18:45
Сегодня попробовал DynamicWrapperX
Геморрой с типами.
Чертевчем возвращает (точнее все в целочисленном приходит), чертевчем надо отправлять в методы.
Куча типов в виде структур тех же типов внутри.
Воспользуюсь услугами по перекомпиляции нативной в СОМ.
Запросил исходники.
11 H A D G E H O G s
 
11.12.16
19:11
В описании говориться о native API, это никак не связано с 1С врешними NAPI компонентами. Там говорится о том, что библиотека - не КОМ, а просто предоставляет экспортные функции (ну типа работает в линуксах). Есть примеры импорта ее функций в Дельфи, C++, C# (заголовочные файлы). Фсе.

Дальше афтор крутится сам - либо пишет COM ВК, либо NAPI ВК поверх заголовочных файлов, ибо эти заголовочные файлы на свой вход требуют Структуры.
12 H A D G E H O G s
 
11.12.16
19:11
А функций и структур там до чертовой бабушки.
13 abuca
 
12.12.16
13:31
(11)(12) Я Вам написал на ящик, указанный в ЛК.
Я, к сожалению, не программирую ни в чем кроме 1С. Мне затруднительно создать ВК.
14 abuca
 
12.12.16
13:38
как вариант мне предложили это:
http://posix.ironlogic.ru/wiki/Z397_Guard
Однако здесь надо напрямую кидать на порт.
Предполагается, что контроллер подключен в сеть предприятия.
15 Serginio1
 
12.12.16
15:30
(13) Надо понимать код. Скомпилируй из исходников C# и используй (9) Или попроси когонибудь, что бы написали

http://ru.stackoverflow.com/questions/527763/%d0%9a%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-c-%d0%b2-1%d0%a1/527802#527802
16 abuca
 
12.12.16
20:10
(15) т.е. если у меня есть: ZGuard.cs  
Его компилировать? В DLL? Но DLL у меня есть. можно ли вызвать ее
Врап.ПолучитьТипИзСборки("ZGuard.ZG_CTR_EV_TYPE","C:\ZGuard\ZGuard.dll")

ZGuard.cs Содержит след. код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using ZPort;  // вот здесь еще интересно, ZPort.dll тоже имеется в той же папке

namespace ZGuard

public enum ZG_CTR_EV_TYPE
    {
        ZG_EV_UNKNOWN = 0,          // Неизвестно
        ZG_EV_BUT_OPEN,                // Открыто кнопкой изнутри
............

Получается, чтобы получить тип к примеру ZG_EV_BUT_OPEN нужно сделать так:

врап=новый COMОбъект("NetObjectToIDispatch45");
Infrascturcture=Врап.ПолучитьТипИзСборки("ZGuard.ZG_CTR_EV_TYPE","C:\ZGuard\ZGuard.dll"); // что такое сборка?
ОткрытоКнопкойИзнутри = Infrascturcture.ZG_EV_BUT_OPEN;  //ЧТО ВЕРНЕТ??? COM-объект?
17 abuca
 
12.12.16
20:52
Infrascturcture=Врап.ПолучитьТипИзСборки("ZGuard.ZG_CTR_EV_TYPE","C:\SDK Guard\ZGuard.dll");

Произошла исключительная ситуация (mscorlib): Не удалось загрузить файл или сборку "file:///C:\SDK Guard\ZGuard.dll" либо одну из их зависимостей. Ожидалось, что модуль содержит манифест сборки.
манифест... где-то я это слышал...
18 H A D G E H O G s
 
12.12.16
21:16
(17) Ты путаешь классы NET, которые могут экспортироваться библиотекой NET (наверное) и тупо структуру в памяти, которая даже не экспортируется, а описывается в документации к dll, создается в памяти вызывающей программе, а в функцию dll передается указатель на данную структуру.

Но могу ошибаться.
19 abuca
 
12.12.16
22:11
Создал проект C#. Загрузил в него исходный код библиотеки.
Вроде, что-то похожее на манифест получилось:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// Управление общими сведениями о сборке осуществляется с помощью
// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
// связанные со сборкой.
[assembly: AssemblyTitle("ClassLibrary2")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ClassLibrary2")]
[assembly: AssemblyCopyright("Copyright ©  2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми
// для COM-компонентов.  Если требуется обратиться к типу в этой сборке через
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
[assembly: ComVisible(true)]

// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
[assembly: Guid("7cbe13fd-216f-497e-833a-1fa27f2df570")]

// Сведения о версии сборки состоят из следующих четырех значений:
//
//      Основной номер версии
//      Дополнительный номер версии
//      Номер построения
//      Редакция
//
// Можно задать все значения или принять номер построения и номер редакции по умолчанию,
// используя "*", как показано ниже:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
20 abuca
 
12.12.16
22:18
Теперь, другой конфуз. ZGuard.dll ссылается на ZPort.dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using ZPort;//это ссылка на ZGuard.dll

namespace ZGuard

error CS0246: Не удалось найти имя типа или пространства имен "ZPort" (пропущена директива using или ссылка на сборку?)

Есть код на C# обеих. Как в одном проекте 2 DLL собрать, чтобы вторая видела первую и собиралась???
21 abuca
 
12.12.16
22:55
Правильно, не отвечайте мне. В проекте надо было добавить ссылку и указать путь к dll.
Скомпилировалось.
22 Serginio1
 
13.12.16
00:11
(21) Все dll должны лежать в одном месте. Удачи!
23 H A D G E H O G s
 
13.12.16
00:24
(22) Врап.ПолучитьТипИзСборки() получает NET класс из NET dll, ведь так?
24 abuca
 
13.12.16
00:37
Йеееее!!! Я это сделал!!!
Спасибо всем!

Вижу все переменные, описанные в ZGuard.ZG_CTR_EV_TYPE
       ZG_EV_UNKNOWN = 0,          // Неизвестно
        ZG_EV_BUT_OPEN,                // Открыто кнопкой изнутри
        ZG_EV_KEY_NOT_FOUND,        // Ключ не найден в банке ключей
        ZG_EV_KEY_OPEN,                // Ключ найден, дверь открыта
        ZG_EV_KEY_ACCESS,            // Ключ найден, доступ не разрешен
        ZG_EV_REMOTE_OPEN,            // Открыто оператором по сети

и т.д.

дальше все понятно, вроде...
25 abuca
 
13.12.16
00:38
(22)(15) Особенное спасибо. Повернули в нужную сторону.
26 Serginio1
 
13.12.16
09:58
(25) Спасибо! Я рад, что мои труды не напрасны.
27 Serginio1
 
13.12.16
10:00
(23) Да. Вернее получает Сом объект в который обернуты данные Типа. А из типа мы можем создать объект, получить доступ к статическим методам и свойствам.
28 abuca
 
26.12.16
11:08
Там в dll пара десятков функций. DLL не COM видимая. Голову сломал, как пробросить методы, чтобы их увидеть.
Все, плюнул. Делаю по протоколу. Уже пишу и читаю. Добрался до памяти контроллера.
Думаю к НГ уже будет обработка обслуживания.
29 abuca
 
26.12.16
11:10
(26)Однако персональное спасибо. Врап - классная штука. Буду пользоваться.
30 abuca
 
26.12.16
11:13
Вот такой монстр получается из-за логических преобразований байтов в отправке и получении (часть функции преобразования пакета на отправку в контроллер из 4х байт в 5):

    Скрипт = Новый COMObject("MSScriptControl.ScriptControl");
    Скрипт.language = "vbscript";
    m4 = РазложитьСтрокуВМассив(ТекстСообщения);
    //вычисляем длину для отправки
    стр = "5 * Int((" + м4[1] + " + 3) / 4) + 1";
    lgs = HEX(Скрипт.Eval("" + стр));
    lgs_ = ToDEC(lgs,16);
    lgs =  "&H" + lgs;
    //Контрольная сумма
    ht = 0;
    i=0;
    j=1;
    Пока i < м4.Количество()-1 Цикл
        ht ="&H" + HEX(Скрипт.eval("" + м4[i] + " + " + ht));
        i = i + 1;
    КонецЦикла;
    
    Стр = ht + " - Int(" + ht + " / &H100) * &H100";
    ht = "&H" + HEX(Скрипт.Eval("" + стр));
    стр = "&H100 - " + ht;
    ht = "&H" + HEX(Скрипт.Eval("" + стр));
    Если ht = "&H100" Тогда
        ht = "&H" + HEX(0);
    КонецЕсли;
    м4[0] = ht;   //
    
    //пишем в буфер
    i=0;
    buff = новый массив(lgs_+1);
    j = 1;//1
    i = 0;
    
    Пока j < lgs_ Цикл
        
        //'пишем в буфер
        //'формируем 0 байт
        стр = "((" + м4[i] + " AND " + "&H80)/&H10)+" + "((" + м4[i+1] + " AND " + "&H80)/&H20)+" + "((" + м4[i+2] + " AND " + "&H80)/&H40)+" + "((" + м4[i+3] + " AND " + "&H80)/&H80)";
31 Serginio1
 
26.12.16
13:14
Я как то отдельно не пользовался AND.
Но есть OR. Можно по образу и подобию создать и AND

public object OR(params object[] параметры1)
        {
            if (параметры1.Length == 0)
                return null;

            object[] параметры = AutoWrap.ПолучитьМассивРеальныхОбъектов(параметры1);
            var парам = параметры[0];
            var тип = парам.GetType();

            long res = (long)Convert.ChangeType(парам, typeof(long));

            for (int i = 1; i < параметры.Length; i++)
                res |= (long)Convert.ChangeType(параметры[i], typeof(long));


            if (тип.IsEnum)
            {
                var ТипЗначений = Enum.GetUnderlyingType(тип);
                var number = Convert.ChangeType(res, ТипЗначений);
                return AutoWrap.ОбернутьОбъект(Enum.ToObject(тип, number));
            }

            return AutoWrap.ОбернутьОбъект(Convert.ChangeType(res, тип));
        }


Просто если ты правишь исходники, то там можешь добавить функцию