Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как перейти на Native API х64

Как перейти на Native API х64
Я
   alex_ak1
 
06.08.19 - 15:50
Есть проект на дельфи x32, который успешно работает в 1С.
Как его переделать на х64 бита? Просто смена платформы на х64 в новом дельфи не помогает. Компонент даже не грузится как длл (в дллмайн и инициализацию вставил messagebox), а они не показываются.
 
 
   Garykom
 
1 - 06.08.19 - 16:07
   Garykom
 
2 - 06.08.19 - 16:07
   Garykom
 
3 - 06.08.19 - 16:08
После смены платформы надо еще правильно зарегать в системе.

Ну или выкинуть проект и переписать с COM на NativeAPI по https://its.1c.ru/db/metod8dev#content:3221:hdoc
   H A D G E H O G s
 
4 - 06.08.19 - 16:19
Давай сюда свой проект
liveups@yandex.ru
   alex_ak1
 
5 - 06.08.19 - 16:44
(1) Проект на натив апи, на ком переписывать смысла нет.
   alex_ak1
 
6 - 06.08.19 - 16:45
(3) В смысле? Это же не ком, я просто ПодключитьВнешнююКомпоненту( "ляля64.длл" ) делаю и все.
   alex_ak1
 
7 - 06.08.19 - 16:45
(2) Натив апи у меня, а не ком.
   Garykom
 
8 - 06.08.19 - 16:49
Тогда после изменения платформы на x64 и компиляции, при попытке подключения проверь разрядность 1С.

Инфо = Новый СистемнаяИнформация;
Сообщить(""+"Версия 1С: " + Инфо.ВерсияПриложения);

Я однажды накололся указав неправильно точную версию платформы 1С в ланчере, а т.к. у меня стояло много разных то выбор x64 был проигнорирован в пользу x86 указанной версии которая стояла только x86.
   Garykom
 
9 - 06.08.19 - 16:51
(8)+ Сорри
Инфо.ТипПлатформы
   Кирпич
 
10 - 06.08.19 - 17:08
(0)Манифест не исправил
   H A D G E H O G s
 
11 - 06.08.19 - 17:14
dll -ка подключается, но вываливается на AssignFile( f, 'd:\1.log' );

Если убрать - диалоги found/exit выводятся, но потом 1С падает по доступу к памяти.
Сейчас я скачаю свежее для C++ и посмотрю немного на типы, в Дельфи там integer везде, а в x64 он стал 8 байт, возможно, есть места, где он должен остаться в 2 байта.
Ну и
function SleepFunc(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer; var v8:TV8AddInDefBase): boolean;
должна выглядеть как
function SleepFunc(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer): boolean;

хотя могли поменять, я давно забил на NativeAPI
   H A D G E H O G s
 
12 - 06.08.19 - 17:15
Используйте COM, не любите мозги. Это на будущее.
   Вафель
 
13 - 06.08.19 - 17:17
(12) может у человека линукс
   Кирпич
 
14 - 06.08.19 - 17:23
(13) судя по 'd:\1.log' нифига не Linux :)
   H A D G E H O G s
 
15 - 06.08.19 - 17:23
Пардон, int остался 4 байтным. Как и должен быть.
   H A D G E H O G s
 
16 - 06.08.19 - 17:28
Все норм. В структуре
TV8ProcRec = packed record

поля Destroy должны быть такими
Destroy1: THandle;
Destroy2: THandle;
Destroy3: THandle;
   H A D G E H O G s
 
17 - 06.08.19 - 17:30
Когда переводишь проект на x64, надо переменные, хранящие адреса не в виде указателя, а в виде числа проверять на размерность. Адреса в x64 - 8 байтные.
   Diversus
 
18 - 06.08.19 - 18:27
А у кого-нибудь есть полный комплект примера ВК на Delphi для x32 и x64?
Такая же проблема как и у автора топика. Есть ВК на x32 работает нормально, а вот на x64 не работает...
   v77
 
