|
ВК NativeAPI и Delphi | ☑ | ||
---|---|---|---|---|
0
Кирпич
12.11.10
✎
10:12
|
Поковырял я это NativeAPI, вроде хорошо всё. Только вот подумал, а как же писать это на Delphi? Там же возникает страшный гемор от С++ с множественным наследием.
Так как "Преимуществ никаких у линукс нет"(с) и на Delphi всё делается быстрее, почему бы на Delphi не писать. Кто уже пробовал, поделитесь опытом. |
|||
1
Кирпич
12.11.10
✎
11:20
|
Похоже никто этой проблемой ещё не занимался.
|
|||
2
supremum
12.11.10
✎
11:22
|
(0) Ну так рассказал бы, что там хорошего тогда )
|
|||
3
Кирпич
12.11.10
✎
11:25
|
Ну хорошего там только одно: нет COM.
|
|||
4
Кирпич
12.11.10
✎
11:25
|
остальное всё плохо )
|
|||
5
Rie
12.11.10
✎
11:28
|
(1) А в чём проблема состоит?
|
|||
6
Кирпич
12.11.10
✎
11:39
|
(5)Как в Delphi писать NativeAPI ВК? По технологии нужно подсунуть 1С объект класса IComponentBase, а он с множественным наследованием(непонятно зачем). А в Delphi не множественного наследования и C++ класс из Delphi не понимает.
|
|||
7
Кирпич
12.11.10
✎
11:42
|
А в Delphi нет множественного наследования и 1С объект, созданный в Delphi, не понимает.
|
|||
8
Кирпич
12.11.10
✎
11:45
|
В Delphi нет множественного наследования и 1С не понимает объект, созданный в Delphi.
хху. написал таки ))) |
|||
9
supremum
12.11.10
✎
11:47
|
(8) Борланд С++ Буилдер может тогда?
|
|||
10
Rie
12.11.10
✎
11:49
|
(6) IComponentBase - это же интерфейс. Ему по барабану, какое там наследование. Интерфейсы Delphi поддерживает прекрасно.
И не наследовать от него надо, а реализовать. |
|||
11
DmitrO
12.11.10
✎
11:58
|
Delphi вроде как вполне себе поддерживает наследование от нескольких интерфейсов. Там нет наследования от нескольких классов.
|
|||
12
DmitrO
12.11.10
✎
11:59
|
т.е. по их бесовским убеждениям только одну реализацию можно наследовать :)
|
|||
13
Кирпич
12.11.10
✎
11:59
|
(10) Щас попробую интерфейсы
|
|||
14
DmitrO
12.11.10
✎
12:02
|
(10) ну не то чтобы побарабану так то ;)
порядок-то виртуальных функций соблюсти придется :) |
|||
15
DmitrO
12.11.10
✎
12:07
|
Проблема состоит в том, что нет материалов (аналогичных *.h файлам с++) для разработки в Delphi от 1С.
Кирпич будет первый кто их разработает. |
|||
16
Кирпич
12.11.10
✎
12:33
|
Не прокатят интерфейсы. С 1С не пытается получать интерфейс через IUnknown. Подсунуть интерфейс ручками тоже не катит т.к. структура класса в Delphi не совместима с С++(таблица интерфейсов), а 1С тупо обращается к объекту ВК как к объекту С++. Если бы не было множественного наследования, то прокатило бы просто в виде класса с виртуальными методами.
|
|||
17
DmitrO
12.11.10
✎
15:08
|
незнаю незнаю, я конечно в Delphi не спец, но..
>>С 1С не пытается получать интерфейс через IUnknown 1С и не должна получать IUnknown. IUnknown это COM интерфейс. В Native нет ничего от COM. Объект должен быть создан при вызове экспортируемой из dll функции GetClassObject, по средством ее 1С получает указатель на объект. >>а 1С тупо обращается к объекту ВК как к объекту С++ нет не с++, все виртуальные методы объявлены с соглашением о вызове __stdcall, такое же применяется везде в WINAPI и COM. Ты же в Delphi как-то можешь писать COM объекты. И тут значит тоже сможешь. Просто класс и его виртульные методы надо объявить грамотно. Соглашение о вызовах и порядок методов надо соблюсти. |
|||
18
orefkov
12.11.10
✎
15:44
|
Я вот просто не понимаю, нахрена вообще эти псевдо-нативные ВК нужны? Что вам так не хватает в штатной 8ке, что свою ВК надоть?
|
|||
19
Кирпич
12.11.10
✎
17:30
|
(18) ну бывает всякое. железку прицепить какую нибудь к 1С.
(17)"Объект должен быть создан при вызове экспортируемой из dll функции GetClassObject, по средством ее 1С получает указатель на объект." Да в том то и проблема, что 1с понимает только интерфейс класса С++, а интерфейс класса Delphi не понимает. Потому что класс Delphi устроен по другому. |
|||
20
H A D G E H O G s
12.11.10
✎
17:36
|
Вы, блин, меня заинтриговали..
Кирпич, вы потом о результатах напишите, мне влезать во все это неохото, а вот нахаляву - я не против. |
|||
21
orefkov
13.11.10
✎
08:31
|
(19)
Так все таки что возвращает GetClassObject - указатель на объект или указатель на абстрактный С++ интерфейс? Интерфейс в С++ устроен очень просто - в первых 4х байтах лежит указатель - адрес массива, в котором, в свою очередь, лежат адреса функций, реализующих интерфейс. Лежат в том порядке, как функции описаны в интерфейсе. Все функции - __stdcall, то есть в них первым неявным параметром передается адрес интерфейса. те метод С++ интерфейса void __stdcall SomeClass::SomeMethod(int x, int y) { this->x = x; } и обычная функция void __stdcall SomeMethod(SomeClass* pThis, int x, int y) { pThis->x = x; } абсолютно одинаковы вплоть до машинных кодов. Дельфи особо не знаю, так что в терминах Дельфей вряд ли все распишу. Может DmitrO че еще подскажет. |
|||
22
Кирпич
13.11.10
✎
10:31
|
А вот код из примера 1С
ong GetClassObject(const WCHAR_T* wsName, IComponentBase** pInterface) { if(!*pInterface) { *pInterface= new CAddInNative; return (long)*pInterface; } return 0; } |
|||
23
Кирпич
13.11.10
✎
10:37
|
И в дельфи и в си++ указатель на объект - это указатель на таблицу виртуальных методов. Только в IComponentBase три таблицы виртуальных методов, потому что он наследован от трех виртуальных классов. В Delphi нет множественного наследования и может быть только одна таблица виртуальных методов. В этом несовместимость.
|
|||
24
orefkov
13.11.10
✎
11:34
|
(23)
У меня под рукой пока нет описания нативных ВК, но сдается мне, что в заголовках от 1С тоже наследование не от классов, а от интерфейсов, те от таких классов, в которых только объявлены методы, но не объявлены никакие данные. Позже посмотрю точнее и отпишусь. В крайнем случае можно создать структуру (record), в которою положить три указателя на массивы с адресами методов. |
|||
25
orefkov
13.11.10
✎
11:35
|
+(24)
А вот множественное наследование от интерфейсов в Дельфях есть. |
|||
26
Кирпич
13.11.10
✎
13:17
|
"В крайнем случае можно создать структуру (record), в которою положить три указателя на массивы с адресами методов."
Я так и сделал. Других вариантов похоже нету. |
|||
27
Кирпич
13.11.10
✎
15:03
|
кажись конфетку сделал. ВК делается сама собой. Минимальная ВК с одним классом и одним методом выглядит так. Остальное делается автоматом.
{ library Project1; uses SysUtils, v8wrap, v8classes, v8types, v8utils; type TMyClass = class(TV8UserObject) function GetValueType(RetValue: PV8Variant; Params: PV8ParamArray; const lSizeArray: integer): boolean; end; { TMyClass } function TMyClass.GetValueType(RetValue: PV8Variant; Params: PV8ParamArray; const lSizeArray: integer): boolean; begin V8SetWString(RetValue, 'Привет из Delphi!'); result := True; end; begin with ClassRegList.RegisterClass(TMyClass, 'MySuperExtention', 'TMyClass') do begin AddFunc('GetValueType', 'ДайТипЗначения', @TMyClass.GetValueType, 1); end; end. } |
|||
28
Topol-M
13.11.10
✎
15:40
|
* закладочка
|
|||
29
MM
13.11.10
✎
17:25
|
(27) А тексты модулей v8wrap, v8classes, v8types, v8utils попадут в общий доступ?
|
|||
30
Кирпич
15.11.10
✎
17:12
|
||||
31
IceSer1
15.11.10
✎
17:20
|
(30) интересно, буду тестить..
|
|||
32
Кирпич
15.11.10
✎
17:21
|
Пардон. Лучше здесь.
http://webfile.ru/4903614 |
|||
33
H A D G E H O G s
15.11.10
✎
17:24
|
(32) Черкни статью в КЗ!?
|
|||
34
Кирпич
15.11.10
✎
17:25
|
(33) А чо такое КЗ?
|
|||
35
Кирпич
15.11.10
✎
17:26
|
(+34) Понял
|
|||
36
H A D G E H O G s
15.11.10
✎
17:27
|
(35) КоЗа - суровая и беспощадная.
http://www.kb.mista.ru/ |
|||
37
IceSer1
15.11.10
✎
18:56
|
сдать ветку в kb
|
|||
38
Кирпич
15.11.10
✎
20:27
|
Ну и самая правильная версия. )) В предыдущей шаблон проекта малость неправильный.
http://webfile.ru/4904302 |
|||
39
zag2art
20.11.10
✎
14:37
|
(38) а как же v8wrap?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |