Список форумов «Русский Форум» «Русский Форум»
Программирование по-русски.
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

DLL

 
Начать новую тему   Ответить на тему    Список форумов «Русский Форум» -> Глагол и Windows
Предыдущая тема :: Следующая тема  
Автор Сообщение
Сый
Администратор


Зарегистрирован: 05.10.2005
Сообщения: 317

СообщениеДобавлено: Ср Май 24, 2006 7:26    Заголовок сообщения: DLL Ответить с цитатой

Вызов библиотек DLL и функций из них:

Код:
;************************************************************************
;ЗАДАЧА Библиотека-(имя-:РЯД ИЗ ЗНАК):ЦЕЛ;
ZADACHA OS_Bibliotjeka
%$imia     priem
%$dlimia   priem
        push    dword [ebp+%$imia]
        call    [__imp_LoadLibraryA]
KON

;************************************************************************
;ЗАДАЧА ОсвободитьБ-(библиотека:ЦЕЛ);
ZADACHA OS_OsvoboditeB
%$bibliotjeka priem
        push    dword [ebp+%$bibliotjeka]
        call    [__imp_FreeLibrary]
KON

;************************************************************************
;ЗАДАЧА АдресФункции-(библиотека:ЦЕЛ; имя-:РЯД ИЗ ЗНАК):ЦЕЛ;
ZADACHA OS_AdrjesFunkcii
%$bibliotjeka priem
%$dlimia      priem
%$imia        priem
        push    dword [ebp+%$bibliotjeka]
        push    dword [ebp+%$imia]
        call    [__imp_GetProcAddress]
KON


Последний раз редактировалось: Сый (Пн Июн 05, 2006 22:43), всего редактировалось 3 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Сый
Администратор


Зарегистрирован: 05.10.2005
Сообщения: 317

СообщениеДобавлено: Ср Май 24, 2006 7:38    Заголовок сообщения: Ответить с цитатой

В ОС.asm имена используемых в нём фукций, естественно, нужно добавить следующие (для Alink):
Код:
extern __imp_LoadLibraryA
extern __imp_FreeLibrary
extern __imp_GetProcAddress

Описание для ОС.отд:
Код:
(******************************************************************************)
ЗАДАЧА Библиотека-(имя-:РЯД ИЗ ЗНАК):ЦЕЛ;
КОН Библиотека;

(******************************************************************************)
ЗАДАЧА ОсвободитьБ-(библиотека:ЦЕЛ);
КОН ОсвободитьБ;

(******************************************************************************)
ЗАДАЧА АдресФункции-(библиотека:ЦЕЛ; имя-:РЯД ИЗ ЗНАК):ЦЕЛ;
КОН АдресФункции;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Сый
Администратор


Зарегистрирован: 05.10.2005
Сообщения: 317

СообщениеДобавлено: Вс Май 28, 2006 18:59    Заголовок сообщения: Ответить с цитатой

Использование (вызов задачи Beep из библиотеки kernel32):
Код:
ОТДЕЛ Писк+;

ИСПОЛЬЗУЕТ ОБХОД, ОС ИЗ "...\Отделы\Обмен\", Вывод ИЗ "...\Отделы\Обмен\";

ВИД
  Функция = ЗАДАЧА(Длительность, Частота: ЦЕЛ);

ПЕР
  Библ, АФ: ЦЕЛ;
  Сигнал: Функция;

УКАЗ
  Библ := ОС.Библиотека("kernel32.dll");
  АФ := ОС.АдресФункции(Библ, "Beep");
  Сигнал:=ОБХОД.Значение(Функция, АФ);
  Сигнал(500, 1000);
  ОС.ОсвободитьБ(Библ)

КОН Писк.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Издатель
Рядовoй
Рядовoй


Зарегистрирован: 29.05.2006
Сообщения: 6

СообщениеДобавлено: Пн Май 29, 2006 18:58    Заголовок сообщения: Ответить с цитатой

Как Вы думаете, целесообразно ли переработать весь файл ОС.asm в ОС.отд, перенеся ОС.Библиотека() и ОС.АдресФункции() в Асм.asm? Если да, то не смогли бы Вы этим заняться? Передавать цепочку знаков можно так:
Код:
ВИД
  Задача2=ЗАДАЧА(п1,п2:ЦЕЛ);

ЗАДАЧА ПриёмЦепочки(адрес,размер:ЦЕЛ);
ПЕР
  цепь:ЦЕПЬ[20]; (* можно ДОСТУП К ЦЕПЬ *)
  поз:ЦЕЛ;
УКАЗ
(* СОЗДАТЬ(цепь,размер); *)
  ОТ поз:=0 ДО размер-1 ВЫП
    ОБХОД.ИзПамяти(адрес+поз,цепь[поз])
  КОН;
  Вывод.Цепь(цепь) (* цепь^ *)
КОН ПриёмЦепочки;

ЗАДАЧА ПередачаЦепочки;
ПЕР
  ВнешняяЗадача:Задача2;
  цепь:ЦЕПЬ[20];
УКАЗ
  цепь:="Сыю привет!^";
  ВнешняяЗадача:=ПриёмЦепочки;
  ВнешняяЗадача(ОБХОД.Адрес(цепь),РАЗМЕР(цепь)) (* можно ДЛИНА(цепь) *)
КОН ПередачаЦепочки;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Сый
Администратор


Зарегистрирован: 05.10.2005
Сообщения: 317

СообщениеДобавлено: Чт Июн 01, 2006 9:26    Заголовок сообщения: Ответить с цитатой

Думаю, что отказываться от WIN32.lib, используя только вызов библиотек, нецелесообразно. Да и задачи Библиотека и АдресФункции относятся к ОС.asm, поскольку используют функции, вызываемые из Windows. Насколько я знаю, функция LoadLibrary обычно используется для вызова маленьких библиотек, используемых однажды в программе. Но если Вы считаете иначе, то можно и переделать.
А я предлагаю просто разместить эти задачи в ОС.asm для того, чтобы дать возможность вызывать функции, которых нет в ОС.asm. Также можно добавить и задачу Сигнал.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Издатель
Рядовoй
Рядовoй


Зарегистрирован: 29.05.2006
Сообщения: 6

СообщениеДобавлено: Пт Июн 02, 2006 18:52    Заголовок сообщения: Ответить с цитатой

Вызов некоторых системных задач Windows из ОС.asm приходится сопровождать небольшими преобразованиями входных и выходных данных. Эти преобразования не очень удобно записывать на ассемблере. Также иногда требуется быстро завести новую системную задачу. Было бы проще для этих целей использовать сам Глагол. Вот тут бы и пригодились ваши новые задачи. Всё-таки я пока склоняюсь к новому ОС.отд. Если у вас сейчас нет времени, сообщите. Тогда попробую сделать его сам в ближайшее время.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Сый
Администратор


Зарегистрирован: 05.10.2005
Сообщения: 317

СообщениеДобавлено: Сб Июн 03, 2006 13:02    Заголовок сообщения: Ответить с цитатой

Вы предлагаете привести ОС.отд в такому виду:
Код:
ОТДЕЛ ОС;

ИСПОЛЬЗУЕТ
  ОБХОД,Асм ИЗ "..\Иное\";

ПЕР
  Библиотека,АдресФункции:ЦЕЛ;

ВИД
  вВремя=ЗАДАЧА():ЦЕЛ;
  вСпать=ЗАДАЧА(мс:ЦЕЛ);

ПЕР
  Время-:вВремя;
  Спать-:вСпать;

УКАЗ
  Библиотека:=Асм.Библиотека("kernel32.dll");
  Время:=ОБХОД.Значение(вВремя,Асм.АдресФункции(Библиотека,"GetTickCount"));
  Спать:=ОБХОД.Значение(вСпать,Асм.АдресФункции(Библиотека,"Sleep"));
  Асм.ОсвободитьБ(Библиотека)

КОН ОС.

?
Я просто не вижу в этом особой нужды, т. к. библиотеки Глагола уже написаны. Разве что, если только это увеличит скорость работы программ.
И что делать со сложными задачами, типа ОС.ФДляПополнения и ОС.Опрос?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Издатель
Рядовoй
Рядовoй


Зарегистрирован: 29.05.2006
Сообщения: 6

СообщениеДобавлено: Вс Июн 04, 2006 19:14    Заголовок сообщения: Ответить с цитатой

По вашей просьбе в ОС.asm теперь появились:
Код:
ЗАДАЧА ИспользоватьБ(имя-:ЦЕПЬ):ЦЕЛ;
(* Выдаёт ссылку на dll библиотеку с именем <имя>. При неудаче возвращает 0. *)

ЗАДАЧА ОтказатьсяОтБ(библиотека:ЦЕЛ);

ЗАДАЧА АдресИзБ(библиотека:ЦЕЛ; имя-:ЦЕПЬ):ЦЕЛ;

ЗАДАЧА Гудок(частота,длительность:ЦЕЛ);
(* системный гудок, <частота> и <длительность> используются только в WinXP *)

Будьте осторожны, после вызова "ОтказатьсяОтБ" адреса задач данной библиотеки могут стать недействительными.


Последний раз редактировалось: Издатель (Чт Июн 22, 2006 8:13), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Сый
Администратор


Зарегистрирован: 05.10.2005
Сообщения: 317

СообщениеДобавлено: Вс Июн 04, 2006 20:26    Заголовок сообщения: Ответить с цитатой

Спасибо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Издатель
Рядовoй
Рядовoй


Зарегистрирован: 29.05.2006
Сообщения: 6

СообщениеДобавлено: Чт Июн 22, 2006 8:32    Заголовок сообщения: Ответить с цитатой

В новом выпуске за взаимодействие с внешними DLL отвечает "Заграница.отд".
Будьте внимательны. "ссылкаНаВвод" и "ссылкаНаВывод" перенесены в "ОС.отд". Поэтому "Ввод.отд" и "Вывод.отд" претерпели изменения. В т.ч. изменилось количество приёмников у задач отдела "Вывод.отд"!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Сый
Администратор


Зарегистрирован: 05.10.2005
Сообщения: 317

СообщениеДобавлено: Чт Июн 22, 2006 9:36    Заголовок сообщения: Ответить с цитатой

Спасибо. Сам бы я так качественно переделать ОС.отд не смог бы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов «Русский Форум» -> Глагол и Windows Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Rambler's Top100