1. Куча / Говнокод #26676

    +3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    Помните шутку про 1С/C++/CSH программиста?
    Так вот: парень хочет работать с COM портом, но почему-то COM объект в Windows не создается.
    
    
    https://phpclub.ru/talk/threads/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-failed-to-create-com-object.86770/

    Запостил: MAKAKA, 21 Мая 2020

    Комментарии (139) RSS

    • SEO:
      --А как правильно: Иран или Ирак?
      --Вроде, и так, и так говорят
      Ответить
      • Тут пиздец, причём полный. Чувака, который вообще не разбирается в программировании, посадили писать на «PHP» скрипт по управлению кассовым аппаратом.
        Ответить
    • А может ему надо работать с .COM файлом? Например COMMAND.COM
      Ответить
    • > что не так с рнр или со мной?

      Что он там, транзистор припаять не может?
      Ответить
      • Транзистор - шеечный, вроде Спидолы?.. В музей отдайте, на СВ-ДВ давно уже только шорохи. Под них говорят сношаться неплохо.
        Ответить
    • дебил продолжает свой бой

      причем в том форуме все остальные тоже дебилы, и главному дебилу помочь не могут
      Ответить
      • Я думал, тема исчерпана, а она вдруг заиграла новыми красками...
        Ответить
        • он не может создать ком объект, но все обсуждают, что пых не может работать с оборудованием
          Ответить
      • Кстати, а fopen('\\.\COM1', 'rw') недостаточно?
        Ответить
        • да, если ты знаешь протокол.
          Но он работает с ним через "AddIn.Line8".
          Скорее всего 1С его видит, потому что .dllка лежит в той же папке, что и 1С
          А не втой, где его денвер
          Ответить
          • Кстати, у моего метода два недостатка:
            1. Нет доступа к параметрам порта (скорость и т. п.).
            2. Невозможно обрабатывать прерывания. Например, нам нужно быстро среагировать, когда внешняя железка в порт что-то послала, а в остальное время не нагружать систему.
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Значит, нативное расширение нужно писать. В «Пекле» ничего готового для «UART»/«RS-232»/«COM» не гуглится.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Кокококонкретно в этой задаче придётся использовать COM-объект. У торгового оборудования проприетарный протокол. Драйвер не опенсорсный, а хитрожопый, с регистрацией и с проверкой лицензии (судя по форуму, у некоторых она ещё слетает, и нужно повторно активировать). Интерфейс у этого драйвера через COM-объект.
                    Ответить
                  • По поводу поддержки ioctl шаблонизатором был запрос 10 лет назад, но его проигнорировали:
                    https://bugs.php.net/bug.php?id=59336

                    Сходу гуглится расширение в стадии «proof-of-concept»:
                    https://github.com/dj-thd/php-ioctl
                    Ответить
              • У тебя нет часом температуры?
                Ответить
          • Погуглил я про этот «АТОЛ». У них зоопарк протоколов, и все нумерные: «AddIn.Line8», «AddIn.Line45»...

            http://forum.atol.ru/index.php?showtopic=36090&st=0&p=261533
            Ответить
          • Гуглёжка показывает, что его и из «Delphi» используют.

            Да и потом он же регистрируется в реестре. В реестре можно зарегистрировать оле-оле-оле-сервер без полного пути к DLL?
            Ответить
            • >В реестре можно зарегистрировать оле-оле-оле-сервер без полного пути к DLL?
              думаю да, если покласть его в system32
              Ответить
          • >> Скорее всего 1С его видит, потому что .dllка лежит в той же папке, что и 1С

            Смотри, он пишет, что у него такой код:
            $Дисплей = new com("AddIn.Line8");


            Читаем тугоментацию:
            https://www.php.net/manual/ru/com.construct.php
            com::__construct ( string $module_name [, mixed $server_name = NULL [, int $codepage = CP_ACP [, string $typelib ]]] )

            module_name
            ProgID, Class ID или Moniker, указывающий на компонент для загрузки. Обычно ProgID - это имя приложения или DLL и имя объекта, разделенные точкой. Например: Word.Application. Class ID - это UUID, уникальный для заданного класса. Moniker - специальная форма именования, похожая по концепции к URL, которая идентифицирует ресурс и способ его загрузки.

            Путь к DLL тут не указывается, он берётся из реестра «Шіпдошз».
            Ответить
            • Далее: https://www.php.net/manual/ru/com.error-handling.php

              Модуль выбрасывает исключения класса com_exception в случае потенциальной фатальной ошибки возвращенной COM. Исключения COM имеют четко определенное свойство code, соответствующее возвращенному из различных операций COM значению HRESULT. На основании этого кода вы можете построить логику обработки данных ошибок.

              Т. е. вызов кокококонструктора нужно обернуть в try...catch. Расшифровка кодов HRESULT описана в пэдээфке, ссылку на которую я дал:
              Код ошибки Описание
              0 Ошибок нет
              -1 Нет связи
              -2 Операция зарезервирована для будущих версий
              -3 Порт недоступен
              -4 Ключ защиты не найден
              -5 Работа драйвера прервана пользователем
              -6 Недопустимое значение
              -7 Невозможно добавить устройство
              -8 Невозможно удалить устройство
              -9 Устройство не найдено
              -10 Неправильная последовательность операций
              -11 Устройство не включено
              -12 Не поддерживается в данной версии оборудования
              -13 Драйвер не смог загрузить необходимые модули
              -14 Порт занят приложением: (\\<имя ПК>\<описание приложения-
              клиента>\<описание драйвера>)
              -15..-198 Зарезервировано
              … …
              -198 Зарезервировано
              -199 Неопознанная ошибка


              Если бы он умел читать документацию, он бы получил кокококод ошибки, и не гадал бы на кокококофейной гуще.
              Ответить
              • показать все, что скрытоvanished
                Ответить
              • 2147746132 у него ошибка
                2147746132 =- 0x80040154
                0x80040154
                REGDB_E_CLASSNOTREG
                https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/705fb797-2175-4a90-b5a3-3918024b10b8?redirectedfrom=MSDN

                c:\temp>err 2147746132
                # for decimal -2147221164 / hex 0x80040154 :
                  DIERR_DEVICENOTREG                                            dinput.h
                  STIERR_DEVICENOTREG                                           stierr.h
                  REGDB_E_CLASSNOTREG                                           winerror.h
                # Class not registered
                Ответить
                • Интересно. А «1С» он запускал на той же машине? «1С» умеет вручную грузить незарегистрированный в реестре объект? Или «1С» работает через другой драйвер (я уже приводил реальный пример, что к одному и тому же экрану можно получить доступ через драйвер «АТОЛ» и через драйвер «Штрих»)?
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Ага, там есть раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole, в котором хранятся дефолтные пермишны, и у каждого AppID можно выставить свои. Если выставить неправильно, можно всё сломать. Например, перестанет работать «Проводник» или текст перестанет копироваться в буфер. Будет очень страшно.
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • Нагуглил пиратский сайт с драйверами:
                          https://atoldriver.ru/

                          А вот официальный (с главной страницы его тяжело найти):
                          http://fs.atol.ru/SitePages/Центр%20загрузки.aspx
                          Ответить
                          • Официальный™ центр загрузки выполнен как SPA (вот пидоры), поэтому ссылку на поддиректорию дать нельзя.

                            Скриншот одной из директорий:
                            https://i.imgur.com/3lyC1rB.png

                            Можно скачать руководство программиста по каждому драйверу.
                            Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • А что, если у Сёмы битность «Питона» и «билдтулз» разная?

                          *****

                          Попытаемся собрать испытательный стенд:
                          <?php
                          
                          try {
                              $o = new com('This.Pituh.Does.Not.Exists');
                          } catch(Exception $e) {
                              printf("Code = %x\n", $e->getCode());
                              echo $e->__toString();
                          //    var_export($e);
                          }

                          Выхлоп (в кодировке 1251):
                          Code = 800401e4
                          exception 'com_exception' with message 'Failed to create COM object `This.Pituh.Does.Not.Exists': Синтаксическая ошибка
                          ' in D:\Workdir\LAB\Pitushnya\a.php:4
                          Stack trace:
                          #0 D:\Workdir\LAB\Pitushnya\a.php(4): com->com('This.Pituh.Does...')
                          #1 {main}
                          Ответить
                          • Посмотрим, какие ещё бывают коды:
                            Code = 8007007e
                            exception 'com_exception' with message 'Failed to create COM object `Word.Document.8': Не найден указанный модуль.
                            ' in D:\Workdir\LAB\Pitushnya\b.php:4
                            Stack trace:
                            #0 D:\Workdir\LAB\Pitushnya\b.php(4): com->com('Word.Document.8')
                            #1 {main}


                            *****

                            Code = 80004002
                            exception 'com_exception' with message 'Failed to create COM object `rtffile': Интерфейс не поддерживается
                            ' in D:\Workdir\LAB\Pitushnya\c.php:4
                            Stack trace:
                            #0 D:\Workdir\LAB\Pitushnya\c.php(4): com->com('rtffile')
                            #1 {main}
                            Ответить
                            • 8007007e (Не найден указанный модуль) стабильно вываливается, если переименовать dll/ocx-файл. Копирование файла в текущую директорию или в директорию PHP не решает проблему.
                              Ответить
                            • Ставлю драйвер v.6 (2008-го года), 32-битный на 32-битную систему.
                              Запускаю тест:
                              <?php $o = new com('AddIn.Line45');
                              com_print_typeinfo($o);
                              Выводит такую питушню (в 2к символов не влезает):
                              class ILine1C5X { /* GUID={1D056259-4601-412C-BBB7-90F1A1F6777B} */
                              	/* DISPID=1610612736 */
                              	function QueryInterface(
                              		/* VT_PTR [26] [in] --> ? [29]  */ &$riid,
                              		/* VT_PTR [26] [out] --> VT_PTR [26]  */ &$ppvObj 
                              		)
                              	{
                              	}
                              	/* DISPID=1610612737 */
                              	/* VT_UI4 [19] */
                              	function AddRef(
                              		)
                              	{
                              	}
                              	/* DISPID=1610612738 */
                              	/* VT_UI4 [19] */
                              	function Release(
                              		)
                              	{
                              	}
                              	/* DISPID=1610678272 */
                              	function GetTypeInfoCount(
                              		/* VT_PTR [26] [out] --> VT_UINT [23]  */ &$pctinfo 
                              		)
                              	{
                              	}
                              	/* DISPID=1610678273 */
                              	function GetTypeInfo(
                              		/* VT_UINT [23] [in] */ $itinfo,
                              		/* VT_UI4 [19] [in] */ $lcid,
                              		/* VT_PTR [26] [out] --> VT_PTR [26]  */ &$pptinfo 
                              		)
                              	{
                              	}
                              	/* DISPID=1610678274 */
                              	function GetIDsOfNames(
                              		/* VT_PTR [26] [in] --> ? [29]  */ &$riid,
                              		/* VT_PTR [26] [in] --> VT_PTR [26]  */ &$rgszNames,
                              		/* VT_UINT [23] [in] */ $cNames,
                              		/* VT_UI4 [19] [in] */ $lcid,
                              		/* VT_PTR [26] [out] --> VT_I4 [3]  */ &$rgdispid 
                              		)
                              	{
                              	}
                              	/* DISPID=1610678275 */
                              	function Invoke(
                              		/* VT_I4 [3] [in] */ $dispidMember,
                              		/* VT_PTR [26] [in] --> ? [29]  */ &$riid,
                              		/* VT_UI4 [19] [in] */ $lcid,
                              		/* VT_UI2 [18] [in] */ $wFlags,
                              		/* VT_PTR [26] [in] --> ? [29]  */ &$pdispparams,
                              		/* VT_PTR [26] [out] --> VT_VARIANT [12]  */ &$pvarResult,
                              		/* VT_PTR [26] [out] --> ? [29]  */ &$pexcepinfo,
                              		/* VT_PTR [26] [out] --> VT_UINT [23]  */ &$puArgErr 
                              		)
                              	{
                              	}
                              	/* DISPID=1 */
                              	/* VT_I4 [3] */
                              	var $ResultCode;
                              
                              	/* DISPID=2 */
                              	/* VT_BSTR [8] */
                              	var $ResultDescription;
                              
                              	/* DISPID=3 */
                              	/* VT_BSTR [8] */
                              	var $Version;
                              
                              	/* DISPID=4 */
                              	/* VT_I4 [3] */
                              	var $CurrentDeviceIndex;
                              
                              	/* DISPID=4 */
                              	var $CurrentDeviceIndex;
                              
                              	/* DISPID=5 */
                              	/* VT_I4 [3] */
                              	var $CurrentDeviceNumber;
                              Ответить
                              • При переименовании Line1C.dll получаю ошибку 8007007e, при regsvr32 /u Line1C.dll получаю ошибку 800401e4.

                                Такой код, как у него (80040154), получить пока не удалось.
                                Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                • кажется, такая ошибка бывает, когда зарегистрированная dll не имеет нужного интерфейса
                                  или ошибка битности, или не та dll

                                  или и то, и другое
                                  Ответить
                                  • Похоже, ты прав. У него «пыхпых» 64-битный, а драйвер 32-битный.

                                    Посмотрел ещё раз тему на «phpclub», он использует именно «AddIn.Line8» (чёрт, сначала написал «Ass» вместо «Add»), значит, у него драйвера восьмой версии. Наверняка они 32-битные. Кажется, 64-битные драйвера появились только в 9-й версии.

                                    У него два взаимоисключающих пути:
                                    1. Поменять «пыхпых» на 32-битную версию.
                                    2. Поменять драйвера на 64-битную версию, поменять «1С» на 64-битную версию, переписать кучу скриптов на «PHP» и «1С» (потому что в 9-й версии всё поменяли).

                                    Есть и третий путь:
                                    https://rakafon.blogspot.com/2009/04/32-bit-dll-64-bit.html
                                    Ответить
                                    • А пых под винду по умолчангию 64?
                                      Просто вот питон -- 32, там еще надо умудрица скачыать 64
                                      Ответить
                                      • У пыха ссылки сразу на две версии. Даже на четыре: у него ещё есть вариант thread-safe и non-thread-safe, проверь:
                                        https://windows.php.net/download

                                        Хотя у него же WAMP, а я не знаю, какой в нём пых. Нужно смотреть.
                                        Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
                                          • TS нужен, если ставишь пых модулем «Апача». NTS с «Апачем» просто не будет работать. В остальных случаях на «thread safety» плевать. Вроде считают, что NTS чуть быстрее, потому что не надо ничего синхронизировать, но на самом деле там экономия — копейки по сравнению с тормозами СУБД и с прочей питушнёй.
                                            Ответить
                                            • План глобальной оптимизации PHP-приложения:
                                              1. Заменить все двойные кавычки на одинарные;
                                              2. Скачать и установить «NTS» версию «PHP»;
                                              Ответить
                                        • P.S. Погуглил. В WAMP'ах тоже бывает и 32 бита, и 64:
                                          http://wampserver.aviatechno.net/
                                          Ответить
                                    • > 32-bit-dll-64-bit.html
                                      Тю, скучно как-то. Ожидал задорного треша как вот тут:
                                      http://rce.co/knockin-on-heavens-gate-dynamic-processor-mode-switching/#Loading_an_External_64bit_Payload_DLL_HeavenInjector
                                      (мужик запилил загрузчик произвольных x64 DLL в x32 процесс)
                                      Ответить
                                      • Остаётся проблема передачи данных, если данные передаются не по значению, а по указателю. В 32-битный код нельзя передать указатель на данные, лежащие по адресу (1 << 32) и выше. Нужно выделять блок памяти, целиком лежащий строго ниже адреса (1 << 32), копировать в него данные, и передавать уже указатель на копию.
                                        Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
                                          • Давайте обсудим «Phalcon» — первый фреймворк для «PHP», написанный не на «PHP», а как нативный модуль.
                                            Ответить
                                            • Т.е. в отличие от нормальных фреймворков, он умеет не только в SQL инъекции, но и в сегфолты?

                                              Ждём php.sys, чтобы мммаксимум уязвимостей.
                                              Ответить
                                              • Так точно!

                                                Ещё вот что интересно: первые версии фреймворка «Phalcon» были написаны на няшной сишке, потом автор его переписал на язык программирования «Зефир»:
                                                https://docs.zephir-lang.com/0.12/en/welcome

                                                Реальный пример кода на «Зефире»:
                                                namespace MyLibrary;
                                                
                                                /**
                                                 * Filter
                                                 */
                                                class Filter
                                                {
                                                    /**
                                                     * Filters a string, returning its alpha charactersa
                                                     *
                                                     * @param string str
                                                     */
                                                    public function alpha(string str)
                                                    {
                                                        char ch; string filtered = "";
                                                
                                                        for ch in str {
                                                           if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') {
                                                              let filtered .= ch;
                                                           }
                                                        }
                                                
                                                        return filtered;
                                                    }
                                                }
                                                Ответить
                                                • показать все, что скрытоvanished
                                                  Ответить
                                                • показать все, что скрытоvanished
                                                  Ответить
                                                  • Надо было Страуструпу сказать, что нужно было взять нормальный язык, а не разрабатывать «Cfront».
                                                    Ответить
                                                    • Может, и надо было.

                                                      Я мечтаю о языке с бесплатным интеропом с сишкой, и при этом с современным синтаксисом.

                                                      Может, надо стать растоблядью или свифтблядью?
                                                      Ответить
                                                      • Псс, парень. Тебе на D. Сишные либы как родные, плюсы - как родная тетка. ГЦ немного портит вид. Но на замену Питону пойдет.
                                                        Ответить
                                                        • показать все, что скрытоvanished
                                                          Ответить
                                                          • все кругом дрова, операционки, AAA-игры, проги реального времени пишут? если нет, то и с гц жить можно
                                                            Ответить
                                                            • > с гц жить можно

                                                              Да похуй на пирфоманс. С GC неудобно же, вручную закрывать файлы приходится, вручную каскадить это закрытие в сложных объектах и т.п. Нахуй так жить?
                                                              Ответить
                                                              • Абстрактные рассуждения какие-то, помноженные на С++ головного мозга. Помимо GC в некоторых языках есть вариации на тему RAII (в том же питоне).
                                                                Как Java и скриптухи живут? Было бы проблемой, то языки сдохли бы.
                                                                Ответить
                                                                • > вариации на тему RAII

                                                                  Ну хоть что-то, хотя это только для scoped объектов работает. Банальная задачка про класс, который держит 2 файла, превращается в кучу бойлерплейта. Даже с ExitStack'ом.

                                                                  > было бы проблемой, языки сдохли бы

                                                                  Ну PHP ещё жив, поэтому проблем в нём, походу, нет.
                                                                  Ответить
                                                                  • Да и RAII не панацея. Что если в обертке над файлом метод close кидает исключение (логика такая или апишная функция код ошибки возвращает о невозможности закрыть), то в деструкторе уже звать его опасно
                                                                    Ответить
                                                                    • > метод close кидает исключение

                                                                      А это хуёвый дизайн из прошлого, на самом деле. Сделали гибрид из flush и close, когда буферизации не было, а теперь все страдают. Та же хуйня и с другими подобными API, где close за каким-то хером делает полезные действия помимо собственно закрытия.

                                                                      Позови flush() перед close() и не будет никакого исключения в close. В общем-то на джаве это тоже рекомендуют делать.

                                                                      К слову, в джаве с этим самым close() умудрились обосраться и молча недописать файл если места на диске не хватает. Лучше бы прога пизданулась по terminate, чем такое.
                                                                      Ответить
                                                                • показать все, что скрытоvanished
                                                                  Ответить
                                                                  • показать все, что скрытоvanished
                                                                    Ответить
                                                                    • >Нету смысла в ГЦ: нужны языки с нормальным управлением памятью

                                                                      Ну и потом дрочить weak-ref и питушиться с фрагментированной кучей.
                                                                      Нахуй надо?
                                                                      ГЦшня победила, пора уже признать.

                                                                      >есть ARC у ябла, и смысла в ГЦ нет
                                                                      И циклические зависимости он собирает?
                                                                      Ответить
                                                                      • При ARC компилятор просто сам вставляет retain/release в нужные места.

                                                                        За разрешением циклических зависимостей нужно следить самому при помощи weak/unowned.
                                                                        Ответить
                                                                  • > Говно прекарсно живет, и решает проблемы через жопу.

                                                                    В жемчужины философской мысли!
                                                                    Ответить
                                                            • показать все, что скрытоvanished
                                                              Ответить
                                                            • показать все, что скрытоvanished
                                                              Ответить
                                              • >> он умеет не только в SQL инъекции, но и в сегфолты?

                                                Я забыл, что «Phalcon» уже не единственный фреймворк с сегфолтами. Ещё есть «YAF», его даже в документацию по «PHP» добавили:
                                                https://www.php.net/manual/ru/book.yaf.php

                                                Maintainer: Xinchen Hui.
                                                Ответить
                                                • Посмотрел «YAF». Он написан на чистой сишке, а не на каком-то говне. Даже тесты приложены.
                                                  Ответить
                                                  • Ты снял ОЗК и принял душ? Или до сих пор сидишь на своём говне?
                                                    Ответить
                        • Ставлю драйвер 10-й версии — а у него интерфейса AddIn.Line45 нет. У него новый интерфейс AddIn.Fptr10.
                          Ответить
                        • Я теперь догадываюсь, в чём проблема: у этой питушни у каждой версии свои названия объектов. Вероятно, у него документация от одной версии, а на машине, на которой он тестирует, установлена другая версия драйверов.
                          Ответить
    • «Многие из вас при подключении торгового оборудования к 1С:Предприятие 7.7 Торговля и Склад, в частности, дисплеев покупателей, сталкивались с различными проблемами. Например, драйвер дисплея покупателя от АТОЛ прост в настройке и подключении (достаточно прописать в настройках торгового оборудования внешнюю компоненту Line1C.dll и указать программный идентификатор AddIn.Line45), однако в бесплатной версии, драйвер работает в демонстрационном режиме и в каждую четвертую позицию выводимого на дисплей покупателя текста вставляет символ *. Альтернативным вариантом драйверам от АТОЛ, являются драйвера дисплея покупателя Штрих, которые можно скачать на официальном сайте в разделе поддержки (рекомендуется устанавливать версию 2.1).

      Однако штатной обработки для подключения дисплея покупателя с драйвером Штрих, ни в комплекте поставки ТиС 9.2, ни в комплекте поставки драйверов дисплея покупателя от Штрих попросту нет. В результате получается патовая ситуация. Драйвера от АТОЛ в бесплатном режиме не предоставляют необходимый функционал, драйвера Штрих бесплатны и, казалось бы, отлично работают, но их невозможно подключить к 1С.»


      Отсюда: http://dml.compkaluga.ru/forum/index.php?showtopic=68584

      Какой багор )))
      Ответить
    • Документация по драйверу:
      http://kkm78.ru/wp-content/uploads/2011/09/Drayver-PD.pdf
      Ответить
      • Кокококая интересная функция у драйвера:

        OpenDrawer ()
        ОткрытьЯщик ()
        Открывает денежный ящик.
        Название Тип Дост. Значения
        Выходные свойства
        DrawerOpened
        ЯщикОткрыт
        Log RW Состояние денежного
        ящика:
        FALSE / TRUE
        Описание свойств
        DrawerOpened
        ЯщикОткрыт [ВЫХ]
        Если DrawerOpened = TRUE, то денежный ящик открыт.
        Если DrawerOpened = FALSE, то денежный ящик закрыт.
        Ящик не откроется, если он заперт на ключ.
        Поддерживаемое оборудование
        Метод поддерживается только моделями с подключаемым денежным
        ящиком.
        Ответить
        • Осталось найти функцию ОтвлечьКассира().
          Ответить
          • Поскольку в любом скрипте на «PHP» по законам жанра должны быть уязвимости, ящик будет самопроизвольно открываться в неподходящее время.
            Ответить
          • Давай думать, какую информацию нужно вывести на экран кассира, чтобы он отвлёкся и не заметил, как из ящика тырят деньги.
            Ответить
    • https://phpclub.ru/talk/threads/Проблема-с-кодом-на-сайте.86817/
      Помогите пожалуйста, появилась вот такая ошибка на сайте, при загрузки корточки товара.
      Код ошибки:
      
      [ParseError]
      syntax error, unexpected '">"' (T_CONSTANT_ENCAPSED_STRING) (0)
      
      Часть кода где эта ошибка появляется
      
      <a href="<?=($viewImgType==" :="">" data-bx-app-ex-href="" class="" data-bx-app-ex-class="" title="" data-bx-app-ex-title=""&gt;>
      <img src="null" id="<span id=" title="Код PHP: &lt;? echo $arItemIDs[&quot;ALL_ITEM_IDS&quot;]['PICT']; ?&gt;" class="bxhtmled-surrogate">
      <span class=" data-bx-app-ex-href="><span class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on"
       spellcheck="false">Код PHP</span></span>" src="" data-bx-app-ex-src="<?=$arFirstPhoto['SMALL']['src']; ?>" <?=($viewImgType=="MAGNIFIER"
       ? 'data-large="" xpreview="" xoriginal=""': "");?> alt="" data-bx-app-ex-alt="&lt;span id="bxid516534823" title="Код PHP: &lt;?=$alt;?&gt;"
       class="bxhtmled-surrogate"&gt;<?=$alt;?><span class="bxhtmled-surrogate-inner"><span class="bxhtmled-right-side-item-icon"></span><span
       class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>" title="&lt;span id="bxid467447014" title="Код PHP:
       &lt;?=$title;?&gt;" class="bxhtmled-surrogate"&gt;<?=$title;?><span class="bxhtmled-surrogate-inner"><span
       class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>"
       itemprop="image"&gt;
      <div class="zoom"></div>
      </a>

      Еба-а-а-ать! В аду для программистов их явно заставляют чинить и править именно такой код.
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • Мы просто любим обмазываться несвежим PHP и смеяться.
          Ответить
          • показать все, что скрытоvanished
            Ответить
          • показать все, что скрытоvanished
            Ответить
          • Кстати, сам «phpclub» сейчас на движке «Xenforo» — движок форума с функциями соцсети поверх фреймворка «Zend Framework». Коммерческий, но за пару минут можно нагуглить нулённый архив.

            Ловите реальный пример кода:
            <?php
            
            // generates an rgba png based on colors in inputs, part of XenForo
            
            $r = getFromInput('r');
            $g = getFromInput('g');
            $b = getFromInput('b');
            $a = getFromInput('a', 255);
            
            header('Content-type: image/png');
            header('Expires: Wed, 01 Jan 2020 00:00:00 GMT');
            header('Cache-Control: public');
            
            echo "\x89PNG\r\n\x1A\n" // signature
            	. "\x00\x00\x00\x0DIHDR\00\x00\x00\x0A\x00\x00\x00\x0A\x08\x03\x00\x00\x00\xBA\xEC\x3F\x8F" // header
            	. getPngChunk('PLTE', pack('CCCCCC', $r, $g, $b, $r, $g, $b))
            	. getPngChunk('tRNS', pack('CC', $a, $a))
            	. "\x00\x00\x00\x0EIDAT\x08\xD7\x63\x60\x84\x03\x06\xDA\x33\x01\x15\xEA\x00\x65\x39\xA1\xDA\x84" // data
            	. "\x00\x00\x00\x00IEND\xAE\x42\x60\x82"; // end
            
            function getFromInput($key, $default = 0)
            {
            	if (!isset($_REQUEST[$key]))
            	{
            		return $default;
            	}
            
            	return min(255, max(0, intval($_REQUEST[$key])));
            }
            
            function getPngChunk($chunkName, $data)
            {
            	return pack('N', strlen($data)) . $chunkName . $data . pack('N', crc32($chunkName . $data));
            }
            Ответить
            • Это был реальный пример кода без ООП. А вот реальный пример кода с ООП:
              <?php
              
              $startTime = microtime(true);
              $fileDir = dirname(__FILE__);
              
              require($fileDir . '/library/XenForo/Autoloader.php');
              XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');
              
              XenForo_Application::initialize($fileDir . '/library', $fileDir);
              XenForo_Application::set('page_start_time', $startTime);
              
              $fc = new XenForo_FrontController(new XenForo_Dependencies_Public());
              $fc->run();

              Как всё сложно... Именно поэтому «Конардо» против «ООП».
              Ответить
      • Что за "Код PHP" размазано по всему коду?
        Ответить
      • &lt;?=
        Ответить
      • > href="<?=($viewImgType==" :="">"
        > <img src="null" id="<span id="
        > class=" data-bx-app-ex-href="
        > куча бессмысленных span

        Вореции какие-то. Напоминает как выхлоп бредогенератора, когда к нему на вход код попадал.
        Ответить
        • А управленных span id="bxid467447014" title="on"
          spellcheck="false">Код PHP</span></span>" src="null" id="<?=$arFirstPhoto['SMALL']['src']; ?>" <?=($viewImgType==" :="">" data-bx-app-ex-title="" data-large="" xpreview="" xoriginal="">"
          > <img src="" data-bx-app-ex-href="<?=($viewImgType==" :="">"
          > <img src="null" id="<span><span>" src="null" id="<span class="bxhtmled-surrogate-inner"> <img src="null" id="<span class="bxhtmled-right-side-item-icon"></span>"
          itemprop="image"&gt;>
          <img src="null" id="bxid467447014" title;?&gt;" class="bxhtmled-surrogate-item-icon"></span><span class="bxhtmled-right-side-item-icon"></span><span
          class="bxhtmled-right-side-item-icon" spellcheck="false">Код PHP</span></span>"
          itemprop="image"&gt;<?=$title;?><span class="bxhtmled-surrogate">
          <span class="bxhtmled-right-side-item-icon"></span>" title="Код PHP</span class=" data-large="" xpreview="" title="" data-bx-app-ex-hreads/Проблема-сайте.86817/
          Ответить
      • Я всё-таки надеюсь, что оригинальный код испорчен движком форума «phpclub.ru», потому что ОП его не обернул в тег [ code ].
        Ответить
        • Посмотрел в соседних тредах, там код вне тега [code] не испорчен.
          Ответить
      • Могу еще часть кода прислать, может понятнее станет
        Ответить
        • Последняя надежда пропала...

          Погуглил «bxhtmled» — CSS-классы с таким префиксом генерирует «Битрикс». Это выхлоп «Битрикса», пропущенный через какой-то извращатель «HTML».
          Ответить
        • Ещё немножко погуглил. У «Битрикса» есть WYSIWYG-редактор под названием «CHTMLEditor». Очень похоже, что чувак выдрал HTML-код из страницы, сгенерированной «Битриксом», потом попытался его отредактировать в этом «CHTMLEditor», а «CHTMLEditor» всё распидорасил.
          Ответить
    • Предварительное резюме:
      • Объект «AddIn.Line8» присутствует только в драйверах v.8.
      • Объект «AddIn.Line45» присутствует с самых древних версий по v.8 (включительно).
      • Начиная с v.9 (первый выпуск — 2013-й год) старые объекты не поддерживаются. Какой багор )))

      Короче, если у питуза не говно мамонта, то придётся принять за щеку изучить новую документацию и переписать код сопряжения с нуля. В новых версиях драйвера библиотеки Line1C.dll больше нет. Выгрызка из документации по 10-й версии драйвера:
      «Для подключения драйвера как COM-объект необходимо зарегистрировать в системе библиотеку addin_fptr10_x86.dll (addin_fptr10_x64.dll в случае 64-битного приложения) с помощью команды regsvr32.exe. Библиотека может сама обнаружить установленный через инсталлятор драйвер. Также инсталлятор автоматически регистрирует компонент заданной архитектуры в процессе установки. В проекте необходимо создать объект типа ActiveX (или OLE) класса AddIn.Fptr10. В данной документации описаны примеры работы с драйвером в виде OLE-объекта на языке Delphi.»
      Ответить
      • Зачем, зачем ты всё это читаешь?
        Ответить
        • Сначала зомбирующий поет:
          "Малость говнокода тензорный питух читает.
          Малость объект «AddIn.Line8» присутствует с самых древних версий по v.8 (включительно).
          Малость объект «AddIn.Line45» присутствует с самых древних версий по v.8 (включительно).
          Малость начиная с v.9 (первый выпуск — 2013-й год) старые объекты не поддерживаются.
          Малость какой багор )))"

          Затем:
          "Много говнокода тензорный питух читает.
          Много объект «AddIn.Line8» присутствует с самых древних версий по v.8 (включительно).
          Много объект «AddIn.Line45» присутствует с самых древних версий по v.8 (включительно).
          Много начиная с v.9 (первый выпуск — 2013-й год) старые объекты не поддерживаются.
          Много какой багор )))"

          ( Поют несколько раз. Ассистенты зомбирующего повторяют посе каждого раза "Зачем? Зачем?" )
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • Да он и так уже любую проблему за пару дней разбирает... Куда ему ещё качаться то?
            Ответить
          • Смотрите, что нашёл. В шестой версии (2006-го года) были драйвера для DOS:
            procedure CallDRVI(Command: byte; ParamString: String; Section: byte);
            var
              SegStr, OfsStr: word;
              i: integer;
              Vector: pointer;
              IntVec: byte;
              Code: integer;
            begin
              ResultCode := 0;
              IntVec := $60;
              GetIntVec(IntVec, Vector);
              if (Vector = nil) then
                begin
                Application.Done;
                Writeln('Ошибка при попытке использования драйвера DRVI.EXE');
                halt;
                end;
              { запись параметров команды и вызов прерывания }
              SegStr := Seg(ParamString);
              OfsStr := Ofs(ParamString)+1;
              asm
                mov ax,SegStr
                mov es,ax
                mov bx,OfsStr
                mov ah, Command
                int 60h
                mov ResultCode, al
                mov ax,es
                mov SegStr,ax
                mov OfsStr,bx
              end;
              { чтение строки }
              i := 1; ResultStr := '';
              While (i<255)and(Mem[SegStr:OfsStr] <> $0d) do
              begin
                ResultStr := ResultStr + Char(Mem[SegStr:OfsStr]);
                Inc(i); Inc(OfsStr);
              end;
            end;
            Ответить
          • А в десятой версии есть модуль на «Питоне»:
                def __init__(self, lib_path):
                    assert sys.version_info >= (2, 6)
                    self.lib_path = lib_path
                    if platform.system() == 'Windows':
                        if not self.lib_path.endswith('fptr10.dll'):
                            self.lib_path = os.path.join(self.lib_path, 'fptr10.dll')
                        try:
                            ctypes.CDLL(os.path.join(os.path.dirname(self.lib_path), 'msvcp140.dll'), mode=ctypes.RTLD_LOCAL)
                            self.library = ctypes.CDLL(self.lib_path, mode=ctypes.RTLD_LOCAL)
                        except OSError:
                            self.lib_path = os.path.join(
                                QueryValueEx(
                                    OpenKey(
                                        HKEY_LOCAL_MACHINE,
                                        "Software\\ATOL\\Drivers\\10.0\\KKT"),
                                    "INSTALL_DIR")[0],
                                'bin\\fptr10.dll')
                            ctypes.CDLL(os.path.join(os.path.dirname(self.lib_path), 'msvcp140.dll'), mode=ctypes.RTLD_LOCAL)
                            self.library = ctypes.CDLL(self.lib_path, mode=ctypes.RTLD_LOCAL)
                    elif platform.system() == 'Darwin':
                        if not self.lib_path.endswith('fptr10.framework/fptr10'):
                            self.lib_path = os.path.join(self.lib_path, 'fptr10.framework/fptr10')
                        try:
                            self.library = ctypes.CDLL(self.lib_path, mode=ctypes.RTLD_LOCAL)
                        except OSError:
                            self.lib_path = lib_path
                            if not self.lib_path.endswith('libfptr10.dylib'):
                                self.lib_path = os.path.join(self.lib_path, 'libfptr10.dylib')
                            self.library = ctypes.CDLL(self.lib_path, mode=ctypes.RTLD_LOCAL)
                    else:
                        if not self.lib_path.endswith('libfptr10.so'):
                            self.lib_path = os.path.join(self.lib_path, 'libfptr10.so')
                        self.library = ctypes.CDLL(self.lib_path, mode=ctypes.RTLD_LOCAL)
            Ответить
            • О, так оно даже под линуксом и маком работает.
              Ответить
              • «Мак» поддерживается только 64-битный, «Линукс» — и 32, и 64, причём и «Интел», и «ARM».

                Там ещё есть интерфейс для «Андроида», для «iOS», и для «Йажи». Хотя я не представляю себе кассовый аппарат на «iOS» и сколько пердолинга понадобится для установки (его же без джейлбрейка не поставишь).
                Ответить
                • > кассовый аппарат

                  Дык эти фискальные регистраторы часто к обычным компам подключают. Я даже сам прикручивал к одной проге.

                  Видимо кто-то и из айпада терминал умудрился сделать :)
                  Ответить
                • > я не представляю себе кассовый аппарат на «iOS»
                  - та ладно, просто погугли "кассовый аппарат iOS", куча вариантов разной степени хардварности.

                  Я вроде даже видел портативный принтер чеков, который надевался на телефон.
                  Ответить
            • показать все, что скрытоvanished
              Ответить
              • Я думал, как это сделать. Оказывается, способ есть (только PHP 7.4):
                https://www.php.net/manual/ru/class.ffi.php
                https://www.php.net/manual/ru/ffi.examples-basic.php

                В «Пекле» ещё лежит реализация 2004-го года, но она для совсем древних интерпретаторов:
                http://pecl.php.net/package/ffi

                Протолкнул в «PHP 7.4» это расширение Дмитрий Стогов:
                https://wiki.php.net/rfc/ffi
                Ответить
        • показать все, что скрытоvanished
          Ответить
    • Блять. Я думал такие персонажи бывают только во второсортных анекдотах.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • "...чел генерит JS из PHP, тут его ждет волшебное царство отладки."
        Ответить

    Добавить комментарий