19 - 06.08.19 - 19:07
Да всё там работает. Главное ничо не менять по пьянке.
   alex_ak1
 
20 - 06.08.19 - 20:26
(11) лог - просто создать блокнотом файл. А если его создать, то оно прекрасно роняет 1с в любом случае.

Про sleepfunc с аргументами надо посмотреть, что там как обьявлять верно. Может и впрямь аргументы кривые и стдкалл падает именно в этом месте.
   alex_ak1
 
21 - 06.08.19 - 20:27
(15) Вот именно. Инт - 4 байта, а указатель же 8 байт. ЗАполнение структуры с destroy1 меня тут смущает - чем мы его заполняет-то
   H A D G E H O G s
 
22 - 06.08.19 - 20:30
(21) Адресами функций вы его заполняете.
   Garykom
 
23 - 06.08.19 - 21:07
Кто бы объяснил как на Delphi/Lazarus умудрились эмулировать C++ кэллбэки и главное объекты C++?

А то очень хочется написать ВК на Golang без прокладки на С++.
   H A D G E H O G s
 
24 - 06.08.19 - 22:05
(23) Взяли и написали аналоги.
Кто бы объяснил, как люди умудрились разобрать кусок трэша на C++.
   palsergeich
 
25 - 06.08.19 - 22:29
(24) дешёвый кокаин тому виной, наверное
   v77
 
26 - 06.08.19 - 23:22
(0) мож у тебя v8napi древний?
   v77
 
27 - 06.08.19 - 23:23
я зимой вк писал. все работало
   Garykom
 
28 - 07.08.19 - 11:22
(24) У меня пока с объектами C++ засада, не понимаю как на обычном C (его Golang умеет) без объектов их сэмулировать
   alex_ak1
 
29 - 07.08.19 - 13:17
(23) Указать на функциях stdcall и все, происходит вызов функций по другому соглашению и все.
   alex_ak1
 
30 - 07.08.19 - 13:18
(26) Не знаю. Качал с интернетов, потом сравнивал побайтам, все точно совпадает. Может кинете свой новый?
 
 Рекламное место пустует
   Garykom
 
31 - 07.08.19 - 13:49
(29) Просто с функциями я разобрался, но там объекты С++ в них загвоздка
   Кирпич
 
32 - 07.08.19 - 14:31
   H A D G E H O G s
 
33 - 07.08.19 - 14:35
(32) Это ты на видео?
   Garykom
 
34 - 07.08.19 - 14:39
(32) О спасибо
   Кирпич
 
35 - 07.08.19 - 14:40
(33) Почти :)
   Garykom
 
36 - 07.08.19 - 14:47
(34)+ По сути мне хватило бы слова vtable чтобы разобраться, сам не сталкивался до этого как эта механизма работает.
Чтобы найти и прочитать https://ru.wikipedia.org/wiki/Таблица_виртуальных_методов
Выходит кроссплатформенно не получится на Go, придется под каждую платформу свой вариант
   alex_ak1
 
37 - 07.08.19 - 15:04
Разобрался, все заработало!
Дельфийский v8napi самостоятельно реализует VMT-таблицу для класса (не интерфейса!) IComponentBase : IInitDoneBase, ILanguageExtenderBase, LocaleBase и создает эту таблицу путем записи кучи указателей в структуру  TV8ProcRec.
В этой структуре есть указатели на все подряд функции вида init/setmemmanager/getinfo и другие (около 20 штук их). Также в структуре содержатся магические поля-указатели на ничего (судя по всему, это некие vpointer-ы для каждого класса). Их значение не используется (так как нигде не инициализируется), но важен их размер. В исходном v8napi.pas они типа integer (4 байта). При переходе на 64 бита их тип оставался integer на 4 байта, а вот размер указателя изменялся на 8 байт, в результате структура сдвигалась полями и все оказывалось в жопе. Заменил integer на pointer и программа почти сразу заработала.
   H A D G E H O G s
 
38 - 07.08.19 - 15:05
(37) Ептеть. Я тебе об этом сказал еще вчера.
   Кирпич
 
39 - 07.08.19 - 15:06
(36) Ага. Для windows нужно как в ms vc++, а для Linux как в GCC
   Кирпич
 
40 - 07.08.19 - 15:08
(37) я ж говорю скачай новый. там pointer уже лет пять стоят
   alex_ak1
 
41 - 07.08.19 - 15:09
(38) Ну что я могу сказать. Ты оказался прав :) А я немножк тормоз. Только у меня не THandle, а поинтер, но сути это не меняет, размер одинаковый.

Киньте ссылку на новый v8napi плиз.
   H A D G E H O G s
 
42 - 07.08.19 - 15:13
Почему NativeAPI ? Зачем вы страдаете? Есть же прекрасный COM
   Кирпич
 
43 - 07.08.19 - 15:15
(41) загугли
   alex_ak1
 
44 - 07.08.19 - 15:17
(42) Зачем 1с, если есть чудесный дельфи! Бросить все это и писать на дельфи 7 на парадоксе!
   Garykom
 
45 - 07.08.19 - 15:18
(42) Не смог освоить НативАПИ?
   Garykom
 
46 - 07.08.19 - 15:19
(45)  ;)
   H A D G E H O G s
 
47 - 07.08.19 - 15:34
(45) Ну я стал писать XDTO сериализацию чтобы гонять ТЗ,массивы и вот это всё. Потом увидел, что это мертворожденное дитя и COM еще будет жить и полноценно на сервере 1С и без регистрации в реестре, если знать как его готовить и забил.
   Garykom
 
48 - 07.08.19 - 16:03
(47) Сериализация в/из JSON простейшая на 1С, далее в ВК на NativeAPI тупо строки отправляем в нужной кодировке и назад аналогично.
Это если много данных надо туды/сюды и пошустрее.
   Вафель
 
49 - 07.08.19 - 16:04
(48) несерьезный подход
   Garykom
 
50 - 07.08.19 - 16:09
(49) В смысле? Скажи какой серьезный, когда база 1С на фреше в облаке под линуксом?
   Garykom
 
51 - 07.08.19 - 16:09
(50)+ Когда ВК пашет через JSON, то переписать на http-сервисы простейше.
   Сияющий в темноте
 
52 - 07.08.19 - 18:26
В Си int всегда равен регистру процессора,то есть в 64 битах будет 8 байт.
отличие нативе от кома в том,что нулевой указатель-это деструктор,т.к.в ком мы классы не удаляем,а просто обнуляем счетчик ссылок,но здесь так не получится.
в остальном,таблица функций-это структура с указателями на функции,что в нативе что в ком,если мы берем чистый Си,и нужно помнить,что винда любит StdCall,и боюсь,что Linux любит другие вызовы.
опять же,для размера и адреса есть свои типы size_t и т.п.чтобы не ходить по граблям,а система define, позволяет нарисовать код,который можно компилять в 32 и 64 бита под любую платформу.
   Сияющий в темноте
 
53 - 07.08.19 - 18:35
json по скорости опережает xml,а самое главное,типизация без xdto.
   rphosts
 
54 - 07.08.19 - 18:39
(49) зато надёжно как молот и эффективно как серпом по яйцам!
   rphosts
 
55 - 07.08.19 - 18:39
+ (54) и реализация проще чем АК
   Diversus
 
56 - 09.08.19 - 10:13
(37) Если не сложно, не могли бы выложить исправленный вариант ВК, который подходит и под x64?
Что там поправить?
   Diversus
 
57 - 09.08.19 - 10:42
В TV8ProcRec
изменение у свойств записи 
Destroy1: integer;
Destroy2: integer;
Destroy3: integer;

типов c integer хоть на THandle, хоть на Pointer ничего не дает.
Как падало на x64, так и падает.


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