Имя: Пароль:
1C
 
ВК 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
Вот, что жаба позволила выложить, можно взять здесь:

http://webfile.ru/4903585
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?