Advertisement
Serginio

Untitled

Feb 15th, 2016
6,414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.04 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Reflection;
  4. using System.Runtime.InteropServices;
  5. using System.Diagnostics;
  6. using System.Windows.Forms;
  7.  
  8. namespace ТестВК
  9. {
  10.     [Guid("ab634004-f13d-11d0-a459-004095e1daea"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  11.     public interface IAsyncEvent
  12.     {
  13.         void SetEventBufferDepth(int lDepth);
  14.         void GetEventBufferDepth(ref int plDepth);
  15.         void ExternalEvent(string bstrSource, string bstrMessage, string bstrData);
  16.         void CleanBuffer();
  17.     }
  18.  
  19.  
  20.     [ComImport]
  21.     [Guid("EFE19EA0-09E4-11D2-A601-008048DA00DE")]
  22.     [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  23.     interface IExtWndsSupport
  24.     {
  25.         void GetAppMainFrame(
  26.             [Out] out IntPtr hwnd);
  27.  
  28.         void GetAppMDIFrame(
  29.             [Out] out IntPtr hwnd);
  30.  
  31.         void CreateAddInWindow(
  32.             [In] string bstrProgID,
  33.             [In] string bstrWindowName,
  34.             [In] int lStyles,
  35.             [In] int lExStyles,
  36.             [In, Out] ref System.Drawing.Size rctSize,
  37.             [In] int Flags,
  38.             [In, Out] ref IntPtr pHwnd,
  39.             [In, Out, MarshalAs(UnmanagedType.IDispatch)] ref object pDisp);
  40.     }
  41.  
  42.     public class ТестВК :IDisposable
  43. {
  44.     [DllImport("user32.dll")]
  45.     public static extern int SetWindowLong(int hWnd, int nIndex, int dwNewLong);
  46.  
  47.     public static void SetOwner(int child, int owner)
  48.     {
  49.         SetWindowLong(child,
  50.             -8, // GWL_HWNDPARENT
  51.             owner);
  52.     }
  53.  
  54.     public dynamic Object1C;
  55.     public dynamic ГК;
  56.  
  57. public ТестВК(object Object1C)
  58.     {
  59.         this.Object1C = Object1C;
  60.         ГК = new ДинамикГК(Object1C);
  61.  
  62. }
  63.  
  64.     public dynamic Новый( params object[] Параметры)
  65.     {
  66.  
  67.         return ГК.NewObject(Параметры);
  68.     }
  69.  
  70. public dynamic ПолучитьОписаниеТиповСтроки(int ДлинаСтроки)
  71. {
  72.     return Новый("ОписаниеТипов", "Строка", null, Новый("КвалификаторыСтроки", ДлинаСтроки, ГК.ДопустимаяДлина.Переменная));
  73.  
  74. } // ПолучитьОписаниеТиповСтроки()
  75.  
  76. // Служебная функция, предназначенная для получения описания типов числа, заданной разрядности.
  77. //
  78. // Параметры:
  79. //  Разрядность          - число, разряд числа.
  80. //  РазрядностьДробнойЧасти - число, разряд дробной части.
  81. //
  82. // Возвращаемое значение:
  83. //  Объект "ОписаниеТипов" для числа указанной разрядности.
  84. //
  85. public dynamic ПолучитьОписаниеТиповЧисла(int Разрядность, int РазрядностьДробнойЧасти = 0, int ЗнакЧисла = 1)
  86. {
  87.     object КвалификаторЧисла;
  88.     if (ЗнакЧисла == 1)
  89.         КвалификаторЧисла = Новый("КвалификаторыЧисла", Разрядность, РазрядностьДробнойЧасти);
  90.     else
  91.         КвалификаторЧисла = Новый("КвалификаторыЧисла", Разрядность, РазрядностьДробнойЧасти, ЗнакЧисла);
  92.  
  93.  
  94.     return Новый("ОписаниеТипов", "Число", КвалификаторЧисла);
  95.  
  96. } // ПолучитьОписаниеТиповЧисла()
  97.  
  98. public dynamic ПолучитьОписаниеТиповДаты(dynamic ЧастиДаты)
  99. {
  100.     return Новый("ОписаниеТипов", "Дата", null, null, Новый("КвалификаторыДаты", ЧастиДаты));
  101.  
  102. } // ПолучитьОписаниеТиповДаты()
  103. public object ВернутьТз()
  104. {
  105.  
  106.     dynamic Тз = Новый("ТаблицаЗначений");
  107.     dynamic Колонки = Тз.Колонки;
  108.     Колонки.Добавить("КолонкаЧисло", ПолучитьОписаниеТиповЧисла(9, 0));
  109.     Колонки.Добавить("КолонкаЧисло4", ПолучитьОписаниеТиповЧисла(7, 2));
  110.     Колонки.Добавить("КолонкаДата", ПолучитьОписаниеТиповДаты(ГК.ЧастиДаты.ДатаВремя));
  111.     Колонки.Добавить("КолонкаСтрока", ПолучитьОписаниеТиповСтроки(0));
  112.     dynamic Стр = Тз.Добавить();
  113.     Стр.КолонкаЧисло = 4;
  114.     Стр.КолонкаЧисло4 = 3.14m;
  115.     Стр.КолонкаДата = DateTime.Now;
  116.     Стр.КолонкаСтрока = "Заполнение из ВК";
  117.     return Тз;
  118. }
  119.     void УничтожитьОбъект(object Объект)
  120. {
  121.     Marshal.Release(Marshal.GetIDispatchForObject(Объект));
  122.     Marshal.ReleaseComObject(Объект);
  123.  
  124.  
  125. }
  126.  
  127.     public void ВызватьГС()
  128.     {
  129.  
  130.         GC.Collect();
  131.         GC.WaitForPendingFinalizers();
  132.     }
  133. public string СоздатьОкно() {
  134.     //    m_1cApp.AppDispatch.Сообщить("Привет из ВК");
  135.     // не работает для упрощения работы создань динамический объект ДинамикГК
  136.     // выполняющий аналогичную фунцию
  137.    
  138.             IExtWndsSupport n;
  139.             ГК.Сообщить("Привет из ВК", ГК.СтатусСообщения.Важное);
  140.             n = (IExtWndsSupport)Object1C;
  141.             IntPtr hwnd;
  142.              n.GetAppMainFrame(out hwnd);
  143.  
  144.     // Создаем форму, устанавливаем нативные хэндлы и устанвливаем окно 1С владельцем нетовского окна
  145.             var form = new Form1();
  146.             form.CreateControl();
  147.             SetOwner(form.Handle.ToInt32(), hwnd.ToInt32());
  148.             form.EventTo1C = Object1C as IAsyncEvent;
  149.            
  150.           form.Show();
  151.            
  152.             return "Методы ВК выполнены!";
  153.         }
  154.  
  155.     public void Закрыть()
  156.     {
  157.          Dispose();
  158.          ВызватьГС();
  159.  
  160.     }
  161.  
  162.     bool disposed = false;
  163.     public void Dispose()
  164.     {
  165.         Dispose(true);
  166.         GC.SuppressFinalize(this);
  167.     }
  168.  
  169.     // Protected implementation of Dispose pattern.
  170.     protected virtual void Dispose(bool disposing)
  171.     {
  172.         if (disposed)
  173.             return;
  174.  
  175.         if (disposing)
  176.         {
  177.             if (Object1C != null)
  178.             {
  179.                 УничтожитьОбъект(Object1C);
  180.                  Object1C = null;
  181.                
  182.                 ((IDisposable) ГК).Dispose();
  183.                     ГК = null;
  184.                 // Free any other managed objects here.
  185.                 //
  186.                 }
  187.         }
  188.  
  189.         // Free any unmanaged objects here.
  190.         //
  191.         disposed = true;
  192.     }
  193. }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement