|
Как перейти на 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, так и падает. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |