|
Использование IPropertyPage при написании внешней компоненты 1С (7.7) на C# | ☑ | ||
---|---|---|---|---|
0
Lexxxxx
06.10.10
✎
11:50
|
Пытаюсь писать свою внешнюю компоненту для 1С согласно вот этой (http://abc.vvsu.ru/Books/ebooks_iskt/%DD%EB%E5%EA%F2%F0%EE%ED%ED%FB%E5%F3%F7%E5%E1%ED%E8%EA%E8/1%D1/Documentation/Documentation/tsvk00.html) доке.
Раздел (http://abc.vvsu.ru/Books/ebooks_iskt/%DD%EB%E5%EA%F2%F0%EE%ED%ED%FB%E5%F3%F7%E5%E1%ED%E8%EA%E8/1%D1/Documentation/Documentation/tsvk001.html#_Toc502332891), посвященный страницам свойств крайне "насыщен" полезной информацией. Выяснилось что если мой класс имеет интерфейс IPropertyPage то в 1С - Параметры появляется закладка. Однако я не могу понять как на нее теперь накидать контролов и как правильно реализовать все методы IPropertyPage. И для чего нужен интерфейс IPropertyPageSite. Короче я в растерянности. Литературу по написанию ВК 1С в интернете всю перечитал. Самым информативным мне показался вот этот (http://www.gotdotnet.ru/blogs/IgorKissil/6341/) источник. Но и в нем все то пропущено, то опущено, а моя квалификация пока не позволяет допереть самому до правильного решения. Никто не может подсказать по шагам как и что делается при написании своей страницы свойств? |
|||
1
МихаилМ
06.10.10
✎
11:55
|
(0)
научите, как получить доступ по ссылкам в http://abc.vvsu.ru. |
|||
2
Lexxxxx
06.10.10
✎
12:15
|
Дока http://ic-other.z03.org.ua/zOther/manual/tsvk/ztsvk001.html
(а тут свои сообщения править нельзя?) |
|||
3
Lexxxxx
06.10.10
✎
12:52
|
up
|
|||
4
Rie
06.10.10
✎
13:04
|
(0) Почитай здесь: http://www.rsdn.ru/article/com/proppages.xml
|
|||
5
Rie
06.10.10
✎
13:07
|
+(4) Хотя что именно было непонятно по ссылке http://www.gotdotnet.ru/blogs/IgorKissil/6341/ ?
|
|||
6
Lexxxxx
06.10.10
✎
13:28
|
Читал я и там.
Практически все не понятно. Не пойму, "кто на ком стоять должен". Для чего интерфейс IPropertyPageSite и как на страницу контролов накидать. Не ясна общая организация работы с IPropertyPage. Пока что ясно в голове уляглось, так это то, что мой класс должен иметь интерфейс IInitDone (с этим проблем нет) и IPropertyPage (тогда сразу появляется закладка). Уже понятно как задать заголовок и размер этой страницы (используя IPropertyPage.GetPageInfo своего класса public void GetPageInfo(out tagPROPPAGEINFO pPageInfo) { pPageInfo = new tagPROPPAGEINFO(); //pPageInfo.cb = (UInt32)Marshal.SizeOf(typeof(tagPROPPAGEINFO)); (и без этого нормально вроде. зачем оно?) pPageInfo.pszDocString = "Example Property Page for PB IDE"; (тоже не пойму нафига? где оно отображается?) //pPageInfo.pszHelpFile = String.Empty; (можно просто не инициализировать.) pPageInfo.size.cx = 300; pPageInfo.size.cy = 300; } Ну а дальше то что делать? В отладчике удалось выяснить что порядок вызова методов IPropertyPage при вызове окна параметров 1С следующий: 1) SetPageSite 2) SetObjects 3) GetPageInfo 4) IsPageDirty 5) IsPageDirty Видимо что-то надо делать в этих методах, ведь не зря их 1С вызывает? Из описания IPropertyPage http://msdn.microsoft.com/ru-ru/library/ms691246.aspx ничего толком понять не могу (скорее всего просто туплю, но куда деваться). Кто нибудь может на простом русском языке объяснить как и что за чем делать? |
|||
7
Lexxxxx
06.10.10
✎
15:28
|
up
|
|||
8
Lexxxxx
06.10.10
✎
19:48
|
Ну не уж-то правда никто не знает? Ведь на этом форуме крутятся такие монстры программирования под 1С! Где же они?
|
|||
9
H A D G E H O G s
06.10.10
✎
21:38
|
"Монстры" программирования 1С юзают рассово верный Дельфи и ничем помочь не могут.
|
|||
10
Lexxxxx
06.10.10
✎
21:56
|
Думаю очень могут помочь! Так как мне нужно разобраться не с самим C#, а с общим порядком действий. Что именно нужно делать в методах, реализующих IPropertyPage? Вроде в SetPageSite нужно только сохранить ссылку на переменную типа IPropertyPageSite (еще не понял для чего), или нужно что-то еще? Что делать в SetObjects ? Мне нужно уяснить общие принципы, что-то вроде "кто на ком стоял".
Например в доке написано что " используются интерфейсы IPropertyPage или ISpecifyPropertyPages (объект может реализовать любой из этих интерфейсов)". Значит нужно реализовывать любой один из них? Но ведь ISpecifyPropertyPages состоит всего из одного метода. Так какой интерфейс нужен все таки? (подозреваю все таки IPropertyPage). |
|||
11
Torquader
07.10.10
✎
00:46
|
IPropertyPage::Activate
Creates the dialog box for the property page (without a frame, caption, or system menu/controls) using hWndParent as the parent window and prc as the positioning rectangle. The bModal flag indicates the modality of the dialog box frame (in the current implementation of OleCreatePropertyFrame and OleCreatePropertyFrameIndirect, this parameter is always TRUE). The text in the dialog should match the locale obtained through IPropertyPageSite::GetLocaleID |
|||
12
Torquader
07.10.10
✎
00:47
|
А потом показать
IPropertyPage::Show Makes the property page dialog box visible or invisible according to the nCmdShow parameter. If the page is made visible, the page should set the focus to itself, specifically to the first property on the page. |
|||
13
H A D G E H O G s
07.10.10
✎
00:48
|
(11) Правильно, Torquader, пожосче с ними!
|
|||
14
Torquader
07.10.10
✎
00:49
|
P.S. а на обычных сях так и не дописал компоненту, так как оказалось, что каждым первым параметром должен идти указатель на This, который в Си не воспринимается.
Но, OLE-сервер получился (причём многопоточный - и лечился только Reset-от отчасти) |
|||
15
H A D G E H O G s
07.10.10
✎
00:53
|
(14) Мне вот интересно, в какой фирме такие монстры, как ты, работают?
|
|||
16
Torquader
07.10.10
✎
01:01
|
(15) Мы не монстры, мы просто пытаемся сделать то, что другие отказались делать - и, надо сказать, что иногда даже получается.
|
|||
17
Torquader
07.10.10
✎
01:03
|
Ладно - мне пора спать - чего и вам желаю - а мне завтра предстоит сервис доделывать, который сеть должен мониторить - но "телега не едет"
|
|||
18
trdm
07.10.10
✎
01:26
|
1С++.dll
ADDIN.h файл: class CAddIn : public IInitDone, public ILanguageExtender, public IPropertyLink, public CComObjectRoot, public CComCoClass<CAddIn, &CLSID_ExtraC>, public IPropertyPageImpl<CAddIn>, public CDialogImpl<CAddIn> { BOOL m_EnabledCheckType; // This property enables or disables component CButton m_boxEnabledCheckType; // Corresponded check box BOOL m_AccessCheckType; BOOL m_EnableOptimizate; CButton m_boxOptimizate; BOOL m_AccessOptimizate; BOOL m_EnableDebugging; CButton m_boxEnableDebugging; BOOL m_AccessEnableDebugging; CButton m_boxEnabledColor; CButton m_boxLocalColor; CButton m_boxShowKL; ........... // Interfaces BEGIN_COM_MAP(CAddIn) COM_INTERFACE_ENTRY(IInitDone) COM_INTERFACE_ENTRY(ILanguageExtender) COM_INTERFACE_ENTRY(IPropertyLink) COM_INTERFACE_ENTRY_IMPL(IPropertyPage) END_COM_MAP() //DECLARE_NOT_AGGREGATABLE(CAddIn) // Remove the comment from the line above if you don't want your object to // support aggregation. enum {IDD = IDD_ADDIN_PROP_PAGE}; LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnCommand(WORD wNotify, WORD wID, HWND hWnd, BOOL& bHandled); BEGIN_MSG_MAP(CAddIn) MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog) // Sample WM_COMMAND handler COMMAND_CODE_HANDLER(BN_CLICKED,OnCommand) COMMAND_CODE_HANDLER(EN_CHANGE,OnCommand) CHAIN_MSG_MAP(IPropertyPageImpl<CAddIn>) END_MSG_MAP() .... // IPropertyPage public: /* Unnecessary functions are simply commented instead of calling parent class implementation */ STDMETHOD(Deactivate)(); STDMETHOD(Apply)(); ..... }; |
|||
19
trdm
07.10.10
✎
01:27
|
ADDIN.CPP
...... LRESULT CAddIn::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { AFX_MANAGE_STATE(AfxGetStaticModuleState()) IPropertyLink *pLink = NULL; m_ppUnk[0]->QueryInterface(IID_IPropertyLink,(LPVOID *)&pLink); m_boxEnabledCheckType.Attach(GetDlgItem(IDC_CHECK_TYPE)); m_boxOptimizate.Attach(GetDlgItem(IDC_OPTIMIZATE)); m_boxEnableDebugging.Attach(GetDlgItem(IDC_ENABLE_DEBUGGING)); if (pLink != NULL) { pLink->get_Enabled((unsigned char *)&m_EnabledCheckType, IDC_CHECK_TYPE); pLink->get_Enabled((unsigned char *)&m_EnableOptimizate, IDC_OPTIMIZATE); pLink->get_Enabled((unsigned char *)&m_EnableDebugging, IDC_ENABLE_DEBUGGING); pLink->get_Enabled((unsigned char *)&m_bEnabledColor, IDC_ENCOLOR); pLink->get_Enabled((unsigned char *)&m_bLocalColor, IDC_LOCALCOLOR); pLink->get_Enabled((unsigned char *)&m_bShowKL, IDC_SHOWKL); pLink->Release(); } m_boxEnabledCheckType.SetCheck(m_EnabledCheckType?1:0); m_boxOptimizate.SetCheck(m_EnableOptimizate?1:0); m_boxEnableDebugging.SetCheck(m_EnableDebugging?1:0); m_boxEnabledCheckType.EnableWindow(m_AccessCheckType); m_boxOptimizate.EnableWindow(m_AccessOptimizate); m_boxEnableDebugging.EnableWindow(m_AccessEnableDebugging); m_boxEnabledColor.Attach(GetDlgItem(IDC_ENCOLOR)); m_boxEnabledColor.SetCheck(m_bEnabledColor?1:0); m_boxLocalColor.Attach(GetDlgItem(IDC_LOCALCOLOR)); m_boxLocalColor.SetCheck(m_bLocalColor?1:0); m_boxShowKL.Attach(GetDlgItem(IDC_SHOWKL)); m_boxShowKL.SetCheck(m_bShowKL?1:0); SetDirty(FALSE); ......... } |
|||
20
trdm
07.10.10
✎
01:28
|
enum {IDD = IDD_ADDIN_PROP_PAGE};
Эта строка как не трудно догадаться описывает идентификатор ресурса диалогового окна страницы свойств. ПС. Теперь понятно? |
|||
21
trdm
07.10.10
✎
01:30
|
IDD_ADDIN_PROP_PAGE DIALOGEX 0, 0, 260, 209
STYLE WS_CHILD FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN GROUPBOX "Информация для пользователей:",IDC_STATIC,7,7,246,195, BS_CENTER | BS_FLAT CONTROL "Проверка типов",IDC_CHECK_TYPE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_PUSHLIKE | WS_TABSTOP,98,184,63,12, WS_EX_STATICEDGE CONTROL "Оптимизация",IDC_OPTIMIZATE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_PUSHLIKE | WS_TABSTOP,22,184,63,12, WS_EX_STATICEDGE EDITTEXT IDC_EDIT1,15,23,229,144,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | ES_NUMBER | WS_VSCROLL | WS_HSCROLL,WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE CONTROL "Отладчик",IDC_ENABLE_DEBUGGING,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_PUSHLIKE | WS_TABSTOP,173,184,63,12, WS_EX_STATICEDGE CONTROL "Раскраска",IDC_ENCOLOR,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,22,170,63,12,WS_EX_STATICEDGE CONTROL "Выб. раскраска",IDC_LOCALCOLOR,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,98,170,63,12,WS_EX_STATICEDGE CONTROL "Показать часы",IDC_SHOWKL,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,173,170,63,12,WS_EX_STATICEDGE END |
|||
22
trdm
07.10.10
✎
01:34
|
дальше куритЪ тут: http://www.1cpp.ru/
|
|||
23
Lexxxxx
07.10.10
✎
09:58
|
А зачем в примере http://www.gotdotnet.ru/blogs/IgorKissil/6341/ реализует ISpecifyPropertyPage, а не IPropertyPage непосредственно у компонента?
|
|||
24
Lexxxxx
07.10.10
✎
10:31
|
(смайлик, показывающий выпученные глаза) А что это ночью тут было? Вы с кем разговаривали?
|
|||
25
trdm
07.10.10
✎
15:02
|
Я показывал как это в VS C++ делается.
Можно было по аналогии догадаться.. |
|||
26
Lexxxxx
07.10.10
✎
16:06
|
Мдя! Тупо перевел на шарп (и выкинул использование ISpecifyPropertyPage) пример http://www.gotdotnet.ru/blogs/IgorKissil/6341/ вроде все работает, но понимания проиходящего не пришло. Просто передрал как попугай. И все таки нафиг нужен ISpecifyPropertyPage?
|
|||
27
Lexxxxx
08.10.10
✎
13:46
|
Подскажите, для чего все таки нужен ILanguageExtender? Кругом одни размытые фразы. Напишите строку кода 1С для компоненты MyExtComponent, которая не будет работать если компонента не реализует ILanguageExtender.
|
|||
28
Рэйв
08.10.10
✎
13:54
|
||||
29
Рэйв
08.10.10
✎
13:54
|
||||
30
Рэйв
08.10.10
✎
13:58
|
+
>>Подскажите, для чего все таки нужен ILanguageExtender? ILanguageExtender - Данный интерфейс определяет логику вызова функций, процедур и свойств внешнего компонента из 1С. |
|||
31
trdm
08.10.10
✎
14:04
|
http://aitika.ru/otvety/1759-1c-Nauchite-pisat-VK-?p=2
(33)Мы говорим, что ВК должен иметь интерфейс IInitDone. Это значит что при попытке загрузить ВК 1с будет искать в твоей ВК реализацию этого интерфейса. Если данной реализации 1с не найдет- грузить ВК она не будет, т.к. посчитает, что это не ВК. Далее в 1С ты создаешь объект твоей ВК. И пытаешься вызвать ее метод. Например ВК=СоздатьОбъект("AddIn.MyVK"); ВК.ГромкоПикнуть(); Что делает 1С? Она ищет в твоей ВК реализацию методов FindMethod/GetNParams/HasRetVal/CallAsFunction(CallAsProcedure) интерфейса ILanguageExtender. Т.е. автор ВК придумал, что 1С будет выполнять методы ВК через заданные в стандарте методы FindMethod/GetNParams/HasRetVal/CallAsFunction(CallAsProcedure) |
|||
32
Lexxxxx
08.10.10
✎
15:07
|
"Т.е. автор ВК придумал, что 1С будет выполнять методы ВК через заданные в стандарте методы FindMethod/GetNParams/HasRetVal/CallAsFunction(CallAsProcedure)"
Да, но на сколько я знаю все методы и свойства ВК доступны и без реализации ILanguageExtender, т.е. ВК=СоздатьОбъект("AddIn.MyVK"); ВК.ГромкоПикнуть(); будет прекрасно работать и при наличии (а если почти совсем честно, то и без него тоже :) ) реализации IInitDone. Мало того, если вызывать методы и свойства ВК, которые не используют в своей реализации интерфейсы 1С, ВК даже загружать не надо! Достаточно лишь зарегистрировать свою ВК как СОМ-объект и написать СоздатьОбъект(ТутПишемЗареганноеСОМ-Имя). Так нафиг тогда нужен ILanguageExtender? |
|||
33
Lexxxxx
08.10.10
✎
17:54
|
Так для чего все таки нужен ILanguageExtender?
|
|||
34
Rie
08.10.10
✎
18:00
|
(32) А как у тебя с реализацией IDispatch?
Чьи именно методы ты вызываешь - внешней компоненты или ActiveX (который тоже создаётся через СоздатьОбъект). |
|||
35
Lexxxxx
08.10.10
✎
18:51
|
"А как у тебя с реализацией IDispatch?"
Не имею ни малейшего понятия. :) Чьи именно методы ты вызываешь - внешней компоненты или ActiveX (который тоже создаётся через СоздатьОбъект). Вызываю методы своей длл-ки. При чем тут ActiveX? |
|||
36
Rie
08.10.10
✎
18:59
|
(35) При том, что если ты не реализовал ILanguageExtender, то они вызываются через IDispatch. Точно так же, как если бы ты создал ActiveX, не связываясь с внешней компонентой.
Иными словами, твоя .dll - НЕ является внешней компонентой. |
|||
37
Lexxxxx
08.10.10
✎
19:14
|
"если ты не реализовал ILanguageExtender, то они вызываются через IDispatch."
Ну и какая разница? Какая выгода от реализации ILanguageExtender? Что такого я не смогу сделать в 1С с моей компонентой если не реализую ILanguageExtender? Или что я не смогу сделать с 1С в своей компоненте если не реализую ILanguageExtender? |
|||
38
Rie
08.10.10
✎
19:21
|
(37) А кто ж тебя знает, какая там у тебя выгода и чего ты добиваешься? Если тебе достаточно IDispatch - используй IDispatch. Может, тебе это и надо - заодно будешь дёргать свою .dll не только из 1С, но и, к примеру, из Excel.
Понадобится ILanguageExtender - реализуй ILanguageExtender. Смысл его в том, что это - "родной" для 1С интерфейс, только и всего. Там ещё несколько интерфейсов имеется - у самой 1С - для общения с внешними компонентами, например, IAsyncEvent - для передачи событий в 1С. Что тебе нужно, а что не нужно - тут уж решай сам. |
|||
39
Lexxxxx
08.10.10
✎
19:38
|
" Смысл его в том, что это - "родной" для 1С интерфейс, только и всего. "
Не верю! (с) Станиславский :) Встречал такие фразы как: "без него ты не сможешь использовать компоненту как расширение языка" "появляется возможность передавать в компоненту 1с-овские типы данных" Что это может означать на простом русском языке? Если просто реализовать IInitDone, то при передаче в методы ВК чего-то отличного от типов Дата, Строка или Число 1С ругается словами "Плохой тип данных!" Может она разрешит передавать их если у ВК будет ILanguageExtender? Я не верю в то, что 1С придумала и реализовала поддержку довольно сложного интерфейса ILanguageExtender просто так, шоб було! "Там ещё несколько интерфейсов имеется - у самой 1С - для общения с внешними компонентами, например, IAsyncEvent - для передачи событий в 1С. " IAsyncEvent IErrorLog IStatusLine IPrpertyProfile (кажется так) Это я в курсе |
|||
40
Lexxxxx
08.10.10
✎
19:42
|
" Если тебе достаточно IDispatch - используй IDispatch."
Так вот я и хочу решить, достаточно IDispatch мне или нет и придется реализовать ILanguageExtender. Но для того чтобы решить мне нужно знать, что я получу в случае реализации ILanguageExtender? Для чего он, какая от него польза? |
|||
41
Rie
08.10.10
✎
19:43
|
(39)
>> "без него ты не сможешь использовать компоненту как расширение языка" Да. Использовать сможешь - но не как расширение языка. Если для тебя это различие существенно - реализуй ILanguageExtender. Нет - ну, на нет и суда нет. >> "Может она разрешит передавать их если у ВК будет ILanguageExtender?" Нет, не разрешит. >> "Я не верю в то, что 1С придумала и реализовала поддержку довольно сложного интерфейса ILanguageExtender просто так, шоб було!" Верить или не верить - дело твоё. Только имей в виду, что 1С _развивалась_. |
|||
42
Lexxxxx
08.10.10
✎
19:44
|
" Использовать сможешь - но не как расширение языка."
"Если для тебя это различие существенно - реализуй ILanguageExtender." В чем заключается это различие!? |
|||
43
Rie
08.10.10
✎
19:44
|
(40) Для начала - ты пишешь на 7.7 или на 8.x?
Ну а по сути - плюнь на ВК, пиши просто ActiveX. Как окажется, что просто ActiveX почему-то не хватает - тогда и делай внешнюю компоненту. |
|||
44
Lexxxxx
08.10.10
✎
19:45
|
77
|
|||
45
Rie
08.10.10
✎
19:46
|
(42) Не поверишь, но я телетяпией не страдаю. И не знаю, что ты собираешься делать при помощи своей dll.
Что касается различия - почитай описание технологии внешних компонент вообще и ILanguageExtender в частности. И сообрази, оно тебе надо или нет. |
|||
46
Rie
08.10.10
✎
19:48
|
(44) Если 7.7, то (IMHO) основным достоинством внешней компоненты (по сравнению с ActiveX) является возможность передавать в 1С события (через интерфейс IASyncEvent).
|
|||
47
Lexxxxx
08.10.10
✎
19:52
|
" почитай описание технологии внешних компонент вообще и ILanguageExtender в частности. И сообрази, оно тебе надо или нет."
Читаю: "Для расширения встроенного языка компонента должна реализовать интерфейс ILanguageExtender . Этот интерфейс унаследован от IUnknown и предназначен для расширения встроенного языка 1С:Предприятия. Для использования этого расширения необходимо вызвать функцию СоздатьОбъект, передав ей строку вида "AddIn._ИмяРасширения_", где _ИмяРасширения_ возвращается методом этого интерфейса Затем можно использовать созданный объект, вызывая его методы и свойства." Это из правильной доки? Что из этого можно сообразить? "предназначен для расширения встроенного языка 1С:Предприятия. Для использования этого расширения необходимо вызвать функцию СоздатьОбъект, передав ей строку вида "AddIn._ИмяРасширения_", где _ИмяРасширения_ возвращается методом этого интерфейса Затем можно использовать созданный объект, вызывая его методы и свойства." Вот это? Так это ПРЕКРАСНО делается и без ILanguageExtender вообще? Если назначение IInitDone целиком ясно, через него ВК получает ссылку на загрузившую ее 1С и может дергать ее интерфейсы, то НАХЕРА нужен ILanguageExtender совершенно не понятно! |
|||
48
Rie
08.10.10
✎
19:57
|
(47) Нахера? Ну, например, чтобы IDispatch не реализовывать в полном объёме (ILanguageExtender проще). Кроме того, ILanguageExtender - "родной" интерфейс, именно таким способом 1С свои родные компоненты дёргает. Ну или может, требуется "двуязычность" - опять же, ILanguageExtender её даст (с IDispatch, впрочем, тоже можно её сымитировать).
Я не понимаю, чего ты добиваешься. Если тебе не нужна технология внешних компонент - то нахера ты здесь мозги всем паришь? Если нужна - то используй, и всё тут. |
|||
49
Rie
08.10.10
✎
20:00
|
+(48) Посмотри исходники 1С++, если интересно, как можно залезть "внутрь" 1С и что можно сделать.
|
|||
50
Lexxxxx
08.10.10
✎
20:04
|
" чтобы IDispatch не реализовывать в полном объёме"
Зачем его вообще реализовывать? Пишешь длл-ку с одним (или сколько нужно и каких нужно) методом. Регистрируешь ее регасмом и все! " Кроме того, ILanguageExtender - "родной" интерфейс," Ну и что? Это чисто религиозный вопрос? " Ну или может, требуется "двуязычность" - опять же, ILanguageExtender её даст" Вот тут не понятно. Как он ее дает? "Я не понимаю, чего ты добиваешься" Я добиваюсь того чтобы кто нибудь простым русским языком сказал мне для чего нужен этот интерфейс, а не выдавал что-то вроде"расширение языка, пойди почитай" и т.п. Примерно как вот сдесь http://forum.ixbt.com/topic.cgi?id=26:40765 "Если тебе не нужна технология внешних компонент - то нахера ты здесь мозги всем паришь? Если нужна - то используй, и всё тут." Еще раз повторяю, для того чтобы решить нужна она мне или нет я должен знать что она мне даст! |
|||
51
Lexxxxx
08.10.10
✎
20:04
|
"Посмотри исходники 1С++"
Предполагаю они на СРР? Если так, то вряд ли я там разберусь. |
|||
52
zak555
08.10.10
✎
20:05
|
(0) что будет в компоненте ?
|
|||
53
Rie
08.10.10
✎
20:08
|
(50) Что у тебя за задача стоит?
Опиши задачу - и разговор станет предметным. |
|||
54
Lexxxxx
08.10.10
✎
20:09
|
"что будет в компоненте ?"
Для начала хочу разобраться и понять, что к чему. Написать некоторый шаблон ВК, на базе которого можно будет делать ВК по необходимости. На горизонте первая необходимость написать ВК, которая будет опрашивать программную и аппаратную конфигурацию компов в сети и вести учет изменений. Нечто вроде сервиса инвентаризации парка ПК предприятия. Но это потом. Для начала нужно выяснить чем отличается ВК с реализованным ILanguageExtender от ВК без него? |
|||
55
Lexxxxx
08.10.10
✎
20:10
|
"Опиши задачу - и разговор станет предметным."
Разговор уже достаточно предметен! |
|||
56
Chieftain
08.10.10
✎
20:14
|
" Ну или может, требуется "двуязычность" - опять же, ILanguageExtender её даст" Вот тут не понятно. Как он ее дает?
погляди в методе "GetMethodName" параметр "lMethodAlias" в примерах - понятнее станет |
|||
57
Chieftain
08.10.10
✎
20:18
|
(54) я в свое время заморачивался, правда под Delphi. Малость упростил себе создание ВК. http://infostart.ru/public/15527/
|
|||
58
Lexxxxx
08.10.10
✎
20:27
|
/// <summary>
/// Возвращает имя метода по его идентификатору /// </summary> /// <param name="methodNum">Идентификатор метода</param> /// <param name="methodAlias"></param> /// <param name="methodName">Имя метода</param> Блин, тут как на зло нет описания этого параметра. |
|||
59
Rie
08.10.10
✎
20:31
|
(58) А книжку почитать - не судьба?
"lMethodNum порядковый номер метода lAliasNum язык имени метода: 0 - английское наименование 1 - локальное наименование pbstrMethName указатель на строку, содержащую при возврате имя метода" |
|||
60
Chieftain
08.10.10
✎
20:42
|
(58) я ж говорю - примеры изучай, там все сразу на свои места встанет
|
|||
61
Jolly Roger
08.10.10
✎
20:48
|
(47) если мне правильно изменяет склероз, методы, реализованные через ILanguageExtender, доступны в глобальном контексте, а не как методы объекта...
|
|||
62
Lexxxxx
08.10.10
✎
20:50
|
"методы, реализованные через ILanguageExtender, доступны в глобальном контексте, а не как методы объекта..."
Это как будет на языке 1С? |
|||
63
Jolly Roger
08.10.10
✎
20:51
|
(62) как методы встроенного языка
|
|||
64
Chieftain
08.10.10
✎
21:01
|
(63) та не
|
|||
65
Lexxxxx
08.10.10
✎
21:03
|
"как методы встроенного языка"
Например у меня есть ВК "Addin.MyVK" и у нее есть метод int GetNum() и она реализует ILanguageExtender. Как она будет вызываться в коде? ПодключитьВнешнююКомпоненту("Addin.MyVK"); ВК = СоздатьОбъект("Addin.MyVK"); МоеЧисло = ВК.GetNum(); или как-то по другому. |
|||
66
Rie
08.10.10
✎
21:06
|
(65) Именно так и будет вызываться.
|
|||
67
Lexxxxx
08.10.10
✎
21:08
|
"Именно так и будет вызываться."
Тогда в чем разница? |
|||
68
Rie
08.10.10
✎
21:08
|
+(66) Разница - на уровне механизмов COM, а не на уровне синтаксиса встроенного языка 1С.
|
|||
69
Lexxxxx
08.10.10
✎
21:22
|
Странно это все как-то! Ну во всяком случае уже найдена одна польза. Как я понимаю через ILanguageExtender.GetPropName получает русское или английское имя метода. Пока только вот не придумал как методу назначить русское имя. В примерах просто тупо вручную назначают. Пока есть идея, которая слабо отличается от примеров. Развесить на методы атрибуты с русскими именами. А случайно от наличия ILanguageExtender 1С потом не начнет правильно контролировать корректность вызовов методов ВК в коде. Типа как она делает со своими объектами ("недостаточно параметров" и т.п.)?
|
|||
70
Chieftain
08.10.10
✎
21:24
|
(69) начинаешь соображать))
|
|||
71
Rie
08.10.10
✎
21:25
|
(69) Внимательно читавший описание технологии внешних компонент заметил бы метод GetNParams :-)
|
|||
72
Rie
08.10.10
✎
21:27
|
(69) Что касается "как назначить" - посмотри примеры. Там всё есть.
(То есть, не надо ничего "назначать". Надо реализовать интерфейс). |
|||
73
Chieftain
08.10.10
✎
21:31
|
+(69) погляди таки (57) там есть почти все интерфейсы, кроме сабжа по сути, но механику понять должно быть легко. паскаль вроде простой для понимания
|
|||
74
Jolly Roger
08.10.10
✎
21:31
|
(64) чо, все-таки гоню? эх...
|
|||
75
Chieftain
08.10.10
✎
21:32
|
(74) это просто описание методов объекта, реализованного в компаненте
|
|||
76
Lexxxxx
08.10.10
✎
21:34
|
"начинаешь соображать))"
Что именно я угадал? :) "То есть, не надо ничего "назначать". Надо реализовать интерфейс" Вот именно! Ка реализовать, вот в чем вопрос? Есть для примера дллка с одним методом public void GetNum(); Откуда реализация ILanguageExtender.GetPropName возьмет его русское имя? |
|||
77
Rie
08.10.10
✎
21:37
|
(76) Из кода, который ты напишешь. Создаёшь табличку (или дерево, или хеш-таблицу) - и ищешь по ID имя нужного свойства/метода.
Открой всё ж таки примеры - хоть с диска ИТС, хоть здесь на форуме поищи. И сразу всё станет просто и понятно. |
|||
78
Rie
08.10.10
✎
21:37
|
+(77) Вернее, по ID и Alias.
|
|||
79
Rie
08.10.10
✎
21:40
|
+(77) Когда создаёшь ActiveX - точно так же реализуешь IDispatch. С той лишь разницей, что современные умные среды программирования автоматически создают реализацию для IDispatch, а для ILanguageExtender - приходится всё писать ручками.
|
|||
80
Lexxxxx
08.10.10
✎
21:43
|
"Из кода, который ты напишешь."
Где в коде я напишу что мой GetNum() это ПолучитьМойСчатливыйНомерок()? Видимо надо где-то сопоставить имена? Вот я и думаю сделать это при помощи языка атрибутов C#. Вообще мне нравится вот эта http://www.rsdn.ru/article/dotnet/cs1c.xml реализация. Нужно только доделать отбор русских имен из атрибутов. Итак, все таки найдена одна (сомнительная) полезность интерфейса ILanguageExtender . Это возможность назначить именам методов синонимы. Ну так все таки конфигуратор не будет проверять корректность вызовов методов? Вроде у него есть для этого ILanguageExtender.GetNParams. |
|||
81
Chieftain
08.10.10
✎
21:43
|
етить
1. GetNMethods(var plMethods: Integer) получает количество методов реализованных в компоненте в переменную plMethods 2. FindMethod(const bstrMethodName: WideString; var plMethodNum: Integer) получает номер метода по его имени в переменную plMethodNum 3. GetMethodName(lMethodNum, lMethodAlias: Integer; var pbstrMethodName: WideString) получает имя метода компоненты по номеру и алиасу (0-англ,1-локация) в переменную pbstrMethodName 4. GetNParams(lMethodNum: Integer; var plParams: Integer) получает количество параметров по номеру метода в переменную plParams 5. HasRetVal(lMethodNum: Integer; var pboolRetValue: Integer) проверка возможности возвращения значения методом (на функцию) в переменную "pboolRetValue" 6. GetParamDefValue(lMethodNum, lParamNum: Integer; var pvarParamDefValue: OleVariant) возвращает значение по умолчанию для параметра с номером "lParamNum" в методе с номером "lMethodNum" в переменную "pvarParamDefValue" 7. CallAsProc(lMethodNum: Integer; var paParams: PSafeArray{(OleVariant)}) запускает метод как процедуру по номеру, "paParams" - массив входящих параметров 8. CallAsFunc(lMethodNum: Integer; var pvarRetValue: OleVariant; var paParams: PSafeArray{(OleVariant)}) запускает метод как процедуру по номеру, "paParams" - массив входящих параметров и возвращает результат в переменную "pvarRetValue" Достаточно? |
|||
82
Lexxxxx
08.10.10
✎
21:45
|
"Достаточно?"
Достаточно для чего? |
|||
83
Rie
08.10.10
✎
21:45
|
(82) Для реализации внешней компоненты программистом.
|
|||
84
Chieftain
08.10.10
✎
21:45
|
чтобы понять для чего таки нужен "ILanguageExtender"
|
|||
85
Lexxxxx
08.10.10
✎
21:49
|
"чтобы понять для чего таки нужен "ILanguageExtender"
И для чего он по Вашему нужен? Для того чтобы назначить методам и свойствам синонимы? В чем выражается его полезность? Описание методов я и сам читал. Что это все дает в комплексе программисту 1С (алиасы членов мы уже вычислили)? |
|||
86
Rie
08.10.10
✎
21:49
|
+(83) Перестань теоретизировать. Посмотри примеры (с того же диска ИТС - они не образец для подражания, но понимание, что да как - дают). И реализуй "по образу и подобию" свою ВК.
У меня складывается впечатление, что твоя основная проблема - незнакомство с механизмами COM и стандартно используемыми интерфейсами (особенно IDispatch). Почитай чего-либо на эту тему. |
|||
87
Rie
08.10.10
✎
21:51
|
(85) Если он тебе не нужен - не используй. Уже ведь сколько раз говорено было!
Странная манера - идти не от задачи к технологиям для её решения, а гадать, для чего нужна та или иная технология. "На углу двое юношей возились с каким-то механическим устройством. Один убежденно говорил: «Конструкторская мысль не может стоять на месте. Это закон развития общества. Мы изобретем его. Обязательно изобретем. Вопреки бюрократам вроде Чинушина и консерваторам вроде Твердолобова». Другой юноша нес свое: «Я нашел, как применить здесь нестирающиеся шины из полиструктурного волокна с вырожденными аминными связями и неполными кислородными группами. Но я не знаю пока, как использовать регенерирующий реактор на субтепловых нейтронах. Миша, Мишок! Как быть с реактором?» Присмотревшись к устройству, я без труда узнал велосипед". (А.Н.Стругацкий, Б.Н.Стругацкий, "Понедельник начинается в субботу") |
|||
88
Chieftain
08.10.10
✎
21:53
|
(85) Если Вы разрабатываете компоненту по "Технологии...", то в Вашей компоненте должен ДОЛЖЕН быть реализован данный интерфейс.
Плюс Вам от него - языковая независимость методом, определение количества параметров, задание значений по умолчанию и корректное выполнение методов со стороны интерпретатора 1С |
|||
89
Rie
08.10.10
✎
21:57
|
Кстати, в http://www.rsdn.ru/article/dotnet/cs1c.xml сказано:
"ПРИМЕЧАНИЕ Аналогом ILanguageExtender является интерфейс IDispatch, используемый в OLE Automation. В действительности, 1С может выступать в качестве клиента OLE Automation. В этом случае вызов функций сервера автоматизации осуществляется с помощью функции Invoke интерфейса IDispatch, что замедляет процесс взаимодействия в связи с преобразованием передаваемых параметров из типа Variant и обратно [6]. Поэтому рекомендуется использовать пользовательские интерфейсы". Это не совсем верно - в ILanguageExtender параметры тоже имеют тип OLEVARIANT. Но методы ILanguageExtender действительно более "прямолинейны", чем GetIDsOfNames и Invoke. |
|||
90
Chieftain
08.10.10
✎
21:58
|
(86) А я вот, честно говоря, разбирался почти совсем без знания СОМ, но таки логика совсем простая - русским языком написано какие фейсы должен содержать, примеров в сети море, все достаточно интуитивно, если не первый раз пишешь
|
|||
91
Lexxxxx
08.10.10
✎
21:58
|
" Использовать сможешь - но не как расширение языка."
Можно пример? "Плюс Вам от него - языковая независимость методом, " Что это? Можно пример? " определение количества параметров," Кем, когда и для чего? " корректное выполнение методов со стороны интерпретатора 1С" А что, без ILanguageExtender они не корректно будут выполняться? "Присмотревшись к устройству, я без труда узнал велосипед" Вот сейчас я и думаю для чего мне велосипед и делать ли его. Однако пока все еще кроме "Это кошерно" и "Он даст тебе много вкусного" ничего не увидел. Ну можно сказать что еще "можно за хлебом сгонять в соседний магаз (это я о синонимах)". |
|||
92
Lexxxxx
08.10.10
✎
22:00
|
" методы ILanguageExtender действительно более "прямолинейны", чем GetIDsOfNames и Invoke."
Мне пока не интересна их прямолинейность. Пока я понял что ILanguageExtender дает мне возможность вызывать методы по синонимам (которые еще в коде ВК нужно определить), а IDispatch не дает. Правильно? |
|||
93
Lexxxxx
08.10.10
✎
22:01
|
" логика совсем простая - русским языком написано какие фейсы должен содержать,"
Ну с простыми фейсами вроде все ясно. Про ILanguageExtender сказано как он выглядит, но зачем толком не разжевано. Вот например "Использовать сможешь - но не как расширение языка." это как? |
|||
94
Rie
08.10.10
✎
22:02
|
(92) При желании и IDispatch можно реализовать так, чтобы синонимы получались.
|
|||
95
Rie
08.10.10
✎
22:04
|
(93) Ты всё же попробуй примеры посмотреть. Сразу понятно станет.
А то ты сейчас требуешь, чтобы слепому разъяснили достоинства картин Врубеля. |
|||
96
Rie
08.10.10
✎
22:04
|
(91) Не делай, конечно. Не твоё это.
|
|||
97
Lexxxxx
08.10.10
✎
22:05
|
"При желании и IDispatch можно реализовать так, чтобы синонимы получались."
Где-то я вычитал что и остальные интерфейсы не очень нужны и люди и страницы свойств реализуют как-то по другому и сообщения шлют не через IErrorLog, но пока речь о ILanguageExtender. Благо человек сдесь http://forum.ixbt.com/topic.cgi?id=26:40765 рассказал для чего ISpecifyPropertyPage и что и как примерно происходит при работе через IPropertyPage. |
|||
98
Chieftain
08.10.10
✎
22:05
|
(91) Вы, позвольте спросить, чем занимаетесь? Вы программист или просто интересно стало?
А по делу - Вы WinApi тоже также разбираете? вроде того "А нахрена MS придумал делать так, а не иначе". Есть стандарты разработки, 1С предоставляет свои "стандартные" интерфейсы и говорит, что для разработки компоненты их нужно реализовать. Так какого... Вы начинаете придумывать свое, а не следовать требованиям? |
|||
99
Lexxxxx
08.10.10
✎
22:09
|
"Не делай, конечно. Не твоё это"
Смотрю аргументация кончается? :) "Ты всё же попробуй примеры посмотреть. Сразу понятно станет. А то ты сейчас требуешь, чтобы слепому разъяснили достоинства картин Врубеля." Вы мне предлагаете разобраться с назначением сущности изучив ее устройство. Я же вас спрашиваю НАХУА эта сущность создана и какая от нее польза. Только не надо отвечать высокими фразами типа "Использовать сможешь - но не как расширение языка.", а скажите просто (если знаете) что если ты его реализуешь, то сможешь писать так вот и так! "Есть стандарты разработки, 1С предоставляет свои "стандартные" интерфейсы и говорит, что для разработки компоненты их нужно реализовать. Так какого..." Да такого что я хочу узнать зачем, а не как! |
|||
100
Rie
08.10.10
✎
22:09
|
(97) Если у человека возникает вопрос - "зачем нужен (тот или иной) интерфейс", то всё, это - диагноз.
ILanguageExtender - это интерфейс, при помощи которого 1С общается с внешней компонентой. Именно за этим он и нужен (и более ни за чем). |
|||
101
Chieftain
08.10.10
✎
22:10
|
(97) а еще люди пишут компоненты по технологии "Rainbow", это разве отменяет требования 1С? Просто в таком случае люди понимают что делают и насколько стабильно может быть работа 1С. Но, имхо, это не Ваш случай
|
|||
102
Chieftain
08.10.10
✎
22:11
|
(100) +200
|
|||
103
Rie
08.10.10
✎
22:13
|
(99) Аргументация чего?
Я не собираюсь уговаривать Вас писать внешнюю компоненту. Не хотите - не пишите. Равно как и не собираюсь далее уговаривать Вас разбираться в том, что такое внешняя компонента и как она пишется. Не хотите - не надо. За двое суток Вы не удосужились заглянуть в уже готовые примеры. Что ж, это Вас достаточно хорошо характеризует. (И более того - я бы порекомендовал Вам отложить внешние компоненты до лучших времён. Сейчас у Вас не хватает для их написания ни знаний, ни опыта, да и потребности такой у Вас нет). |
|||
104
Lexxxxx
08.10.10
✎
22:14
|
"Если у человека возникает вопрос - "зачем нужен (тот или иной) интерфейс", то всё, это - диагноз.
ILanguageExtender - это интерфейс, при помощи которого 1С общается с внешней компонентой. Именно за этим он и нужен (и более ни за чем)." Вы что, правда верите что сидели на досуге в 1С программисты и думали "вот есть IDispatch, и все через него работает, но давай ка мы за.издячим еще и ILanguageExtender, который будет его дублировать! Ведь нам делать совсем нехер, и наши наниматели с радостью оплатят нам время, затраченное на ILanguageExtender. Да и людям будет больше шансов накосячить!" Так что ли? Ведь если они его создали, значит он на что-то нужен!? Пока удалось выяснить только что можно по синонимам обращаться к членам класса. |
|||
105
Lexxxxx
08.10.10
✎
22:19
|
"Я не собираюсь уговаривать Вас писать внешнюю компоненту. Не хотите - не пишите. "
Да я вроде этого не прошу. "Равно как и не собираюсь далее уговаривать Вас разбираться в том, что такое внешняя компонента и как она пишется. Не хотите - не надо." А я и этого не прошу. "За двое суток Вы не удосужились заглянуть в уже готовые примеры. Что ж, это Вас достаточно хорошо характеризует. " Вы ведь говорили что не телепат! :) Так откуда вы знаете что я за двое суток сделал? "И более того - я бы порекомендовал...." Ох смотрю у вас ЧСВ чешется сильно. :) Аж зудит видать! Я все таки повторю вопрос, а то вы его никак прочитать не можете. Скажите просто (если знаете)для чего нужен ILanguageExtender. Скажите на уровне "если ты его реализуешь, то сможешь писать так вот и так". |
|||
106
Rie
08.10.10
✎
22:19
|
(104) Насчёт "верю" - это к попам.
Что касается 1С - они вытащили наружу то, что использовали внутри, при написании самой 1С и её компонент. Вот и получился ILanguageExtender. |
|||
107
Chieftain
08.10.10
✎
22:20
|
(104) Вы упертый, как я погляжу, но по сути, при реализации только IDispatch ваша компонента 1С становится обычным ActiveX, поскольку не удовлетворяет требованиям 1С по реализации интерфесов. Вы обманываете систему реализацией интерфейса IInitDone для успешной загрузки как компоненты 1С. Но по сути таковой не является
|
|||
108
Lexxxxx
08.10.10
✎
22:20
|
"Что касается 1С - они вытащили наружу то, что использовали внутри, при написании самой 1С и её компонент. Вот и получился ILanguageExtender."
Для чего они это сделали!? |
|||
109
Rie
08.10.10
✎
22:21
|
(105) Зачем нужен ILanguageExtender - Вам был дан ответ в (100).
Чтобы использовать технологию внешних компонент, нужно реализовать ILanguageExtender. Если хотите писать, используя другую технологию - можете не реализовывать ILanguageExtender. Какая буква в вышенаписанном Вам непонятна? |
|||
110
Chieftain
08.10.10
✎
22:22
|
(105) >>Скажите на уровне "если ты его реализуешь, то сможешь писать так вот и так".
я кажись в (88) именно это и написал. а если непонятно, то читай (81). А если опять же непонятно, ищи примеры и пробуй |
|||
111
Chieftain
08.10.10
✎
22:23
|
+(110) а если уж совсем непонятно, может ну их нахрен, эти компоненты, не Ваше это
|
|||
112
Rie
08.10.10
✎
22:25
|
(108) Что сделали? Они написали 1С. Всё. ILanguageExtender - это вытащенная наружу часть 1С (которую сделали доступной другим). Познакомьтесь с идеологией компонентной структуры версий 7.x - и Вам (может быть) станет понятнее.
После этого они даже "родную" 1С-овскую v7plus сделали ВК. |
|||
113
Lexxxxx
08.10.10
✎
22:26
|
"Вы обманываете систему реализацией интерфейса IInitDone для успешной загрузки как компоненты 1С. Но по сути таковой не является"
Ну не так уж и обманываю. В Init дают ссылку на саму 1С, что дает пользовать ее интерфейсы. Все по инструкции. "Зачем нужен ILanguageExtender - Вам был дан ответ в " Мама дорогая! А зачем ей это надо если она это прекрасно делает через IDispatch? Может она что-то программисту дать хочет? Или ей самой так лучше чем-то? Вот пока выяснили что в этом есть выгода для программиста в том, сто у него появляется возможность сделать синонимы методов и свойств. "Чтобы использовать технологию внешних компонент, нужно реализовать ILanguageExtender. " Дело в самом пришивании подворотничка к воротничку! (С) ДМБ |
|||
114
Rie
08.10.10
✎
22:26
|
Хм... Lexxxxx и http://www.forum.mista.ru/users.php?action=show&id=3332 - это не один и тот же человек? Уж очень похожи...
|
|||
115
Chieftain
08.10.10
✎
22:27
|
(114) та не, у гени малость другой стиль
|
|||
116
Chieftain
08.10.10
✎
22:28
|
а таки данная беседа очень похожа на метание бисера...
|
|||
117
Rie
08.10.10
✎
22:28
|
(115) Да тот же самый. Теоретизировать на пустом месте.
|
|||
118
Chieftain
08.10.10
✎
22:29
|
(117) Да се возможно конечно, но таки вроде не похож он, таких много
|
|||
119
Lexxxxx
08.10.10
✎
22:29
|
"я кажись в (88) именно это и написал. а если непонятно, то читай (81). "
88 "языковая независимость методом, определение количества параметров, задание значений по умолчанию и корректное выполнение методов со стороны интерпретатора 1С" Я же вас ниже спросил? Что такое языковая независимость? Пример можно? Определение количества параметров кем и для чего? А что, без этого интерфейса методы выполняются некорректно? Можете разжевать мне эти истины? |
|||
120
Rie
08.10.10
✎
22:32
|
Бесполезно.
Товарищ не понимает самых азов. |
|||
121
Lexxxxx
08.10.10
✎
22:33
|
"Товарищ не понимает самых азов."
:) Ну так просветите меня хотя бы в части что такое языковая независимость, которую я якобы получу, реализовав ILanguageExtender? |
|||
122
Chieftain
08.10.10
✎
22:34
|
>>Что такое языковая независимость? Пример можно?
то, что 1с не только англо-русская, методы можно задавать и на других языках >>Определение количества параметров кем и для чего? Определение программистом, реализующим ВК для интерпрититора 1С >>А что, без этого интерфейса методы выполняются некорректно? В 1С есть функции и процедуры, кроме возвращения значения они могут возвращать статус выполнения как результат выполнения методов интерфейса "CallAsProc" и "CallAsFunc". Возвращаемое значение имеет тип HResult и 1С его понимает. |
|||
123
Rie
08.10.10
✎
22:36
|
(119) Вы что такое "интерфейсы" понимаете?
Что значит "класс реализует интерефейс" - знаете? Если да - то откуда у Вас столь странные вопросы "нужно ли реализовывать Interface1, если система требует, чтобы был реализован Interface1?". IDispatch - это _другой_ интерфейс. Похожий - но другой. Для похожих, но других целей. Какой интерфейс использовать - IDispatch или ILanguageExtender - зависит только от Вашей задачи. И ни от чего более. Для одних задач - лучше IDispatch, для других - ILanguageExtender... |
|||
124
Chieftain
08.10.10
✎
22:37
|
тока вот непонятно, зачем бороться с платформой, требования которой крайне однозначны, и для которой ты пишешь
|
|||
125
Rie
08.10.10
✎
22:38
|
(122) IDispatch::Invoke тоже возвращает HRESULT. Так что тут разницы нет.
Разница в том, что IDispatch - "чужой", для 1С - менее информативный в одних случаях и излишне мощный в других. |
|||
126
Chieftain
08.10.10
✎
22:39
|
(123) ну с точки зрения "классических" компонент 1С, вопрос и не должен стоять - реализовывать или нет - для объектов ВК, реализующих методы, ILanguageExtender обязательно должен быть реализован
|
|||
127
Rie
08.10.10
✎
22:40
|
(126) О чём и речь - непонятно, откуда у товарища взялся сам вопрос.
|
|||
128
Lexxxxx
08.10.10
✎
22:43
|
"то, что 1с не только англо-русская, методы можно задавать и на других языках "
Ух ты! А как? Ведь вроде в GetPropName/GetMethodName lAliasNum имеет только 2 значения (0 и 1), что дает нам только 2 варианта наименования свойства/метода. "Определение программистом, реализующим ВК для интерпрититора 1С" Вот это не понял совсем. Программист вроде сам в состоянии определить сколько параметров нужно его методам без всяких интерфейсов. "В 1С есть функции и процедуры, кроме возвращения значения они могут возвращать статус" Вообще не понял. Но это ИМНО лучше пока отложить. "откуда у Вас столь странные вопросы "нужно ли реализовывать Interface1, если система требует, чтобы был реализован Interface1?"" Не так уж она и требует! На первый взгляд все работает и без ILanguageExtender. И я хочу узнать что я потеряю если не реализую ILanguageExtender. "для объектов ВК, реализующих методы, ILanguageExtender обязательно должен быть реализован" А свойства что, не в счет? |
|||
129
Rie
08.10.10
✎
22:49
|
(128) Разумеется, не требует. Вы можете _не_ реализовывать ILanguageExtender. Можете вообще ничего _не_ писать.
Но если Вы используете технологию внешних компонент - то Вы должны реализовать ILanguageExtender. Если же Вы НЕ используете технологию внешних компонент - то Вам НЕ надо реализовывать ILanguageExtender. Что тут непонятного? Вы определите для себя, будете ли Вы использовать именно ВК - или же какую-то другую технологию. И в зависимости от этого решения (ВК или что-то иное) либо реализуете, либо НЕ реализуете ILanguageExtender. Только и всего. Суть именно в этом. А вот это "Программист вроде сам в состоянии определить сколько параметров нужно его методам без всяких интерфейсов" - надо бы в раздел "Юмор". (Те, кто знают, что такое интерфейсы и зачем они нужны, посмеются). |
|||
130
Chieftain
08.10.10
✎
22:49
|
>>"для объектов ВК, реализующих методы, ILanguageExtender обязательно должен быть реализован"
>>А свойства что, не в счет? да канеш понятно что и про них также можно говорить, просто о методах разговор был работа со свойствами практически аналогична работе с методами 1с запрашивает номера/имена свойств, есть правда нюанс - свойства могут быть читаемыми и записываемыми, это зависит от реализации методов "IsPropReadable", "IsPropWritable" |
|||
131
Lexxxxx
08.10.10
✎
22:54
|
Так как она множество языков реализует? Пока видно возможности только для 2-х.
Ну и конечно в силе основной вопрос, что еще (говоря простыми словами, очень желательно с примерами) даст ILanguageExtender кроме синонимов (многоязычности)? |
|||
132
Chieftain
08.10.10
✎
22:57
|
(131) Все уже описано, читайте, товарисч, если непонятно - непонятна ваша квалификация как кодера
|
|||
133
Lexxxxx
08.10.10
✎
22:59
|
"непонятна ваша квалификация как кодера"
Квалификация моя очень маленькая. Но я думаю кто-то опытный вполне может ответить на мои вопросы. "Но если Вы используете технологию внешних компонент - то Вы должны реализовать ILanguageExtender. Если же Вы НЕ используете технологию внешних компонент - то Вам НЕ надо реализовывать ILanguageExtender. " Мдя! "А зачем пришивать подворотничок к воротничку? Никто не знает..Просто пришивайте и все.." (с) ДМБ |
|||
134
Chieftain
08.10.10
✎
23:03
|
(133) дык с маленькой квалификацией фигли лезть до усрачки докапываться "а нахрена". Сказали - делай, а когда поймешь как работает - будешь доказывать. 1С хочет видеть интерфейс, будь добр - дай ей его. Не хочешь - тогда "путь испытателя неизведан". Всех благ
|
|||
135
Lexxxxx
08.10.10
✎
23:04
|
"Сказали - делай, а когда поймешь как работает - будешь доказывать."
Я что-то доказывал? |
|||
136
Lexxxxx
08.10.10
✎
23:05
|
"1С хочет видеть интерфейс, будь добр - дай ей его. "
Спросить зачем возбраняется? Боженька покарает? |
|||
137
Chieftain
08.10.10
✎
23:08
|
(136) она блин хочет ответов на вопросы вроде (81)и(130) Не хочешь ей рассказывать - не реализуй фейс
|
|||
138
Lexxxxx
08.10.10
✎
23:16
|
" она блин хочет ответов на вопросы вроде (81)и(130) Не хочешь ей рассказывать - не реализуй фейс"
Смотря что она мне за это даст! |
|||
139
Chieftain
08.10.10
✎
23:19
|
+(138) как и любая другая система плагинов, 1С ставит свои требования. И их нужно выполнять.
У того же винампа структура методов плагина в очень жестких рамках. |
|||
140
Torquader
10.10.10
✎
12:30
|
Да.
Нафлудили по-чёрному. Таки ж давайте разбираться, если оно вам хочется. Итак. Если мы ходим использовать IDispatch, то надо придерживаться его идеологии. Во-первых, не стоит забывать, что все функции, свойства и методы вызываются или через Invoke или по таблице vtbl (то есть динамическое и статическое связывание). Vtbl мы просто получаем от объекта и все "функции", это записи в таблице. Если же мы используем Invoke, то когда мы хотим вызвать какую-то "функцию" (или метод и т.п.) мы должны передать туда DISPID, то есть число (ну или адрес в таблице vtbl, если мы её делаем - а можно не делать, но работать будет медленнее, так как перед каждым вызовом будет делаться GetIdsOfNames, то есть мы будем ставить соответствие между строкой-названием метода и числом. И тут все сразу понимают, что "умный" IDispatch вообще никак не привязан к языкам, так как можно иметь сколько угодно названий для одного метода (в 1С мы этого не можем). Ещё одна "прелесть" IDispatch - это реализация интерфейса ITypeInfo, через который мы можем "понятным языком" сообщить о всех реализованных нами методах, а также о количестве параметров и т.п. Если мы реализуем этот интерфейс и создадим таблицу типов, то интерпретатор, которому мы дадим наш IDispatch сможет проверить правильность вызова функции ещё до самого вызова. (К сожалению, 1С это делать не умеет). Далее, следует заметить, что 1С не знает про vtbl, когда работает как клиент, а также когда работает как сервер (то есть лазая в 1С как в OLE-сервер, мы должны всегда GetIdsOfNames делать, а не "смотреть" в vtbl). Поэтому, всё работает медленнее. Интерфейс 1С позволяет 1С запросить описание только 1 раз, а потом его использовать - будет немного быстрее, но не очень. Далее, мы должны понимать, что IDispatch - стандартный интерфейс системы, и при работе через него нам неважно, в каком адресном пространстве находится наш сервер (он может быть даже на другой машине). Подсистема вызова автоматом перенесёт все наши данные от клиента к серверу и обратно (IMarshal). Но, перенос и всякие связанные с ним вещи при работе в одном процессе и в одном потоке не работают - то есть вызовы будут идти напрямую (конечно, можно сделать ошибку в описании объекта и сказать, что он многопоточный с разделением, чтобы вызовы шли через обмен между процессами). Теперь, надо также понять, что IDispatch - это интерфейс к объекту, который зарегистрирован в реестре. Поэтому, когда мы пишем CreateObject, то система лезет в реестр и ищет описание объекта по переданной нами строке. Там она находит CLSID и уже его использует для получения нашего объекта. Тут сразу становится понятно, что для работы через IDispatch нам реализация IInitDone совсем не нужна, и можно даже никакую компоненту не грузить - система всё загрузит сама и без нас - но надо будет проверить результат (то есть заключить вызов объекта в попытку, чтобы отловить ошибку, если объект в реестре не прописан). Однако, если мы отработали IInitDone, а в нашей DLL есть объект, то мы должны его зарегистрировать в таблице исполняемых объектов в системе. В этом случае, при вызове CreateObject система найдёт в реестре CLSID нашего объекта, а потом просто найдёт объект в ROT и ей не надо будет загружать DLL (то есть мы экономим время, если нам не нужен объект постоянно, так как свободные от объектов DLL система выгрузить назад, а компоненту никто не выгрузит). Теперь, если мы реализовали ILanguageExtender, то мы сообщили 1С "расширение языка", то есть строку, которую мы потом передадим в CreateObject, и в реестре уже ничего не надо будет искать - вызов останется внутри 1С. То есть нам нужно будет только загрузить компоненту (её можно загрузить через указание DLL из рабочей директории). Вот здесь мы находим первую разницу - в реестре ничего искать и писать не надо. (В восьмой версии есть различие или использование "Новый" или "Новый СОМОбъект"). Теперь, вспомним о передаваемых в IDispatch параметрах. Как известно, параметры могут передаваться по ссылке или по значению. Например в javascript все параметры передаются по значению. В 1С же есть слово Val (Знач), чтобы сказать, что параметры передаются по значению, а по умолчанию они передаются по ссылке. Только 1С "бережёт" свои внутренние переменные, поэтому в IDispatch все значения передаются по значению, чтобы функция не могла их испортить (то есть создаётся новая переменная, в которую копируется значение нашей переменной и она отправляется по ссылке - после вызова функции эта переменная разрушается). При работе же с "родным" для 1С ILanguageExtender значения передаются по ссылке - и мы можем их поменять в нашей функции. Вот здесь мы видим вторую и главную разницу. К сожалению, внешняя компонента - это только DLL, если мы хотим использовать объекты и методы из другого процесса, то приходится или работать через IDispatch и забыть передачу параметров по ссылке, или писать DLL-заглушку, которая будет работать из 1С, а уже потом передавать параметры объекту в другой процесс (и получать события обратно). Думаю, что вам станет более понятно. P.S. слова - "раз сказано, значит, нужно" - хороши только для военных. |
|||
141
Lexxxxx
10.10.10
✎
14:28
|
Torquader, огромное Вам спасибо за столь развернутый ответ. Не все конечно мне понятно, но это уже вопрос исключительно моего опыта в программировании.
Попробую обобщить свои знания в различиях (я имею в виду с точки зрения человека, программирующего в 1С и мало что знающего о устройстве ВК) ВК с интерфейсом ILanguageExtender и без него. 1) Возможность реализовать синонимы методов и свойств (предположительно по одному синониму). 2) Возможность передачи значений в ВК по ссылке. Правильно ли это и есть ли еще какие либо различия? |
|||
142
Torquader
10.10.10
✎
14:31
|
(141)
Возможность использования внешней компоненты без регистрации в реестре (если грузить через dll). А то, что написано в 1) - возможность реализации только Двух синонимов на Двух языках (в IDispatch можно сделать их хоть сотню). |
|||
143
Lexxxxx
10.10.10
✎
15:05
|
"Возможность использования внешней компоненты без регистрации в реестре (если грузить через dll). "
А это относится к компонентам, написанным на C#? Где-то я читал, что к таким компонентам нельзя применять ЗагрузитьВнешнююКомпоненту(), только ПодключитьВнешнююКомпоненту(). "А то, что написано в 1) - возможность реализации только Двух синонимов на Двух языках (в IDispatch можно сделать их хоть сотню)." Так я и думал. Но некоторые товарищи утверждали что "1с не только англо-русская, методы можно задавать и на других языках " и прочитав эту фразу я подумал что что-то упустил и можно больше двух именно при помощи ILanguageExtender. |
|||
144
Torquader
10.10.10
✎
15:13
|
(143) 1С 7.7 имеет два языка "Русский" и "Английский".
Больше языком там не появится. А вот в восьмой версии может быть что угодно. Здесь же: IDispatchImpl::GetIDsOfNames HRESULT GetIDsOfNames( REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid ); Мы можем получить LocaleId и работать с ним, то есть выбирать методы в зависимости от языка, а не синонимы, как в 1С. ILanguageExtender намного проще в реализации, чем IDispatch, просто IDispatch во многих языках высокого уровня реализуется автоматически. |
|||
145
Lexxxxx
10.10.10
✎
15:36
|
"ILanguageExtender намного проще в реализации, чем IDispatch, просто IDispatch во многих языках высокого уровня реализуется автоматически."
Вот! Похоже в этом и есть корень всех заблуждений (моих во всяком случае). Получается что ILanguageExtender был разработан 1С как облегченная версия IDispatch для того чтобы облегчить жизнь программистам. Однако теперь "IDispatch во многих языках высокого уровня реализуется автоматически", а следовательно необходимость реализовывать ILanguageExtender отпала. Не реализовав ILanguageExtender мы потеряем синонимы и передачу параметров по ссылке? |
|||
146
Lexxxxx
10.10.10
✎
15:37
|
" IDispatch во многих языках высокого уровня реализуется автоматически."
А можно ли как-то влезть своими рученками в эту автоматическую реализацию? |
|||
147
Torquader
10.10.10
✎
15:44
|
(146) Я писал вручную реализацию IDispacth на Си, описывая вручную все структуры и записывая в LOG-файл все вызовы, чтобы понять, что каким системам надо.
Оказалось, что даже передача параметров в VbScript, JavaScript, Excel и 1С совершенно разная (где-то по значению, где-то по ссылке, где-то передаются переменная-ссылка на значение и т.д.) Если интересно - можешь посмотреть исходники. (В ручной реализации можно узнать, что указатель this является обязательным параметром всех методов и функций класса). На счёт С# не скажу - по идее, оба способа загрузки должны работать. (Но, грузить из файла проще тем, что при переносе директории 1С на другую машину мы можем запуститься без проблем и без необходимости что-то регистрировать, то есть без добавления ProgId в реестр). http://forum.sources.ru/index.php?showtopic=80670&hl= (там кто-то разницу описал - перепечатывать лень). |
|||
148
Lexxxxx
10.10.10
✎
15:52
|
"На счёт С# не скажу - по идее, оба способа загрузки должны работать. "
Вот здесь http://www.rsdn.ru/article/dotnet/cs1c.xml#ELKAE говорят что нет (правда я сам не проверял). Но там и во втором пункте что-то странное. regsvr32 не работает с DLL написанными на C# (по крайней мере у меня и встречал много таких случаев в интернете). Работает способ regasm MyDLL.dll /cosebase |
|||
149
Lexxxxx
10.10.10
✎
15:54
|
" кто-то разницу описал"
Разница описана в доке по ВК в самом начале. Например есть тут http://ic-other.z03.org.ua/zOther/manual/tsvk/ztsvk001.html |
|||
150
Lexxxxx
10.10.10
✎
15:57
|
Вроде как нельзя использовать ЗагрузитьВнешнююКомпоненту() именно потому что процесс регистрации .NET-сборок отличается от регистрации обычных, а 1С пытается это делать по старому (правда о том, что при ЗагрузитьВнешнююКомпоненту() производится ее регистрация в доке не написано! Это я вычитал в интернетах так что может быть и не правдой.).
|
|||
151
Torquader
10.10.10
✎
18:20
|
"Создаёт соответствующие OLE-объекты", то есть вызывает DllRegisterServer.
Но нигде не сказано, что надо что-то там такое регистрировать, можно просто ответить "Всё в порядке" и ждать, когда "дёрнут" IInitDone. Хотя, с приложениями Net сложнее - у них странные подходы к безопасности, и просто "неизвестно что" регистрироваться не может. Поэтому, OLE-объект не получится, а вот DLL должна загрузиться. |
|||
152
Torquader
10.10.10
✎
19:14
|
(151)+
На самом деле я тут немного не прав - DllRegisterServer не факт, что и вызывается. Когда мы загружаем Dll, то мы с неё можем получить указатель на ClassFactory, то есть на библиотеку создания объектов. А IInitDone надо запрашивать у созданного объекта, а не у самой ClassFactory (то есть, конечно, можно, но 1С так не делает, да и никто не гарантирует, что нам что-то вернут). Интерфейсы можно запросить у объекта класса, а чтобы его создать - нужен ClsId, то есть что-то в реестр прописать надо обязательно. (В строке таблицы № 100 мы имеем часть ProgId, а не ClsId - поэтому как-то его нужно преобразовывать, так как в списке исполняемых объектов хранится ClsId). Однако, если при загрузке Dll создать объект нашего класса и запостить его в ROT, а потом вручную прописать в реестр информацию о соответствии ProgId и ClsId, то наш объект должны "достать" из ROT - то есть прописывать информацию о его положении необязательно. Другое дело, что все эти действия надо делать в DllMain - то есть при "стыковке" Dll с процессом 1С. В общем вывод: Объект должен быть и информация об объекте в реестре - тоже. А как она туда попадёт - это уже отдельный вопрос. |
|||
153
Lexxxxx
11.10.10
✎
09:27
|
"Поэтому, OLE-объект не получится, а вот DLL должна загрузиться."
Проверил. На вот такой код: "Сообщить("Результат загрузки = " + ЗагрузитьВнешнююКомпоненту("MyExt2.dll"));" получаем: "Ошибка при создании объекта из компоненты C:\1CDB\MyExt2.dll (отсутствует CLSID) Результат загрузки = 0" Похоже действительно при использовании .Net сборок нельзя использовать ЗагрузитьВнешнююКомпоненту(). |
|||
154
Lexxxxx
15.10.10
✎
11:50
|
(39) "Если просто реализовать IInitDone, то при передаче в методы ВК чего-то отличного от типов Дата, Строка или Число 1С ругается словами "Плохой тип данных!" Может она разрешит передавать их если у ВК будет ILanguageExtender? "
(40) "Нет, не разрешит." Оказалось разрешит! Только вот что делать с ним я еще не знаю. Кто нибудь работал во внешних компонентах с агрегатными типами 1С, полученными как параметры методов? |
|||
155
Дык ё
15.10.10
✎
11:59
|
(154) а че с ними работать? variant - он и в 1с variant
|
|||
156
DmitrO
15.10.10
✎
12:10
|
(154) конечно разрешит, они будут переданы как VT_DISPATCH, причем без разницы как используется объект: как Объект ВК (через IInitDone и ILanguageExtender) и как обычный COM объект (IDisatch).
|
|||
157
DmitrO
15.10.10
✎
12:11
|
(156)+ поправка: ...или как обычный COM...
|
|||
158
Lexxxxx
15.10.10
✎
12:17
|
(155) Вы не могли бы привести примерчик кода?
(156) Не разрешит! :) Говорит "Плохой тип данных!" В 1С я пишу: Plugin = СоздатьОбъект("AddIn.MyExt"); Таб = СоздатьОбъект("ТаблицаЗначений"); Таб.НоваяКолонка("СТрока"); Таб.НоваяКолонка("ЧИсло"); Plugin.TestMethod(Таб); В компоненте в методе ILanguageExtender.CallAsProc в параметре ref object[] paParams я получаю в [0] объект System.__ComObject (как я понимаю это и есть моя ТаблицаЗначений). И что с ним делать дальше? |
|||
159
Lexxxxx
15.10.10
✎
12:54
|
И все таки, как теперь добраться до методов и свойств ТаблицаЗначений во внешней компоненте?
|
|||
160
DmitrO
15.10.10
✎
13:02
|
в С# не копенгаген но как-то так на этом вражьем языке это пишется: paParams[0].GetType().InvokeMember("Добавить", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, paParams[0], null);
(короче гугли) |
|||
161
Lexxxxx
15.10.10
✎
13:28
|
(160) Да вот примерно туда и рою. Но пока не выходит каменная чаша. :(
|
|||
162
trdm
15.10.10
✎
13:40
|
Шарп развращает...
|
|||
163
Lexxxxx
15.10.10
✎
14:33
|
Чаша получилась! Для вызова метода достаточно
paParams[0].GetType().InvokeMember("НоваяКолонка", System.Reflection.BindingFlags.InvokeMethod , null, paParams[0], null) Таперь думаю как получить списочек свойств и методов объекта? |
|||
164
Lexxxxx
15.10.10
✎
14:36
|
Да и его тип в терминах 1С было бы не плохо!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |