|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Вызов функций Windows API из AutoLISP
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 9771
|
|
||||
Очень рекомендую к использованию.
http://www.script-coding.info/LangMF.html Весьма полезная для Автокада вещ! |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Все?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
В архиве - шедший в составе MS VS 6.0 API Text Viewer с файлами данных
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Для VB вытащить объявления можно. Например:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Ага, только "справочник" написан для применения в Delphi
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Супер!
GetMessagePos - Считывает положение куpсоpа для последнего сообщения, полученного из GetMessage. Тобишь, в момент запуска функции GetMessagePos, получаем цифры 32047168 определяющие положение курсора Код:
|
||||
![]() |
|
||||
Функция GetDriveType
Описание: function GetDriveType(Drive: Integer): Word; Опpеделяет, является ли накопитель Drive съемным, фиксиpованным или удаленным. Паpаметpы: Drive: Пpовеpяемый накопитель, то есть, A: это 0, B: это 1 и т.д. Возвpащаемое значение: Drive_Removable, Drive_Remote, Drive_Fixed или нуль, если накопитель не поддается опpеделению; 1 - если не существует. См. pаздел "Типы накопителей, Drive_" в главе 1. http://develab.narod.ru/api/11.htm функция находится в файле kernel32.dll Код:
|
||||
![]() |
|
||||
Функция GetFocus
Описание: function GetFocus: HWnd; Считывает окно, котоpое в данный момент имеет фокус ввода. Возвpащаемое значение: В случае успешного завеpшения - идентификатоp окна; 0 - в пpотивном случае. функция находится в файле user32.dll Код:
|
||||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Кстати, как выяснилось, метод GetMessageTime возвращает значение, которое соответствует значению недокументированной системной переменной MILLISECS. Помнится её в своё время так и не смогли расшифровать.
Код:
Цитата:
|
|||
![]() |
|
||||
(vlax-get-or-create-object "DynamicWrapperX") запускать надо один раз для всех трансляций функций.
Трансляцию функции типа вот этого - (vlax-invoke-method svr "Register" "user32.dll" "GetMessageTime" "r=l") надо делать один раз для всех последующих вызовов функций. Вызывать функции можно уже любое количество раз, типа - (vlax-invoke-method svr "GetMessageTime"). Сколько в "DynamicWrapperX" влезает этих трансляций - пока не знаю, надо на Сером форуме спросить. Но я впихивал уже больше 20. |
||||
![]() |
|
||||
Торжественный момент!
Лисп, определяющий параметры всех процессов в компьютере. PID Потоки Имя файла Это классический пример, который практически реализован на всех языках, а теперь и на AutoLISP. Данные выводятся прямо в блокнот, минуя создание файла! Благодаря помощи YMP и моральной поддержке alexii с Серого форума http://forum.script-coding.info/view...hp?id=2523&p=2 Код:
![]() Последний раз редактировалось Supermax, 03.12.2008 в 11:32. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Побуду "тупицей": а теперь то же самое, но без сторонних библиотек и языков
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Ну, без библиотек никуда, хоть местные, хоть сторонние. И в частности без СОМ "DynamicWrapperX" тоже. Все эти библиотеки использовались самими создателями Автокада, так что то, что мы видим, делается с их использованием, только на более низком уровне.
А вот на счет языков - тут чужих нет (в отличии от работы с реакторами). ![]() |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Makswell, нда? А вот попробуй сделать то же самое, но учти, что (vlax-get-or-create-object "DynamicWrapperX") возвращает nil
![]() При этом обращение к WinAPI другими методами (типа через VBA / C++) выполняется нормально.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Честно говоря, мне сейчас лень разбираться с тем, что лично мне понадобится очень не скоро. 6-я студия на работе не установлена, поэтому только часть объявлений (которые, кстати, тянутся еще с 98-х Windows):
Код:
Почему-то кажется, что функции "CreateToolhelp32Snapshot", "Process32First" и "Process32Next" пришли вместе с .NET (в MSDN для 2002-й студии они уже упоминаются по крайней мере)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Я честно, VBA не знаю и поэтому глупый вопрос: В VBA со структурами можно работать напрямую? Или при передачи имени переменной, в которой записана строка, функции, в качестве аргумента, копия ей передается, или сама строка? (я на эти грабли наступил на Сером форуме). И вообще, ты что, против Автолиспа имеешь? Такое расширение функционала народу подарили!, а ты недоволен.
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Со структурами? Вообще-то можно, насколько мне известно. Передача данных может быть как по ссылке, так и по значению.
Цитата:
![]() Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
Я уже как-то тебе говорил, что то, что ты уже имеешь у тебя никто не отберет. И подарить тебе, то, что ты имеешь, никто не запрещает. А думать, что завтра прийдут большевики и поставять всх к стенке не нужно. Прийдут, поставят, расстреляют, ну и пусть, а думать об этом все равно не нужно. Скорее всего завтра будет так: У меня есть, а у тебя нет. ![]() |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Наивно радоваться, что кто-то "подарил рыбу". Надо учится "ловить рыбу", потому что подаренная рыба завтра протухнет. Или выяснится, что она с глистами.
Надо просто научиться делать такие "обертки" самому, на это уйдет гораздо меньше времени, а пользы будет неимоверно больше. Создавать такие "wrapper-ы" можно в любой современной среде программирования. "Подумаешь, бином Ньютона "(С) Незачем лезть и специально именно в низкоуровневый WinAPI. Да и не нужны все эти несколько тысяч функций. Функции из этих DLL часто могут оказаться непригодными для использования в скриптовых языках, к которым относится LISP. Использование "голого API" часто является своеобразным фанатизмом. Чтоб как следует помучиться. В любой хорошей среде программирования имеется множество библиотек, которые сами используют WinAPI, но оборачивают в более удобный вид, скрывая детали реализации. Очень полезно бывает посмотреть, что там дополнительно делается. Часто в них реализован еще и визуальный интерфейс. Естественно, для серьезного использования надо иметь все библиотеки в исходных текстах. |
|||
![]() |
|
||||
Смутно догадываюсь, что меня сильно ругать не будут.
Я согласен, что уметь делать и то и се, нужно. И голый AutoLISP тоже является своеобразным фанатизмом. И интерфейсы тоже нужны и еще много чего. И компилировать в fas тоже нужно очень часто, так что все, что прибыло не есть плохо. Про исходные тексты вообще молчу. Нужно. |
||||
![]() |
|
||||
Новый прикол!
Лисп, показывающий список окон. Здесь реализована передача аргументов функции Windows API EnumWindows, функции AutoLISP. Есть такие функции в Windows API, аргументами которых являются указатели на другие функции, которым они передают результаты свой работы. Я транслировал через VBScript эти аргументы функции AutoLISP-a Код:
Последний раз редактировалось Supermax, 04.12.2008 в 13:31. |
||||
![]() |
|
||||
Некоторые данные по текущему состоянию DynamicWrapperX.
В этой версии, ссылка на которую в первом посте, есть следующие недостатки. Не выгружаются библиотеки. Тобишь все запрошенные ресурсы. Это сейчас в процессе реализации и скоро (надеюсь) будет готово. Выгружаться будут и выборочно, через специальный метод и все скопом, при уничтожении СОМ объекта DynamicWrapperX. Транслированные функции дают возврат не в конце выполнения функции, а в начале. Поясню. Вот вы подаете команду - запустить функцию. Можно получить эхо - да, запущена, а можно - да, функция выполнена. Вот тут происходит именно первый вариант. В частности с функцией EnumWindows. Эта функция опрашивает все открытые окна, а это процесс не быстрый и получается, что строчка (см. пост #37) Код:
С одной стороны это хорошо, поскольку лисп быстро закончился и командная строка освободилась, что дает возможность туда посылать запуск функций "Proba" и я не представляю, как бы работал лисп, если бы Код:
А с другой стороны, как определить, что функция EnumWindows закончила листать окна? Код-то надо дальше толкать. Проблема, однако. Вставить признак в метод, чтобы пользователь сам назначал условия возврата данных можно, и даже нужно, но проблему это не решает. ![]() |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Вот скажи, а зачем тебе иметь в лиспе (!) список окон (!)? Специально повторяю - окон! А не приложений.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Да не нужем мне список окон, мне конкретное окно нужно,в редакторе Автолиспа. Не рамочное (дайте повыпендриваться), а дочернее, где лисп редактируется. Хочу туда из DLL тексты функций вставлять.
Вот сижу и перебираю все Windows API в поисках нужных функций. Стал через EnumWindows указатели смотреть, заодно глюки в лиспе из #37 решил подправить и призадумался на часок, который до сих пор продолжается. И какая разница из какого языка этими WinAPI пользоваться? Они же трансязыковые. Все равно, чтобы найти нужное окно, активировать его (если оно не активно) и т.д. и т.п. голыми пальцами это не сделать. Это проще всего, "сидеть на заборе" и кричать человеку, который что-то пытается сделать, но не получается - "Да брось ты!"; "Да оно тебе надо?"; "Вот нашел себе гиморрой!" и т.п. вместо того, чтобы взять и просто помочь. |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
|
|||
![]() |
|
||||
А где доказательства? Где ваши ворота? Где повествования, как и что надо сделать, чтобы добиться того-то и того-то?
Да, предположим я слеп. Вместо того, чтобы сказать мне "правее на столько-то" или левее вы констатируете все время факт - "ага!, опять не попал". Интересный однако факт. Вы ShaggyDoc, разделяете то убеждение, что VBA в Автокаде - "бородавка" на его теле. Я читал ваши посты на эту тему. Но в VBA есть доступ к использованию функций Windows API. А когда кто-то (не я придумал DynamicWrapperX, да и YMP, на сколько мне известно только свой вариант сделал, уже ранее придуманного) пытается уравнять возможности языка, вы это квалифицируете, как слепоту и ударение лбом в забор. Я давно хотел вас спросить, а не могли бы вы сами написать такой СОМ объект и его подарить всем желающим? Ведь вам, как мне это известно, такое по зубам. Может вы подскажете, как к дочернему окну через WinAPI добраться? Не через WinAPI, так через что? Этот же вопрос интересует не только меня, и не только для Автокада. Такие посты, как #39, #40, #42 и т.п. писать легко. Я тоже могу и очень хорошо умею "наводить тень на плетень". Последний раз редактировалось Supermax, 13.12.2008 в 18:47. |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Для того, чтобы открыть такие "секреты" ("повествования, как и что надо сделать") я специально написал книгу "САПР на базе AutoCAD - как это делается". Там достаточно примеров. В том числе вызов WinAPI и через ObjectARX, и через COM.
Доказывать что существуют "ворота" и излагать основы программирования в индивидуальном порядке, такому чрезвычайно самоуверенному "руководителю фирмы" у меня нет никакого желания. Садись за азбуку самостоятельно. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Supermax, а вот я (хотя и пьян прилично) выскажусь. Список окон в реальной жизни нужен как зайцу стоп-сигнал. Окно редактора может быть элементарно не запущено - ты об этом не думал?
Если тебе так уж невтерпеж работать с WinAPI - делай собственную dll, требуй ее регистрации в системе и работай дальше как с обычным СОМ-объектом. Примеров такой работы через VisualLISP - как у дурака фантиков - достаточно задать поиск по слову "get-or-create-object" (префикс не помню, а AutoCAD запускать лениво).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
ShaggyDoc,
Цитата:
Цитата:
Кулик Алексей aka kpblc, список окон мне (хоть я и трезв всегда) "ни за деньги не надь, ни даром не надь". Окно редактора не может быть не запущено, поскольку я уже в нем и из него пытаюсь определить его указатель. Про dll - ты предлагаешь мне написать свой СОМ для вызова функций Windows API? А то, что это уже сделал YMP с Серого форума не подойдет? Вернусь к проблеме, которая меня сейчас волнует. Не желающих мне помочь (хотя бы советом), просьба не беспокоить. Как известно, я не сторонник чистого лиспа. Очень часто применяю смешенный вариант написания программ, в частности VBScript+AutoLISP. Только такой сцепкой мне удалось реализовать работу с HTМL файлами и с созданием реактора объекта, который сам себя редактирует. Сейчас вот Windows API зацепил, и вообще, все функции из DLL-файлов. То, что у меня нет пока инструмента для создания структур, массивов, классов, объединений и пр. низкоуровневой лабуды, для полноценной работы с функциями из DLL - не беда. Скоро будет. Но есть одна проблема не языкового уровня. Как пример, я взял функцию EnumWindows. Только как пример! Пост #38. Мне надо в середине процесса выполнения лисп-программы выходить из нее, освобождая доступ к командной строке и возвращаться обратно, в то место,из которого я программу покинул. YMP, если ты читаешь эту тему. Все, абсолютно все экспортированные функции из DLL должны иметь один необязательный аргумент - указатель на функцию. В случае с такими функциями, как EnumWindows, получится два указателя на функцию. Один для EnumWindows, а второй - если он есть, то по окончании выполнения функции, экспортированной из DLL, выполняется эта функция. Только так я могу узнать, что работа низкоуровневой функции закончилась и можно продолжать выполнение высокоуровневой задачи. Понимаешь, мне, получается, надо останавливать работу автолиспа и ждать окончания работы низкоуровневой функции. А она,зараза, долго может работать. По многу раз она свои лисп-выражения запускает и только когда все окна перелопатит - дает знать, что работа окончена, вот тут и надо запустить вторую функцию, которая даст мне возможность продолжить прерванный процесс. Ей, никакие аргументы передавать не надо. Просто запускать, по окончании работы низкоуровневой функции (той, которая экспортирована). По поводу признака продолжения работы (см. пост #38) - тоже надо. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Supermax, ты зря обижаешься - я днюху праздновал. Свою днюху.
Теперь Цитата:
Цитата:
Ладно, это лирика была. Теперь по делу. Я сильно подозреваю (подозреваю, т.к. ни один из примеров не запускал; в коде "обертки" не копался и не собираюсь - даже если он открыт), что "остановить" выполнение API-шной функции "где-то посередке" невозможно. Ну или самостоятельно полностью перерабатывать API. Засим откланиваюсь - все равно нить рассуждений для меня в состоянии "и не находил".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
А я и не обижаюсь, с чего это ты взял?
Да кто бы ни написал "обертку" и открыл код, копаться в чужом - полный мрак. Правда если с пояснениями, да еще в теме, с обсуждениями и спорами - другой базар. Даже интересно и познавательно. Я не Windows API намерен останавливать, а процесс лиспа. Читай внимательнее. Да что мы все время цепляемся к Windows API? "Обертка" дает возможность пользоваться экспортируемыми функциями DLL. Любых DLL, даже тех, которые ты написал сам. А что можно написать, зная, что это будет использовано в Автолиспе? Думаю очень много всего. Делать "обертку" на каждую, нужную функцию, да еще в СОМ ее интегрировать не так, как это в DynamicWrapperX реализовано, а скажем намертво вбивая обращение к ней специальным методом - фигня. Но меня по прежнему волнует глобальный вопрос - это хорошо или плохо, когда высокоуровневый язык получает доступ к низкоуровневым операциям, с помощью низкоуровневых функций и СОМ объектов? Вся эта тема создана только для того, чтобы выяснить отношение публики к вышеупомянутому вопросу. |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проверка нажатия CTRL в LISP в фоновом режиме(не grread) | BH | LISP | 10 | 22.08.2006 22:23 |
Программеры, где моя ошибочка? | {Smirnoff} | Программирование | 11 | 01.03.2004 11:08 |