Имя: Пароль:
1C
1С v8
Создание 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) Я не задаю вопрос как лучше сделать. Я пытаюсь разобраться как это работает.