Имя: Пароль:
1C
1С v8
v8: Образец внешней компоненты Native API для 8.2 (Infostart)
,
0 romix
 
31.07.11
13:39
С июльского ИТС скачал папку VNCOMP82 - какой версией VS компилить, не совсем понятно. :-) У кого есть Дельфийский образчик (от Кирпича или другой) положите пож. на стабильный хостинг типа Народ.ру (или пришлите мне я положу), а то в v8: ВК NativeAPI и Delphi похоже время истекло.
1 Кирпич
 
01.08.11
10:09
Ищи на инфостарте
2 romix
 
01.08.11
10:48
(1) А нашел спасибо http://infostart.ru/public/81644/ сейчас заценю.

Кстати штатная с ИТС не скомпилилась VS 2005 (говорит не та версия), качнул 2010 тоже чего то оно сначала конвертит, а потом ругается на нехватку файла. Стало быть методом исключения - для компиляции примера от 1С был нужен VS 2008.
3 romix
 
01.08.11
13:07
Пока не сообразил как там отобразить исключение (AddError?) - сделал сообщением и возвратом False.
4 Кирпич
 
01.08.11
13:33
V8.AddError наверное. я не помню уже.
5 romix
 
01.08.11
13:37
(4) Я там сделал вот так:

function _CallAsFunc(Obj: PV8ObjectRec; const lMethodNum: integer;
 pvarRetValue, paParams: PV8Variant; const lSizeArray: integer): boolean;
 stdcall;
begin
 try
   result := _V8CF(Obj.RelObj1.ClassReg.MethList[lMethodNum].Execute)
     (Obj.RelObj1, pvarRetValue, PV8ParamArray(paParams), lSizeArray);
 except
   on e: Exception do begin
     ShowBalloon(e.message, 'Ошибка внешней компоненты', 3000);
     result := false;
   end;
 end;
end;


ShowBalloon показывает желтое всплывающее сообщение в трее.
Как там подсоединить V8 пока непонятно.
6 romix
 
01.08.11
13:43
Кажется так Obj.RelObj1.V8.addError();
7 romix
 
01.08.11
13:53
Obj.RelObj1.V8.addError(1006, 'Внешняя компонента', pWideChar(err), E_FAIL);

(выводит сообщение с восклицательным знаком).
8 Кирпич
 
01.08.11
14:09
Ну задумывалось, что обработку ошибок будут делать в реализации методов.
Там просто писать V8.addError(1006, 'Внешняя компонента', pWideChar(err), E_FAIL);
9 romix
 
01.08.11
14:12
(8) Неа, там я просто выбрасываю исключение, а обработка в CallAsFunc. Иначе исключение 1С обрушивает... Вот так вроде нормально всё:


function _CallAsFunc(Obj: PV8ObjectRec; const lMethodNum: integer;
 pvarRetValue, paParams: PV8Variant; const lSizeArray: integer): boolean;
 stdcall;
var err: WideString;
begin
 try
   result := _V8CF(Obj.RelObj1.ClassReg.MethList[lMethodNum].Execute)
     (Obj.RelObj1, pvarRetValue, PV8ParamArray(paParams), lSizeArray);
 except
   on e: Exception do begin
     err:=e.Message;
     Obj.RelObj1.V8.addError(1006, 'Внешняя компонента', pWideChar(err), E_FAIL);
     result := false;
   end;
 end;
end;
10 Кирпич
 
01.08.11
14:40
Ну я и говорю что эти все try except должны быть в реализации метода. Ну если так хочется, то ради бога.
11 romix
 
01.08.11
17:50
Сделал компоненту, которая была нужна, с системными фенечками (запуск процесса, переключение клавиатуры и др.) - думаю, многим пригодится http://infostart.ru/public/88060/ Еще раз спасибо за помощь.
12 romix
 
02.08.11
13:40
Что-то не удается вызвать событие
ExternalEvent(wszSource, wszMessage, wszData);
13 Кирпич
 
02.08.11
15:46
Методом тыка добился следующего
если пишешь вот такое

   V8.ExternalEvent('Hello','From','Delphi');
   V8.AddError(1007, 'Внешняя компонента','ошибочка вышла', 0);
   result := true;

то работает.

и в модуле управляемого приложения

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
   Сообщить(Источник);
   Сообщить(Событие);
   Сообщить(Данные);
КонецПроцедуры

фигня какая то.
14 Кирпич
 
02.08.11
15:53
Или так

ОбъектВК.ВызватьВнешнеееСобытие();
Предупреждение("ла ла да");
15 romix
 
03.08.11
15:12
(14) Я вот так сделал:


function TMyClass.CreateEventFunc(RetValue: PV8Variant; Params: PV8ParamArray;  const ParamCount: integer; v8:TV8AddInDefBase): boolean;
var
 wszSource, wszMessage, wszData: WideString;
begin

 wszSource := V8AsWString(@Params[1]);
 wszMessage := V8AsWString(@Params[2]);
 wszData := V8AsWString(@Params[3]);
 v8.ExternalEvent(pWideChar(wszSource), pWideChar(wszMessage), pWideChar(wszData));

 Result := true;

end;


-------------

function _CallAsFunc(Obj: PV8ObjectRec; const lMethodNum: integer;
 pvarRetValue, paParams: PV8Variant; const lSizeArray: integer): boolean;
 stdcall;
var err: WideString;
begin
 try
   result := _V8CF(Obj.RelObj1.ClassReg.MethList[lMethodNum].Execute)
     (Obj.RelObj1, pvarRetValue, PV8ParamArray(paParams), lSizeArray, Obj.RelObj1.V8);
 except
   on e: Exception do begin
     err:=e.Message;
     Obj.RelObj1.V8.addError(1006, 'Внешняя компонента', pWideChar(err), E_FAIL);
     result := false;
   end;
 end;
end;


Действительно без Предупреждение оно чего-то не отрабатывает. Штрихкоды оно так же будет читать, что ли. :-)
17 romix
 
04.08.11
15:02
Может там переменная при выходе из функции уничтожается...1
18 Кирпич
 
08.08.11
16:01
(17) Видимо да. Загрузил ВК в модуле приложения. Все заработало.

Перем ОбъектВК экспорт;

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
   Сообщить(Источник);
   Сообщить(Событие);
   Сообщить(Данные);
КонецПроцедуры

Процедура ПриНачалеРаботыСистемы()
   ПодключитьВнешнююКомпоненту("C:\temp\LNAPI\units\test1CNativeLib\sample\demo.dll","DemoLib",AddInType.Native);
   ОбъектВК = Новый("AddIn.DemoLib.ВторойКласс");  
КонецПроцедуры
19 romix
 
08.08.11
16:58
(18) И у меня тоже так получилось.
Почему-то я думал что глобальные переменные (в гл. модуле) они убрали.
20 H A D G E H O G s
 
08.08.11
17:13
Я тут был.
21 romix
 
08.08.11
17:15
Сейчас выложу на инфостарт что получилось.
22 romix
 
08.08.11
21:02
Положил новую версию с событиями: http://infostart.ru/public/88060/
Независимо от того, куда вы едете — это в гору и против ветра!