Создание dll на C# #806807


#0 by unikon
Всем доброе время суток. В общем, пытаюсь уже второй день создать dll на C# я реализации простых функций для начала (изучаю эту тему). Но уже и тут столкнулся с проблемой. Не могу никак создать com объект в 1С. Скомпилировал dll по статье , но когда в 1с начинаю писать код МойОбъект = Новый COMОбъект("HowToComObjectFor1C.MyClass");, то выдает ошибку: {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма}: Ошибка при вызове конструктора (COMОбъект)     МойОбъект = Новый COMОбъект("Addin.MyClass"); по причине: -2147467262(0x80004002): Интерфейс не поддерживается что, где не так делаю, понять не могу. Может подскажет кто куда смотреть? Или у кого готовый проект есть, что бы его можно было собрать в Visual Studio?
#1 by unikon
up
#2 by megabax
#3 by unikon
Спасибо, разобрался. Оказалось нужно было dll добавлять в папку bin 1С и там ее регистрировать.
#4 by oleg_km
Если ее регистрировать, то в папку bin добавлять не обязательно
#5 by unikon
У меня по другому не получалось. Я ее регил в папке проекта, а из 1С потом к ней подключиться не мог.
#6 by unikon
Я не знаю в этой теме писать или нет, но появился следующий вопрос. С dll теперь все норм. Через нее хочу работать с формами 1С. Нахожу форму по заголовку, получаю ее дескриптор. Как теперь по этому дескриптору обращаться к форме и менять ее размер, положение и т.д.?
#7 by oleg_km
Надо использовать WinAPI и неуправляемый код:     [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);         private static extern IntPtr SetParent(IntPtr hWnd, IntPtr nWhdParent);         private static extern IntPtr GetParent(IntPtr hWnd);         private static extern bool IsWindowVisible(IntPtr hWnd);         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);         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;         }         public static extern int GetWindowRect(IntPtr hWnd, ref RECT rc);         #endregion Private members         public int hWnd         }         public bool PostMsg(int nMsg, int wParam, int lParam)         }         public bool FindWnd(int wParam, int wParamChildAfter, string cClass, string cTitle)         {         }         public bool ShowWnd(int nMode)         }         public bool SetParentWnd(int nWhdParent)         public int GetParentWnd         }         public bool IsVisibleWnd         }         public bool SetWndLong(int nStyle, int nParam)         public bool SetWndPos(int nOrder, int nX, int nY, int nW, int nH, uint nMode)         {         public string GetClassNameWnd         {         public bool BringWndToTop         }         public bool SetForegroundWnd         }         public AutoWrap GetWndRect         {         }     } }
#8 by unikon
Спасибо)
#9 by unikon
Решил не создавать новую тему, а продолжить тут) В общем найти дискриптор главного окна 1с не составило никакой сложности. Использовал функцию "FindWindow". Но я мне нужно вот что. Открыть 1С. Запустить форму с признаком "РежимРабочегоСтола" и дальше из этой формы будут открывать другие формы и мне нужно манипулировать ими. Устанавливать положение, доступность, размер и т.д. Но дело в том, что дискрипторы этих окон я не могу найти. Т.е. он их находит с помощью функции "FindWindowEx", где в качестве параметров я указываю дискриптор родительского окна (главное окно 1С) и заголовок формы. Но вот дальнейшие манипулировать ими не могу. Может кто подскажет, что я не так делаю?
#10 by lodger
не знаю что у тебя не прёт, но такой велосипед уже делали:
#11 by unikon
Я тоже читал эту статью, но это чутка не то. Если открыть первую форму модально (она будет выше главного окна 1С), тогда я могу остальными формами управлять (размер, положение и т.д.), но мне нужно, что бы это было не через модальные формы, а именно, внутри главного окна 1С.
#12 by lodger
о. тебе нужен велосипед с костылем! ну а кроме шуток, все что происходит внутри главного окна 1с, управляется только самим 1с, как мне кажется.
#13 by unikon
Нет. У меня есть конфа, которая так может делать с помощью внешней dll. Вот я и хочу разобрать как это все работает)
#14 by VS-1976
Все окна регистрируются в Винде и у каждого окна есть очередь сообщений
#15 by Dmitry1c
О боже мой зачем зачем Использовать проктологический путь Ведь Windows дала нам столько проблем Стоит ли пытаться её обмануть? А может быть, однажды, включить стоит мозг И найти другой путь Нативный код на языке 1С Не даст вам себя обмануть.
#16 by unikon
Я не задаю вопрос как лучше сделать. Я пытаюсь разобраться как это работает.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С