Имя: Пароль:
1C
1С v8
1c + COM написанный на DelphiXE2
0 qeos
 
04.05.12
11:50
ктонить такое делал?
есть пример?
1 H A D G E H O G s
 
04.05.12
11:56
Делал.
Какие трудности возникли?
2 qeos
 
04.05.12
12:02
ну по существу..

в обычном приложении есть событие:
   procedure OnStatusChange(Sender: TObject; aEvent: longint; aExtendedErrorCode: Longint; const aMessage: string);

я добавил IConnectorEvents - OnStatusChange в интерфес, в этом событии ShowMessage.. но оно ни разу не вызывается.
т.е. вызовы функций кома работают из 1С, но никаких окон не всплывает.

собственно как вообще делается события и как они обрабатываются?
3 qeos
 
04.05.12
12:05
и вообще есть описание 1CIts/EXE/VNCOMP82/doc/ExtCompT.htm

но толи я его не понимаю толи я не так делаю..
я делаю как в http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=539119
но в описании:
Модальные диалоги создаются самой компонентой, но при их создании необходимо в качестве родительского окна указать окно, возвращаемое методом GetAppMainFrame для того, чтобы диалог не воспринимался операционной системой как отдельная задача с кнопкой на полосе задач

как это вызвать из компоненты?
чтото непонятно это все.
4 H A D G E H O G s
 
04.05.12
12:07
Кинь проект на [email protected]
5 qeos
 
04.05.12
12:15
ушло
6 H A D G E H O G s
 
04.05.12
12:27
Половины pas файлов нету, нету примера в 1С, непонятно, кто должен вызывать OnStatusChange(), квик, dll, или 1С.
Бида.
7 qeos
 
04.05.12
12:31
ща объясню..
есть dll для работы с терминалом.. при ее инициализации мы указываем callback функцию для обработки событий (стр 112 в QConnector.pas), после этого события вызывают функцию OnStatusChange.

так вот чтото они при использовании Com объекта не работают.. т.е. непонятно, может такое вообще невозможно реализовать ((
8 H A D G E H O G s
 
04.05.12
12:37
Пишушуюся DLL -ка - это прокладка между 1С и dll-терминалом?
9 H A D G E H O G s
 
04.05.12
12:37
Как call-back прописываешь?
10 H A D G E H O G s
 
04.05.12
12:38
11 H A D G E H O G s
 
04.05.12
12:38
Пост 11 в ветке (10) объясняет эту хитрость.
12 qeos
 
04.05.12
13:37
ну.. вызов-то все равно должен происходить? даже если там все подпорчено, то и брекпоинт должен сработать и выдать сообщение должно, может и с запорченным текстом но окошко-то должно показаться?

и еще. а эту твою ситуацию разными директивами нельзя поправить? а-ля StdCall и типо того.
13 qeos
 
04.05.12
14:04
накопал кое что.. возможно у меня не вызывается CreateHandle от TWinControl..
собственно два вопроса: почему и как здалать чтоб он вызвался?
14 H A D G E H O G s
 
04.05.12
14:10
(12) Вызов и не должен вызываться, если ты адрес функции неправильно указываешь.
15 Serginio1
 
04.05.12
15:15
(14) Если он указывает адрес объектной функции то вызов должен произойти, просто при этом в регистре EAX вроде не будет значения Self, что может привести краху если будет обращения к полям объект.
(0) Посмотри http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019
там есть примеры работы с окнами. В том числе и Исходник ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender сам им пользуюсь уже лет 10. В том числе и для СОМ на C#.
16 qeos
 
04.05.12
15:22
не.. у меня есть часть кода которая делает callback.. там в начале:

// =============================================================================
procedure ConnectionStatusCallback(nConnectionEvent   : LongInt;
                                  nExtendedErrorCode : LongInt;
                                  lpcstrInfoMessage  : LPCSTR); stdcall;
var
 Itm : PReplyQueueItem;
begin
 if Assigned(ReplyQueue) and (ComponentHandle <> 0) then
 begin


Но условие не проходит и вызова нет..
ReplyQueue вроде как создается, а вот ComponentHandle это


       procedure   CreateHandle; override;
....

procedure .CreateHandle;
begin
 inherited;
 ComponentHandle := Handle;
end;

этот CreateHandle наследуется от TWinControl..
вызова этой процедуры почемуто не происходит...

вот щас копаю почему...
17 qeos
 
04.05.12
15:26
слушай, вот есть у меня функция у кома, а как показать какоенибудь окно? создавать его програмно на winapi? или как то форму можно сделать как в обычном проекте?
18 Serginio1
 
04.05.12
15:48
Специально посмотрел исходники и демо
там в
procedure TAddinTypeInfo.InitFrom1C(const pCon: IDispatch);
Var wnd: HWND;
   pExtWndsSupport:IExtWndsSupport;
begin
    If Not Assigned(pConn) Then
    Begin
    pConn := pCon;
    PEvent := nil;
    IDispatch(pCon).QueryInterface(IAsyncEvent,PEvent);
    pExtWndsSupport := nil;
    IDispatch(pCon).QueryInterface(IExtWndsSupport,pExtWndsSupport);
    If Assigned(pExtWndsSupport) Then
    Begin
    pExtWndsSupport.GetAppMainFrame(wnd);
    Application.Handle := wnd;
    pExtWndsSupport.GetAppMDIFrame(ChildWnd);
    end;
    end;
end;

Form2:=TForm1.CreateParented(ChildWnd);
19 qeos
 
04.05.12
16:23
(18) не чтото у меня ничго подобного даже близко.... (((
20 Serginio1
 
04.05.12
16:43
Это 7 ка. Но что то подобное должно быть и в DelphiXE2. Даже в C# можно присваивать хэндлы окон.
21 qeos
 
04.05.12
16:52
решил зайти с другой стороны.. за транслирую пример кома для С#..
22 qeos
 
04.05.12
17:05
незнаю, может ветку новую создать?

вобщем добавляю интерфейс
interface IPropertyProfile : IPropertyBag

но у меня нет нигде IPropertyBag

т.е. как бы есть в VB но хз то или нет
http://my.jetscreenshot.com/5394/20120504-5amz-39kb.jpg
23 Serginio1
 
04.05.12
17:18
public interface IPropertyBag


Name: System.Windows.Forms.UnsafeNativeMethods+IPropertyBag
Assembly: System.Windows.Forms, Version=4.0.0.0
24 qeos
 
05.05.12
11:39
написал набросок чтоб понятно было, что разработка в delphi отличается от примеров от 1С.
http://qeos.ru/?page=COM_napisannyi_na_DelphiXE2_dlya_1C&nav=1

пока пробую перевести пример с ИТС на дельфю.
25 Serginio1
 
05.05.12
12:26
Смотри v8: А как 1С хранит числа в памяти?
При передаче через ком, число переводится в Double
26 Serginio1
 
05.05.12
12:29
Так у тебя даже не Double а Single
А есть Decimal?
27 Кирпич
 
05.05.12
12:34
(24) ты погоди пока статьи писать. тем, кто имеет понятие, это читать смешно, а тем кто не понимает, это читать вредно.
28 Serginio1
 
05.05.12
12:38
Попробуй TDecimal он
Тип данных OLE Automation Тип данных Delphi  Примечание
Decimal                   TDecimal           96-битное десятичное число
29 qeos
 
05.05.12
15:21
(27) вот так все время и рубится.. типо вы все г.вно, а я один умный.
взял бы да помог.
30 qeos
 
05.05.12
15:21
+(27) какой мануал? КАКОЙ?
31 Кирпич
 
05.05.12
15:24
Помогаю. Сначала выясни что такое интерфейс и что такое реализация интерфейса. Потом читай документрацию от 1С (на диске ИТС есть).  Найди в гугле статьи по написанию внешних компонент. Потом приходи задавать вопросы.
32 qeos
 
05.05.12
15:31
facepalm
2 + 2 = 3.9999999999999999999999999999999...