Переключение на Главную Страницу Страницы: 1 2 3 [4] 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Создание компонент (число прочтений - 29638 )
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Создание компонент
Ответ #45 - 24. Апреля 2008 :: 05:44
Печать  
Цитата:
mscorlib: Method 'System.Object.СоздатьОбъект' not found.

Мне эта строка говорит, что Метод не найден. Соответственно варианты: 1) Попробовать написать по аглицки "CreateObject" либо 2) в Инит приходит НЕ объект 1С-ины, а что-то типа "System.Object".
З.Ы. Программить на нижнем уровне вообще не умею, так что это все чисто умозрительные заключения. Не принимать как руководство к действию.
  
Наверх
ICQ  
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #46 - 24. Апреля 2008 :: 05:50
Печать  
Salimbek писал(а) 24. Апреля 2008 :: 05:44:
Цитата:
mscorlib: Method 'System.Object.СоздатьОбъект' not found.

Мне эта строка говорит, что Метод не найден. Соответственно варианты: 1) Попробовать написать по аглицки "CreateObject" либо 2) в Инит приходит НЕ объект 1С-ины, а что-то типа "System.Object".
З.Ы. Программить на нижнем уровне вообще не умею, так что это все чисто умозрительные заключения. Не принимать как руководство к действию.


Понимаю, хочется поучаствовать.
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание компонент
Ответ #47 - 24. Апреля 2008 :: 06:44
Печать  
DrunkProgrammer писал(а) 24. Апреля 2008 :: 05:23:
mscorlib: Method 'System.Object.СоздатьОбъект' not found.

Если ВК работает в 7.7, то пиши CreateObject.
Если в 8.1 - NewObject.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #48 - 24. Апреля 2008 :: 07:16
Печать  
Уже почти разобрался, по крайней мере объекты 1С уже вытаскиваю, когда разберусь во всем окончательно, выложу пример. Появилась другая проблема: в процедуре Init() я присваиваю значения переменным, а когда пытаюсь получить эти значения в других процедурах, то они там ничего не содержат. Вот пример тестового кода:

public class ExcelReader : IInitDone
{
       public string s = "0";
       public void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection)
       {
           try
           {
               s = "1";
               MessageBox.Show(s); //выводится 1
           }
           catch
           {
               throw new COMException(@"Unknown object context ");
           }
       }

        public void Test()
       {
              MessageBox.Show(s);  //выводится 0
       }
}

При тесте сначала выводится 1, а потом 0.
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #49 - 24. Апреля 2008 :: 07:33
Печать  
С очисткой переменной разобрался, оказывается после Init() создается еще 3 экземпляра класса и я считываю значения переменных в последнем экземпляре.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Создание компонент
Ответ #50 - 24. Апреля 2008 :: 07:45
Печать  
Если дойдет дело до создания примера с исходниками на шарпе, это будет хорошо.
А то что-то нету пока здесь ничего такого.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #51 - 24. Апреля 2008 :: 08:27
Печать  
Тут проблема такая: после закрытия 1С в памяти остается процесс 1cv7.exe. Присваивал переменным null и Marshal.Release(Marshal.GetIDispatchForObject(Объект)) использовал и GC.Collect();
 GC.WaitForPendingFinalizers();, а 1С-ка все равно висит. Приходится через диспетчер задач закрывать.
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Создание компонент
Ответ #52 - 24. Апреля 2008 :: 08:30
Печать  
DrunkProgrammer писал(а) 24. Апреля 2008 :: 08:27:
Тут проблема такая: после закрытия 1С в памяти остается процесс 1cv7.exe. Присваивал переменным null и Marshal.Release(Marshal.GetIDispatchForObject(Объект)) использовал и GC.Collect();
 GC.WaitForPendingFinalizers();, а 1С-ка все равно висит. Приходится через диспетчер задач закрывать.


Ты это... Почитай все-таки про подсчет ссылок...
  
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Создание компонент
Ответ #53 - 24. Апреля 2008 :: 08:31
Печать  
Marshal.FinalReleaseComObject(disp1C);
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание компонент
Ответ #54 - 24. Апреля 2008 :: 08:41
Печать  
kms писал(а) 24. Апреля 2008 :: 07:45:
Если дойдет дело до создания примера с исходниками на шарпе, это будет хорошо.
А то что-то нету пока здесь ничего такого.

