Имя: Пароль:
1C
 
Как найти ошибку во внешней компоненете?
0 Валерыч
 
26.09.08
09:30
Здравствуйте, уважаемые.
Возникла необходимость написать внешнюю компоненту. Написал: http://infostart.ru/projects/2569/
Под 8-кой работает. Под 7.7 - не хочет. Читал инструкции, форумы и т.п. - никакие танцы с бубнами не помогают. Кто знает секрет, подскажите что надо подкрутить в исходнике (Delphi) чтобы заработало под 7.7
Ошибки такие:
если гружу ее инструкцией
Рез = ЗагрузитьВнешнююКомпоненту("CyberDVV.dll");
выдает
Ошибка при инициализации объекта из компоненты C:\PROGRA~1\1Cv77\BIN\CyberDVV.dll
Если регистрирую ее и использую конструкцию
Рез = ПодключитьВнешнююКомпоненту("AddIn.CyberDVV");
выдает
Ошибка при инициализации объекта из компоненты <Неизвестная компонента>
1 ТелепатБот
 
гуру
26.09.08
09:30
2 Jolly Roger
 
26.09.08
09:37
(0) В ресурсе прогИд прописан?
3 v77
 
26.09.08
09:42
Ну дык в отладчике посмотри
4 Валерыч
 
26.09.08
09:43
(2) прописал - все то же самое
(3) в чьем отладчике? 1С? или Delphi?
5 v77
 
26.09.08
09:47
Delphi
6 v77
 
26.09.08
09:48
я бы посмотрел сам, да у меня не компилится. там у тя какие то модули, которых у меня нету
7 Валерыч
 
26.09.08
09:48
(5) подскажи как - dll загружается динамически.
8 Валерыч
 
26.09.08
09:50
стандартный Delphi 6 ничего больше
использую 2 Indy компоненты
9 v77
 
26.09.08
09:56
Ну у меня не Delphi 6
отладка dll
в меню Run/Parameters Host Application
указываешь там экзешник одинески.
дальше как обычно. ставишь точки останова и жмешь F9. запускается 1С и пошло поехало. удачи
10 Sadovnikov
 
26.09.08
09:56
Не хотит компилиться она...
11 H A D G E H O G s
 
26.09.08
10:02
Попробуй убрать из Init-а все свое..
Сделай метод компоненты типа МояВК.Инициировать();
12 Валерыч
 
26.09.08
10:18
прошелся отладчиком: выполняется Init - нормально доходит до конца и возвращает S_OK
потом заходит в GetInfo:
    varInfo := '2000';
    PutNParam(pInfo,0,varInfo);
    GetInfo := S_OK;
нормально выполняется
потом сразу идет в Done (Почему?)
13 v77
 
26.09.08
10:23
Понатыкай точек везде. у тебя там еще страница свойств есть. мож там чего
14 Валерыч
 
26.09.08
10:30
понатыкал везде, где только можно:
до Init идет в блок страницы свойств
initialization
 TActiveXPropertyPageFactory.Create(
   ComServer,
   TAddInPropPage,
   Class_AddInPropPage);
end.
потом
AddinObj
initialization

ComServer.SetServerName('AddIn');
TComObjectFactory.Create(ComServer,TAddInObject,CLSID_AddInObject,
                'CyberPlatDVV','CyberPlat v 1.0',ciSingleInstance);

end.
ну а потом как уже писал
15 Валерыч
 
26.09.08
10:31
(6), (10) чего не хватает, чтобы скомпилилась - может я вышлю. Помогите, пожалуйста.
16 H A D G E H O G s
 
26.09.08
10:37
Убери из Init -а
Crypt_Initialize;
17 H A D G E H O G s
 
26.09.08
10:38
И попробуй. Если нормально - проблема с Dll-ой
18 Валерыч
 
26.09.08
10:41
(16) убрал - все абсолютно также
19 v77
 
26.09.08
10:47
а Init вызывается два раза? или один?
раньше вроде два раза было. может чо нибудь понаписать чтобы в Init два раза не выполнять одно и тоже
20 v77
 
26.09.08
10:48
я так всегда пишу

 if not IsLoaded then
 begin
   varFPList.pErrorLog := nil;
   pConnection.QueryInterface(IID_IErrorLog, varFPList.pErrorLog);

   varFPList.pEvent := nil;
   pConnection.QueryInterface(IID_IAsyncEvent, varFPList.pEvent);
.....
21 H A D G E H O G s
 
26.09.08
10:57
Ну тогда домой приду - будет время, попробую.. Тут на работе Дельфи нет
22 Валерыч
 
26.09.08
11:28
(19) вызывается один раз
23 Валерыч
 
26.09.08
11:33
под 8-кой где нормально работает
после Init и GetInfo вызывается RegisterExtentionAs, потом GetPages, а Done нет
24 H A D G E H O G s
 
26.09.08
11:35
(23)
А семерочный 1С-код покажи
25 Валерыч
 
26.09.08
11:40
Рез = ПодключитьВнешнююКомпоненту("AddIn.CyberDVV");
   //Рез = ЗагрузитьВнешнююКомпоненту("CyberDVV.dll");
   Если Рез <> 1 Тогда
       Предупреждение("Ошибка загрузки");
       Возврат;
   КонецЕсли;
   Сообщить("Объект создан");
   Кибер = СоздатьОбъект("AddIn.CyberDVV");
   Сообщить("Код оператора " + Кибер.Порт);
Возвращает Рез = 1
и выдает ошибку в окне сообщений
26 Валерыч
 
26.09.08
11:41
пробовал и
   Кибер = СоздатьОбъект("AddIn.CyberPlatDVV");
27 АЛьФ
 
26.09.08
11:49
В качестве бреда...
Попробуй в семерке так:
Кибер = СоздатьОбъект("CyberDVV.CyberPlatDVV");
28 Валерыч
 
26.09.08
11:57
попробовал бы, но до создатьОбъект она даже не доходит
29 АЛьФ
 
26.09.08
12:00
2(28) Погоди. Ты ж написал, что выдает ошибку "в окне сообщений". Или все же выдает предупреждение с ошибкой? Какую ошибку-то выдает?
30 Валерыч
 
26.09.08
12:01
в окне сообщений
31 АЛьФ
 
26.09.08
12:03
2(30) Что выдает-то? И на какой строке?
32 Валерыч
 
26.09.08
12:08
если гружу ее инструкцией
Рез = ЗагрузитьВнешнююКомпоненту("CyberDVV.dll");
выдает
Ошибка при инициализации объекта из компоненты C:\PROGRA~1\1Cv77\BIN\CyberDVV.dll
Если регистрирую ее и использую конструкцию
Рез = ПодключитьВнешнююКомпоненту("AddIn.CyberDVV");
выдает
Ошибка при инициализации объекта из компоненты <Неизвестная компонента>
имеено на этих строках
33 v77
 
26.09.08
12:09
procedure TAddInObject.PutNParam(var pArray: PSafeArray; lIndex: Integer; var varPut: OleVariant);
begin
 SafeArrayPutElement(@pArray, lIndex, varPut);
end;

убери собаку в @pArray и радуйся

procedure TAddInObject.PutNParam(var pArray: PSafeArray; lIndex: Integer; var varPut: OleVariant);
begin
 SafeArrayPutElement(pArray, lIndex, varPut);
end;
34 v77
 
26.09.08
12:13
вот где собака зарылась :)
35 Валерыч
 
26.09.08
12:19
огромное спасибо.
Код брал из шаблона - даже не разбирался что он делает
2 + 2 = 3.9999999999999999999999999999999...