![]() |
![]() |
![]() |
|
Как использовать функцию из внешней 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
|
Ура! На оффсайте выложили свежую версию "индексатора" с возможностью запуска из командной строки. Что ж, спасибо им за оперативность. А всем форумчанам - за участие и стоящие советы. Так или иначе вопрос снят :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |