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

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

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

Я однажды накололся указав неправильно точную версию платформы 1С в ланчере, а т.к. у меня стояло много разных то выбор x64 был проигнорирован в пользу x86 указанной версии которая стояла только x86.
9 Garykom
 
гуру
06.08.19
16:51
(8)+ Сорри
Инфо.ТипПлатформы
10 Кирпич
 
06.08.19
17:08
(0)Манифест не исправил
11 H A D G E H O G s
 
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
12 H A D G E H O G s
 
06.08.19
17:15
Используйте COM, не любите мозги. Это на будущее.
13 Вафель
 
06.08.19
17:17
(12) может у человека линукс
14 Кирпич
 
06.08.19
17:23
(13) судя по 'd:\1.log' нифига не Linux :)
15 H A D G E H O G s
 
06.08.19
17:23
Пардон, int остался 4 байтным. Как и должен быть.
16 H A D G E H O G s
 
06.08.19
17:28
Все норм. В структуре
TV8ProcRec = packed record

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

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

А то очень хочется написать ВК на Golang без прокладки на С++.
24 H A D G E H O G s
 
06.08.19
22:05
(23) Взяли и написали аналоги.
Кто бы объяснил, как люди умудрились разобрать кусок трэша на C++.
25 palsergeich
 
06.08.19
22:29
(24) дешёвый кокаин тому виной, наверное
26 v77
 
06.08.19
23:22
(0) мож у тебя v8napi древний?
27 v77
 
06.08.19
23:23
я зимой вк писал. все работало
28 Garykom
 
гуру
07.08.19
11:22
(24) У меня пока с объектами C++ засада, не понимаю как на обычном C (его Golang умеет) без объектов их сэмулировать
29 alex_ak1
 
07.08.19
13:17
(23) Указать на функциях stdcall и все, происходит вызов функций по другому соглашению и все.
30 alex_ak1
 
07.08.19
13:18
(26) Не знаю. Качал с интернетов, потом сравнивал побайтам, все точно совпадает. Может кинете свой новый?
31 Garykom
 
гуру
07.08.19
13:49
(29) Просто с функциями я разобрался, но там объекты С++ в них загвоздка
32 Кирпич
 
07.08.19
14:31
33 H A D G E H O G s
 
07.08.19
14:35
(32) Это ты на видео?
34 Garykom
 
гуру
07.08.19
14:39
(32) О спасибо
35 Кирпич
 
07.08.19
14:40
(33) Почти :)
36 Garykom
 
гуру
07.08.19
14:47
(34)+ По сути мне хватило бы слова vtable чтобы разобраться, сам не сталкивался до этого как эта механизма работает.
Чтобы найти и прочитать https://ru.wikipedia.org/wiki/Таблица_виртуальных_методов
Выходит кроссплатформенно не получится на Go, придется под каждую платформу свой вариант
37 alex_ak1
 
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 и программа почти сразу заработала.
38 H A D G E H O G s
 
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 уже лет пять стоят
41 alex_ak1
 
07.08.19
15:09
(38) Ну что я могу сказать. Ты оказался прав :) А я немножк тормоз. Только у меня не THandle, а поинтер, но сути это не меняет, размер одинаковый.

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

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