|
Создание dll на C# | ☑ | ||
---|---|---|---|---|
0
unikon
17.10.17
✎
20:38
|
Всем доброе время суток.
В общем, пытаюсь уже второй день создать dll на C# я реализации простых функций для начала (изучаю эту тему). Но уже и тут столкнулся с проблемой. Не могу никак создать com объект в 1С. Скомпилировал dll по статье http://catalog.mista.ru/public/151246/, но когда в 1с начинаю писать код МойОбъект = Новый COMОбъект("HowToComObjectFor1C.MyClass");, то выдает ошибку: {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19)}: Ошибка при вызове конструктора (COMОбъект) МойОбъект = Новый COMОбъект("Addin.MyClass"); по причине: -2147467262(0x80004002): Интерфейс не поддерживается что, где не так делаю, понять не могу. Может подскажет кто куда смотреть? Или у кого готовый проект есть, что бы его можно было собрать в Visual Studio? |
|||
1
unikon
18.10.17
✎
18:21
|
up
|
|||
2
megabax
18.10.17
✎
19:16
|
||||
3
unikon
18.10.17
✎
20:53
|
(2) Спасибо, разобрался. Оказалось нужно было dll добавлять в папку bin 1С и там ее регистрировать.
|
|||
4
oleg_km
18.10.17
✎
22:04
|
(3) Если ее регистрировать, то в папку bin добавлять не обязательно
|
|||
5
unikon
20.10.17
✎
07:19
|
(4) У меня по другому не получалось. Я ее регил в папке проекта, а из 1С потом к ней подключиться не мог.
|
|||
6
unikon
20.10.17
✎
07:21
|
Я не знаю в этой теме писать или нет, но появился следующий вопрос. С dll теперь все норм. Через нее хочу работать с формами 1С. Нахожу форму по заголовку, получаю ее дескриптор. Как теперь по этому дескриптору обращаться к форме и менять ее размер, положение и т.д.?
|
|||
7
oleg_km
20.10.17
✎
09:28
|
(6) Надо использовать WinAPI и неуправляемый код:
using System; using System.Text; using System.Runtime.InteropServices; namespace _1CAddInNET { [ComVisible(true)] [ProgId("1CAddInNET.WndHlp")] [ClassInterface(ClassInterfaceType.AutoDispatch)] [Guid("A497AB77-85C3-4F32-839D-7EDA0F5F89C8")] public class WndHlp { #region Private members private IntPtr m_hWnd = IntPtr.Zero; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool PostMessage(IntPtr hWnd, int nMsg, int wParam, int lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr FindWindowEx(IntPtr wParam, IntPtr wParamChildAfter, string cClass, string cTitle); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool ShowWindow(IntPtr hWnd, int nMode); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetParent(IntPtr hWnd, IntPtr nWhdParent); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetParent(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern uint SetWindowLong(IntPtr hWnd, int nStyle, int nParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool SetWindowPos(IntPtr hWnd, IntPtr nOrder, int nX, int nY, int nW, int nH, uint nMode); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int GetClassName(IntPtr hWnd, StringBuilder cClass, int nMaxCount); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool BringWindowToTop(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool SetForegroundWindow(IntPtr hWnd); [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int GetWindowRect(IntPtr hWnd, ref RECT rc); #endregion Private members public int hWnd { get { return m_hWnd.ToInt32(); } set { m_hWnd = new IntPtr(value); } } public bool PostMsg(int nMsg, int wParam, int lParam) { return PostMessage(m_hWnd, nMsg, wParam, lParam); } public bool FindWnd(int wParam, int wParamChildAfter, string cClass, string cTitle) { m_hWnd = FindWindowEx(new IntPtr(wParam), new IntPtr(wParamChildAfter), cClass, cTitle); return m_hWnd != IntPtr.Zero; } public bool ShowWnd(int nMode) { return ShowWindow(m_hWnd, nMode); } public bool SetParentWnd(int nWhdParent) { SetParent(m_hWnd, new IntPtr(nWhdParent)); return true; } public int GetParentWnd() { return GetParent(m_hWnd).ToInt32(); } public bool IsVisibleWnd() { return IsWindowVisible(m_hWnd); } public bool SetWndLong(int nStyle, int nParam) { SetWindowLong(m_hWnd, nStyle, nParam); return true; } public bool SetWndPos(int nOrder, int nX, int nY, int nW, int nH, uint nMode) { SetWindowPos(m_hWnd, new IntPtr(nOrder), nX, nY, nW, nH, nMode); return true; } public string GetClassNameWnd() { StringBuilder cClass = new StringBuilder(255); GetClassName(m_hWnd, cClass, cClass.Capacity); return cClass.ToString(); } public bool BringWndToTop() { return BringWindowToTop(m_hWnd); } public bool SetForegroundWnd() { return SetForegroundWindow(m_hWnd); } public AutoWrap GetWndRect() { RECT rc = new RECT(); GetWindowRect(m_hWnd, ref rc); int[] Res = new int[4]; Res[0] = rc.top; Res[1] = rc.bottom; Res[2] = rc.left; Res[3] = rc.right; return new AutoWrap(Res); } } } |
|||
8
unikon
20.10.17
✎
19:01
|
(7) Спасибо)
|
|||
9
unikon
11.11.17
✎
12:41
|
Решил не создавать новую тему, а продолжить тут)
В общем найти дискриптор главного окна 1с не составило никакой сложности. Использовал функцию "FindWindow". Но я мне нужно вот что. Открыть 1С. Запустить форму с признаком "РежимРабочегоСтола" и дальше из этой формы будут открывать другие формы и мне нужно манипулировать ими. Устанавливать положение, доступность, размер и т.д. Но дело в том, что дискрипторы этих окон я не могу найти. Т.е. он их находит с помощью функции "FindWindowEx", где в качестве параметров я указываю дискриптор родительского окна (главное окно 1С) и заголовок формы. Но вот дальнейшие манипулировать ими не могу. Может кто подскажет, что я не так делаю? |
|||
10
lodger
11.11.17
✎
13:44
|
(9) не знаю что у тебя не прёт, но такой велосипед уже делали: http://catalog.mista.ru/public/140057/
|
|||
11
unikon
11.11.17
✎
15:21
|
(10) Я тоже читал эту статью, но это чутка не то.
Если открыть первую форму модально (она будет выше главного окна 1С), тогда я могу остальными формами управлять (размер, положение и т.д.), но мне нужно, что бы это было не через модальные формы, а именно, внутри главного окна 1С. |
|||
12
lodger
11.11.17
✎
15:44
|
(11) о. тебе нужен велосипед с костылем!
ну а кроме шуток, все что происходит внутри главного окна 1с, управляется только самим 1с, как мне кажется. |
|||
13
unikon
11.11.17
✎
15:47
|
(12) Нет. У меня есть конфа, которая так может делать с помощью внешней dll. Вот я и хочу разобрать как это все работает)
|
|||
14
VS-1976
11.11.17
✎
18:16
|
Все окна регистрируются в Винде и у каждого окна есть очередь сообщений
|
|||
15
Dmitry1c
11.11.17
✎
20:13
|
О боже мой зачем зачем
Использовать проктологический путь Ведь Windows дала нам столько проблем Стоит ли пытаться её обмануть? А может быть, однажды, включить стоит мозг И найти другой путь Нативный код на языке 1С Не даст вам себя обмануть. |
|||
16
unikon
11.11.17
✎
20:51
|
(15) Я не задаю вопрос как лучше сделать. Я пытаюсь разобраться как это работает.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |