Имя: Пароль:
1C
 
Как использовать функцию из внешней dll?
0 kvm64
 
04.12.06
08:22
Кто подскажет, можно ли в 1С использовать dll, не являющуюся внешней компонентой? Например, имеется библиотека IdxTsk3.dll и в ней функция add_in_index, имеются примеры подключения и использования в Delphi.

Пример подключения в Delphi:  
function add_in_index( key : PCHAR; adress : DWORD; filename : PCHAR) : integer; cdecl; external 'IdxTsk3.dll' name 'add_in_index';  
Пример использования в Delphi:  
add_in_index( PChar(key), address, PChar(IndxFileName));

Можно ли как-то использовать это в 1С?
1 ТелепатБот
 
гуру
04.12.06
08:22
2 Морозов Александр
 
04.12.06
08:24
а нафига?
3 Skom
 
04.12.06
08:25
тебе именно эта функция нуна или просто как вариант можно или нет???7
4 kvm64
 
04.12.06
08:29
Нужна именно эта функция. Именно этой dll. Чтобы создать файл-индекс для загрузки в ТСД. Драйвер ТСД таких методов не имеет.
5 GrayT
 
04.12.06
09:55
Может с этим поколдовать? http://www.script-coding.info/dynwrap.html
6 kvm64
 
04.12.06
11:07
To GrayT
По приведенному там описанию не понял, как указать тип вызова "_cdecl", а также типы параметров PChar и DWord - "w" и "u" соответственно? И вообще, будет ли это работать с ЛЮБОЙ dll?
7 kvm64
 
04.12.06
19:25
с  http://www.script-coding.info/dynwrap.html разобрался. Действительно, можно вызывать функцию из нужной библиотеки. Во этот кусок кода в моем случае работает:

Перем Wrapper;
Процедура ПриОткрытии()
   Wrapper = CreateObject("DynamicWrapper");
   Wrapper.Register("IdxTsk3.dll", "add_in_index", "i=sls", "f=c", "r=l");
   ...
КонецПроцедуры
Функция ДобавитьИндекс(key,adress,filename)
   Возврат Wrapper.add_in_index(key,adress,filename);
КонецФункции

Интересующую библиотеку IdxTsk3.dll пришлось положить в Windiws\System32, как и dynwrap.dll. Однако осталась проблема - не могу сообразить, как из 1С-ки передать функции параметр типа dword (adress). В результате все работает, т.е.создается индексный файл, но файл неправильный. Именно в части adress.
Я в него засовываю обычное число. Может теперь кто-нибудь подскажет, как 1С-ное число преобразовать в dword?
8 JCage
 
04.12.06
19:31
Попробуй передавать строку типа "00001111".
Или как вариант обращаться к DynamicWrapper из скрипта на JScript.
9 kvm64
 
04.12.06
19:59
To JCage
На JScript никогда не писал :(
А по-поводу строки: это имеется в виду двоичная запись или 16-ричная?
10 JCage
 
04.12.06
20:10
(9) 16-ричная.

По поводу JScript - там ничего сложного:
http://www.script-coding.info/MSScriptControl.html - здесь пример работы со скриптами из 1С

http://www.script-coding.info/dynwrap.html - пример скриптов на vb (можно использовать и его)
11 kvm64
 
04.12.06
21:13
(10) Тогда резонный вопрос: можно ли вызвать функцию внешней библиотеки прямо из скриптя минуя DynamicWrapper?
12 JCage
 
04.12.06
21:19
(11)  Из Jscript - точно нет. Из vb вроде можно вызывать API функции. Но насчет других dll - незнаю. Попробуй, только потом не забудь рассказать:)
13 LittleJunior
 
05.12.06
14:12
Попробуй так:
Wrapper.Register("IdxTsk3.dll", "add_in_index", "i=sps", "f=c", "r=l");
14 Каанкереде
 
05.12.06
14:22
Где то виде ВК, через которую можно обычные dll юзать
15 JCage
 
05.12.06
14:54
(14) см (10).2
16 kvm64
 
05.12.06
16:46
(13) Если указать "i=sps" на строке

Возврат Wrapper.add_in_index(key,adress,filename);

вываливаемся из процедуры. 1С пишет "Неизвестная ошибка" :(
17 LittleJunior
 
05.12.06
23:35
Это забавно... Давно не занимался OLE, но ради такого случая открыл код своего OLE сервера (на Borland C++ Builder), созал фэйк-функцию CheckPointer(long* testval), далее в 1С:

Перем adress;
Компонент = СоздатьОбъект("fpwinole.FpwinOLEAutomation");
adress = 5555;
Компонент.CheckPointer(adress);

После чего в отладчике С++ посмотрел передаваемые значения:
Все правильно делает 1С, передает именно адрес переменной adress, а не ее значение. Т.ч. надо искать решение этой проблемы...
18 kvm64
 
06.12.06
09:06
(17)По смыслу в параметр adress моей функции должно быть передано ЗНАЧЕНИЕ типа dword, а не какой-то указатель. Я должен вызывать функцию в цикле - пройти по всем записям исходного файла, взять из каждой ключ(первый параметр), указать смещение записи относительно начала файла(второй параметр) и название индексного файла(третий параметр) в который должен быть добавлен индекс; с первым и третьим параметрами все ОК - ключи передаются правильно, файл с нужным именем создается. А со вторым параметром грабли. Сравниваю получающийся файл с тестовым (сформированным из тех же исходных данных). Различия и в заголовке и в содержании полей. Тестовый грузится в ТСД на ура. А мой - вышибает систему: "память не может быть..." и прочий бред винды :(
19 Garlic
 
06.12.06
09:32
(18) dll-ка самописная на Дельфях? Если да - перепиши функцию add_in_index, чтобы конвертировала 2 параметр в dword.
20 1C_Patriot
 
06.12.06
09:35
у нас много общего внешним компонентам пиши 218082381
21 kvm64
 
06.12.06
09:50
(19)dll-ка из поставки "Драйвер ТСД" компании "Штрих-М". Входит в комплект вместе с ихним "Внешним индексатором". "Внешний" - потому что программно не управляется. В самом первом посте - разъяснения с их оффсайта по использованию библиотеки, впрочем смотрите сами http://forum.shtrih-m.ru/viewtopic.php?t=4645&start=0&postdays=0&postorder=asc&highlight= (посты не мои). Писал бы в Дельфи - уже выпросил бы исходники и прикрутил бы ОЛЕ-интерфейс, чтобы стала полноценной ВК.
22 MMF
 
06.12.06
10:57
столько страдать из-за одной несчастной функции :-) сделай ВК-обертку.
23 kvm64
 
06.12.06
12:34
Дельфи под рукой нет - у клиентов в Тьмутаракани. Хоть и не пишу в Дельфи, ради такого случая написал бы :)
24 GrayT
 
06.12.06
12:37
На соседний софтовый рынок сходи :)
25 Bahmet
 
06.12.06
12:50
А какие требования к dllке у 1С,чтоб её можно было прикрутить как ВК???
26 Истина
 
06.12.06
12:52
А зачем использовать внешний индексатор? Какая вообще задача стоит?
27 kvm64
 
06.12.06
12:56
с таким же успехом здесь можно MSDN искать :)))
28 GrayT
 
06.12.06
12:57
(25)"технология создания внешних компонент" ищи
29 GrayT
 
06.12.06
12:58
(27)Далекова-то тебя знанесло
30 Истина
 
06.12.06
12:58
(27) Не признАешься чего сделать надо? Может не в ту сторону роешь?
31 kvm64
 
06.12.06
13:08
(26) Задача - загрузить ТСД данными (штрихкод-наименование) о товарах. Более 40 тыс. записей. Методы, доступные через драйвер - медленные, ТСД грузится 2,5 часа. Можно раз в 5 быстрее, для этого предварительно нужно данные записать в файлы определенного формата и затем загрузить их в ТСД. Загружать файлы драйвер умеет, а вот подготовить с помощью него файлы нельзя. Можно возпользоваться "внешним  индексатором" - программой с визуальным интерфейсом, в которую вводишь необходимые параметры. Я это могу. Но рядовые юзеры - нет. Возможности запуска из командной строки у "индексатора" нет. Вот на оффсайте раздобыл инфу (мой первый пост) и пытаюсь выкрутиться, но не получается. Подозреваю, что DynamicWrapper работает корректно, и с передачей long вместо dword проблем вроде не должно быть (у меня значения не такие огромные). Скорее всего - информация с оффсайта неполна
32 Истина
 
06.12.06
13:14
Нда... Или копать или юзерей учить.
33 kvm64
 
06.12.06
13:50
Ура! На оффсайте выложили свежую версию "индексатора" с возможностью запуска из командной строки. Что ж, спасибо им за оперативность. А всем форумчанам - за участие и стоящие советы. Так или иначе вопрос снят :)