А вот это не то?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Создание компонент
Ответ #55 - 24. Апреля 2008 :: 09:05
Печать  
Не знаю пока. Улыбка
В принципе, пара ссылок и описание набитых по дороге шишек делают эту веткой весьма полезной.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Создание компонент
Ответ #56 - 24. Апреля 2008 :: 09:05
Печать  
По поводу Init() - может это поможет http://soaron.fromru.com/vkhints.htm - а именно

1.2.2. Методы Init и Done интерфейса IInitDone вызываются 1с n+1 раз, где n - количество объектов экспортируемых компонентой. Надо внимательно в этих методах работать с динамической памятью.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #57 - 24. Апреля 2008 :: 09:13
Печать  
Как оказалось, из-за того, что в пользовательском классе я не убивал один из объектов (а именно ТаблицаЗначений) метод Done() не срабатывал.

Вот пример компоненты на C# 2.0 для 1С 7.7 с получением и использованием 1С-оского класса:

Код
Выбрать все
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace AddIn
{
    [Guid(@"AB634001-F13D-11D0-A459-004095E1DAEA"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IInitDone
    {
	  void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection);
	  void Done();
	  void GetInfo([MarshalAs(UnmanagedType.SafeArray,
		    SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo);
    }

    [Guid("AB634004-F13D-11D0-A459-004095E1DAEA"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IAsyncEvent
    {
	  void SetEventBufferDepth(Int32 depth);
	  void GetEventBufferDepth(ref Int32 depth);
	  void ExternalEvent([MarshalAs(UnmanagedType.BStr)] String source,
						 [MarshalAs(UnmanagedType.BStr)] String message,
						 [MarshalAs(UnmanagedType.BStr)] String data);
	  void CleanBuffer();
    }





    [ComVisible(true), ProgId(@"AddIn.ExcelReader"),
    Guid(@"9F0CF3B4-B799-4852-8293-9BB9500A3099"),
    ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class ExcelReader : IInitDone
    {
	  public static Object pCon = new object();

	  public ExcelReader(){}

	  public void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection)
	  {
		try
		{
		    pCon = pConnection;
		}
		catch
		{
		    throw new COMException(@"Unknown object context ");
		}
	  }

	  public void Done()
	  {	  
	  }

	  public void Test()
	  {
		object obj1C = pCon.GetType().InvokeMember("AppDispatch", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, pCon, null);
		Object[] Args = new Object[1];
		Args[0] = "ТаблицаЗначений";
		object Object1C = obj1C.GetType().InvokeMember("CreateObject", BindingFlags.GetProperty, null, obj1C, Args);

		Args[0] = "Должность";
		Object1C.GetType().InvokeMember("НоваяКолонка", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, Args);

		Args[0] = "Зарплата";
		Object1C.GetType().InvokeMember("НоваяКолонка", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, Args);

		Object1C.GetType().InvokeMember("НоваяСтрока", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, null);


		Object1C.GetType().InvokeMember("УстановитьЗначение", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, new object[] { 1, "Должность", "Программер" });

		Object1C.GetType().InvokeMember("ВыбратьСтроку", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, null);

		Marshal.Release(Marshal.GetIDispatchForObject(Object1C));
		Marshal.ReleaseComObject(Object1C);
	  }



	  public void GetInfo([MarshalAs(UnmanagedType.SafeArray,
	  SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo)
	  {
		pInfo[0] = @"";
	  }
    }
} 

« Последняя редакция: 18. Мая 2008 :: 07:26 - DrunkProgrammer »  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание компонент
Ответ #58 - 24. Апреля 2008 :: 10:12
Печать  
DrunkProgrammer писал(а) 24. Апреля 2008 :: 09:13:
public class ExcelReader

А для чего нужен класс с таким названием?Подмигивание
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание компонент
Ответ #59 - 24. Апреля 2008 :: 10:13
Печать  
раньше элементы описания интерфейсов IDL и код классов располагались в разных местах.
в шарпе все мешали вкучу.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 
ОтправитьПечать