Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подключение dll-библиотеки  (Прочитано 33294 раз)
0 Пользователей и 1 Гость смотрят эту тему.
YarlikovaE
Гость
« : 16-04-2010 02:46 » 

Помогите решить проблему!

Нужно подключить к 1С 8.х dll-библиотеку с незамысловатым функционированием. Например, функция MySumm(a,b). Возможно ли это сделать без создания COM - сервера?
Что необходимо написать в модуле внешней обработки 1С 8.х, если название библиотеки "Sm.dll"?
Библиотека написана в Delphi и содержит только одну функцию MySumm (возвращает значение Real).

Данные из книги Попова не приводить: слишком сложный пример.

Встречала такой пример:

ЗагрузитьВнешнююКомпоненту("Math.dll");
МФ = Новый("Addln.Math");
Сообщить(МФ.RAND());

Но исходя из объяснений которые я встречала, что эту простую функцию как RAND() (генерацию случайной величины), можно реализовать только путем организации СOM-сервера?  Я шокирован!
Или все можно обойтись без этих сложностей и обратиться напрямую к функции dll- библиотеки, без  СOM-сервера?
Пробовала реализовать доступ к dll напрямую исходя из приведенного примера, но у меня выдается ошибка
 
Ошибка при создании объекта из компоненты C:\Documents and Settings\Admin\Рабочий стол\111\Project1.dll (отсутствует CLSID)
Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует CLSID)
Сообщить(МФ.MySumma(1.2,1.3));
{Отчет.новый1.Форма.Модуль(5)}: Значение не представляет агрегатный объект (MySumma)
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #1 : 16-04-2010 04:40 » 

Зарегистрировать нужно библиотеку. У тебя Math.dll так?

Для регистрации файла:
1.   скопируйте файл Math.dll в каталог с программой 1С, в нашем примере это C:\Program Files\1Cv77\BIN\ ;
2.   выполните команду: regsvr32.exe "C:\Program Files\1Cv77\BIN\Math.dll".
Записан
YarlikovaE
Гость
« Ответ #2 : 16-04-2010 05:09 » 

У меня библиотека самодельная. Вызов библиотеки dll срабатывает, а вот функцию внутри не может определить. Подскажите в чем проблема в коде библиотеки или коде 1С?

Пример библиотеки dll - библиотеки (Delphi7)

                  library Project1;
                  uses
                  SysUtils,
                  Classes; {}
                  function MySumma(a,b : Real) : Real; stdcall;
                  begin
                        MySumma := a+b;
                  end;
                  exports MySumma;
                  end.


Код в 1Сv7:

                 Процедура Сформировать()
                     ЗагрузитьВнешнююКомпоненту("Project1.dll");
                     МФ = ПодключитьВнешнююКомпоненту("Addln.Project1");
                     Сообщить(МФ.MySumma(1.2,1.3));
                 КонецПроцедуры

ошибка при компиляции 1С:

       Ошибка при создании объекта из компоненты C:\Documents and Settings\Admin\Рабочий стол\111
      \Project1.dll (отсутствует CLSID)
      Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует CLSID)
      Сообщить(МФ.MySumma(1.2,1.3)); //случайное число в промежутке от 0 до 32767
     {Отчет.Отчетdll.Форма.Модуль(5)}: Значение не представляет агрегатный объект (MySumma)

Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 16-04-2010 05:34 » 

1С умеет работать только с OLE (COM) объектами. Ошибка у тебя потому и выдается, что у тебя не COM объект.
Вот по этому адресу http://www.kuban.ru/forum_new/forum9/arhiv/253752.html встречал код для использования любых dll с 1С (там пример для 7.7) с помощью обертки DynamicWrapper
Код:
Процедура Сформировать()
  Wrapper = CreateObject("DynamicWrapper");
  Wrapper.Register( "KERNEL32.DLL","Sleep","I=h","f=s");
  Message("Спим 3 секунды....." + CurrentTime());
  Wrapper.Sleep(3000);
  Message("С добрым утром!....." + CurrentTime());
КонецПроцедуры
Описание dynwrap на: http://www.script-coding.info/dynwrap.html
Записан
YarlikovaE
Гость
« Ответ #4 : 19-04-2010 02:44 » 

Спасибо за ответ. Получилось подключиться к dll.
Через библиотеку dynwrap.dll, вызов функции работает. Только возникает ошибка при передачи значений real.

Например:

Код dll

library MyDll;
uses
  SysUtils,
  Classes;
function MySumm(a,b: real): Real; stdcall;
  begin
    MySumm:= a+b;
  end;
  exports MySumm;
end.

Код 1Сv7

Процедура Сформировать
   f1 = 10;
   f2 = 1.1;
   Wrapper = CreateObject("DynamicWrapper");
   Wrapper.Register("MyDll.dll", "MySumm", "i=dd", "f=s", "r=?Не понял?");
   War_1 = Wrapper.MySumm(f1,f2);
   Message(War_1);
КонецПроцедуры

При параметре r = f или l, система выдает ответ: 0. При параметре r = d, система выпадает в ошибку.

Подскажите как можно на выходе получить значение real?

Так же возникает ошибка при работе со строками (параметр r=s). Например если на выходе данные типа PChar, так же возникает критическая ошибка, подскажите как бороться с этим? (Принять один символ удалось, при присвоении значения параметру r=c).
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 19-04-2010 05:50 » 

YarlikovaE, тут уж ничего не подскажу - я не работал с этой библиотекой (только недавно ее нашел, еще не было задачи чтобы проверить). Но если найдешь решение - напиши здесь, пожалйуста, что и как...
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 19-04-2010 05:52 » 

Я могу и ошибаться, но по-моему при создании библиотек на Delphi не рекомендуется использовать такие типы, как у тебя (real & string) - нужно писать через double & PChar
Записан
YarlikovaE
Гость
« Ответ #7 : 20-04-2010 04:16 » 

Да в самой dll - библиотеке, необходимо использовать тип PChar, но это та же строка.
Но вот в самой 1С принять строку или символ не удалось, получились только операции с числами. Вообще библиотека dynwrap.dll предназначена для обращение к системным функциям.

В 1Сv8 подключение происходит следующим образом, на примере все той же библиотеки MyDll.dll:

Процедура КнопкаСформироватьНажатие(Кнопка)
   f1 = 10;
   f2 = 1.1;
   Wrapper = New COMОбъект("DynamicWrapper");
   Wrapper.Register("MyDll.dll", "MySumm", "i=dd", "f=s", "r=l");
   War_1 = Wrapper.MySumm(f1,f2);
   Message(War_1);
КонецПроцедуры

На выходе получаем целое число (11).

Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-04-2010 15:58 » 

PChar - это не String!
Хотя со ссылкой на строку ты можешь работать как с PChar, но не наоборот!
String хранит в начальных байтах дополнительную информацию, т.е. если String ссылается на адрес 100, то на самом деле память выделена с адреса 96 и 4 байта - это служебная инфа для String (о чем знает только Delphi). Соответственно PChar реально начинатся с 100 адреса и если к нему обратиться как к String - большая вероятность нарушения области памяти.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines