Вызов функций Windows API из AutoLISP
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вызов функций Windows API из AutoLISP

Вызов функций Windows API из AutoLISP

Ответ
Поиск в этой теме
Непрочитано 28.11.2008, 21:39 #1
Вызов функций Windows API из AutoLISP
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Оказывается, что функции Windows API, экспортируемые библиотеками DLL можно вызывать и из AutoLISP-a.

Для начала надо установить СОМ объект DynamicWrapperX

http://forum.script-coding.info/viewtopic.php?id=2214

Все хелпы там.


Список API-функций DLL можно посмотреть так:

http://forum.script-coding.info/viewtopic.php?id=2457

Надо? Могу на AutoLISP перегнать.
Просмотров: 9771
 
Непрочитано 28.11.2008, 23:08
#2
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Хм, на свой страх и риск! А Вы рисковый Supermax, в полном соответствии с ником
Baldares вне форума  
 
Автор темы   Непрочитано 29.11.2008, 14:13
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ну, первый раз всегда стремно, но когда знаешь, что проверено и мин нет - все становится не так страшно. Наличие исходников, тоже стрем снимает.
Supermax вне форума  
 
Непрочитано 30.11.2008, 16:12
#4
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Вот бы еще примерчик, как этим всем воспользоваться из AutoLISP. Скажем, вызвать все ту же банальную MessageBoxW.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 30.11.2008, 16:50
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ща, попробую. Только в ванну поплавать схожу и займусь.
Supermax вне форума  
 
Автор темы   Непрочитано 30.11.2008, 17:04
#6
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Код:
[Выделить все]
(setq svr (vlax-get-or-create-object "DynamicWrapperX"))
(vlax-invoke-method svr "Register" "user32.dll" "MessageBoxW" "i=hwwu" "r=l")
(vlax-invoke-method svr "MessageBoxW" 0 "Hello, world!" "Test" 4)
Получите и распишитесь!

Так до ванной и не дошел.
Supermax вне форума  
 
Автор темы   Непрочитано 30.11.2008, 20:56
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Очень рекомендую к использованию.
http://www.script-coding.info/LangMF.html
Весьма полезная для Автокада вещ!
Supermax вне форума  
 
Автор темы   Непрочитано 01.12.2008, 10:37
#8
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Кто знает полезные функции из DLL - кидайте сюда, пощупать охота.
Supermax вне форума  
 
Непрочитано 01.12.2008, 15:35
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Все?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2008, 17:00
#10
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А что, все сюда загрузить можешь? Да выбери, что поинтересней.
Supermax вне форума  
 
Непрочитано 01.12.2008, 18:06
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


В архиве - шедший в составе MS VS 6.0 API Text Viewer с файлами данных
Вложения
Тип файла: rar Winapi.rar (158.6 Кб, 113 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2008, 18:28
#12
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А поконкретнее, плииз! Какую функцию и из какой dll достать? Очень хочется разных интерфейсов наковырять, функций по работе с процессами или памятью. и т. п.
Supermax вне форума  
 
Непрочитано 01.12.2008, 18:48
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Для VB вытащить объявления можно. Например:
Код:
[Выделить все]
Public Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Public Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetVersion Lib "kernel32" Alias "GetVersion" () As Long

Public Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
Ну и т.д. Работать с WinAPI таким образом мне практически не доводилось.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2008, 19:33
#14
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Одну скажи. И передаваемые ей данные какие надо? Где польза? Что бестолку справочными данными обмениваться? Любой оконный интерфейс или что еще. Только не кидайся кучами!
Supermax вне форума  
 
Автор темы   Непрочитано 01.12.2008, 19:44
#15
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


GetVersion - Считывает номеp текущей веpсии Windows

Код:
[Выделить все]
(setq svr (vlax-get-or-create-object "DynamicWrapperX"))
(vlax-invoke-method svr "Register" "kernel32.dll" "GetVersion" "r=l")
(vlax-invoke-method svr "GetVersion")
Полезно если скомпилировать файл в котором работа только для указанного номера версии Windows и номер процессора еще узнать - и все.
Supermax вне форума  
 
Автор темы   Непрочитано 01.12.2008, 19:48
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


WinAPI по-русски - БОЛЬШОЙ справочник

http://develab.narod.ru/api/16.htm
Supermax вне форума  
 
Непрочитано 01.12.2008, 20:05
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Ага, только "справочник" написан для применения в Delphi
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.12.2008, 20:10
#18
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Супер!

GetMessagePos - Считывает положение куpсоpа для последнего сообщения, полученного из GetMessage. Тобишь, в момент запуска функции GetMessagePos, получаем цифры 32047168 определяющие положение курсора

Код:
[Выделить все]
(setq svr (vlax-get-or-create-object "DynamicWrapperX"))
(vlax-invoke-method svr "Register" "user32.dll" "GetMessagePos" "r=l")
(vlax-invoke-method svr "GetMessagePos" )
Supermax вне форума  
 
Автор темы   Непрочитано 01.12.2008, 20:13
#19
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


GetMessageTime - Считывает вpемя, пpошедшее с момента пеpезагpузки системы, для последнего сообщения, полученного из GetMessage.


Код:
[Выделить все]
(vlax-invoke-method svr "Register" "user32.dll" "GetMessageTime" "r=l")
(vlax-invoke-method svr "GetMessageTime" )
Supermax вне форума  
 
Автор темы   Непрочитано 01.12.2008, 20:26
#20
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Функция 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


Код:
[Выделить все]
(setq svr (vlax-get-or-create-object "DynamicWrapperX"))
(vlax-invoke-method svr "Register" "kernel32.dll" "GetDriveType" "i=l" "r=l")
(vlax-invoke-method svr "GetDriveType" 0); проверяет диск А
Supermax вне форума  
 
Автор темы   Непрочитано 01.12.2008, 20:29
#21
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Функция GetFocus

Описание:
function GetFocus: HWnd;
Считывает окно, котоpое в данный момент имеет фокус ввода.
Возвpащаемое значение:
В случае успешного завеpшения - идентификатоp окна; 0 - в пpотивном случае.
функция находится в файле user32.dll

Код:
[Выделить все]
(vlax-invoke-method svr "Register" "user32.dll" "GetFocus" "r=l")
(vlax-invoke-method svr "GetFocus" )
Supermax вне форума  
 
Непрочитано 02.12.2008, 08:25
#22
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Кстати, как выяснилось, метод GetMessageTime возвращает значение, которое соответствует значению недокументированной системной переменной MILLISECS. Помнится её в своё время так и не смогли расшифровать.
Код:
[Выделить все]
(defun test (/ svr)
  (setq svr (vlax-get-or-create-object "DynamicWrapperX"))
  (vlax-invoke-method svr "Register" "user32.dll" "GetMessageTime" "r=l")
  (princ (vlax-invoke-method svr "GetMessageTime"))
  (terpri)
  (princ (getvar "MILLISECS"))
  (if (and svr (not (vlax-object-released-p svr)))
    (vlax-release-object svr)
  )
  (princ)
)
Выдаёт:
Цитата:
_$ (test)
1311859
1311859
Makswell вне форума  
 
Автор темы   Непрочитано 02.12.2008, 11:07
#23
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


ВО! Первая польза есть. Разгадали MILLISECS!
Supermax вне форума  
 
Автор темы   Непрочитано 02.12.2008, 11:25
#24
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


(vlax-get-or-create-object "DynamicWrapperX") запускать надо один раз для всех трансляций функций.
Трансляцию функции типа вот этого -
(vlax-invoke-method svr "Register" "user32.dll" "GetMessageTime" "r=l")
надо делать один раз для всех последующих вызовов функций.
Вызывать функции можно уже любое количество раз, типа - (vlax-invoke-method svr "GetMessageTime").
Сколько в "DynamicWrapperX" влезает этих трансляций - пока не знаю, надо на Сером форуме спросить. Но я впихивал уже больше 20.
Supermax вне форума  
 
Автор темы   Непрочитано 03.12.2008, 09:28
#25
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Торжественный момент!
Лисп, определяющий параметры всех процессов в компьютере.
PID Потоки Имя файла
Это классический пример, который практически реализован на всех языках, а теперь и на AutoLISP.
Данные выводятся прямо в блокнот, минуя создание файла!
Благодаря помощи YMP и моральной поддержке alexii с Серого форума
http://forum.script-coding.info/view...hp?id=2523&p=2

Код:
[Выделить все]
(setq DX (vlax-get-or-create-object "DynamicWrapperX"))
(setq WSShell (vlax-get-or-create-object "WScript.Shell"))
(setq 
TH32CS_SNAPPROCESS 2
MAX_PATH 260
WM_SETTEXT 12
GPTR 64

;Смещения членов структуры PROCESSENTRY32:
dwSize 0                ; Размер данной структуры.
cntUsage 4              ; Больше не используется.
th32ProcessID 8         ; Идентификатор процесса (PID).
th32DefaultHeapID 12    ; Больше не используется.
th32ModuleID 16         ; Больше не используется.
cntThreads 20           ; Количество потоков в процессе.
th32ParentProcessID 24  ; PID родительского процесса.
pcPriClassBase 28       ; Базовый приоритет потоков процесса.
dwFlags 32              ; Больше не используется.
szExeFile 36    ; Здесь буфер для имени exe-файла процесса, длиной MAX_PATH.   
)




(vlax-invoke-method DX "Register" "kernel32.dll" "CreateToolhelp32Snapshot" "i=uu" "r=h")
(vlax-invoke-method DX "Register" "kernel32.dll" "Process32First" "i=hp" "r=l")
(vlax-invoke-method DX "Register" "kernel32.dll" "Process32Next" "i=hp" "r=l")
(vlax-invoke-method DX "Register" "kernel32.dll" "CloseHandle" "i=h" "r=l")
(vlax-invoke-method DX "Register" "user32" "FindWindowW" "i=ww" "r=h")
(vlax-invoke-method DX "Register" "user32" "FindWindowExW" "i=hhwl" "r=h")
(vlax-invoke-method DX "Register" "user32" "SendMessageW" "i=huuw" "r=l")
(vlax-invoke-method DX "Register" "kernel32.dll" "GlobalAlloc" "i=uu" "r=p")
(vlax-invoke-method DX "Register" "kernel32.dll" "GlobalFree" "i=p" "r=p")

(setq Size (+ (* 4 94) MAX_PATH)) ;Размер структуры в байтах.

; Запрос памяти под структуру, получаем указатель на неё.
(setq pStruct (vlax-invoke-method DX "GlobalAlloc" GPTR Size))

;Пишем размер структуры в её начало.
(vlax-invoke-method DX "NumPut" Size pStruct dwSize "u")


;Получаем снимок всех процессов
(setq hSnap (vlax-invoke-method DX "CreateToolhelp32Snapshot" 2 0))
; Получаем первый процесс.
(vlax-invoke-method DX "Process32First" hSnap pStruct)
;Адрес строки с именем exe-файла процесса.
(setq pExeName (+ pStruct szExeFile))

;Создаем заголовок
(setq List-1 '("PID     Потоки  Имя файла"))

;Создаем список данных первого процесса и заголовка

(setq 1-PID (itoa (vlax-invoke-method DX "NumGet" pStruct th32ProcessID "u")))
(while (< (strlen 1-PID) 8) (setq 1-PID (strcat 1-PID " ")))
(setq 2-Pot (itoa (vlax-invoke-method DX "NumGet" pStruct cntThreads "u")))
(while (< (strlen 2-Pot) 8) (setq 2-Pot (strcat 2-Pot " ")))
(setq 3-fil (vlax-invoke-method DX "StrGet" pExeName "s"))
(setq 4-ful (strcat 1-PID 2-Pot 3-fil))

(setq List-1 (append List-1 (list 4-ful)))



;Устанавливаем счетчик процессов в 1
(setq n 1)

;Прибавляем к списку данных первого процесса и заголовка, данные следующих процессов
(while (= 1 (vlax-invoke-method DX "Process32Next" hSnap pStruct))
(setq 1-PID (itoa (vlax-invoke-method DX "NumGet" pStruct th32ProcessID "u")))
(while (< (strlen 1-PID) 8) (setq 1-PID (strcat 1-PID " ")))
(setq 2-Pot (itoa (vlax-invoke-method DX "NumGet" pStruct cntThreads "u")))
(while (< (strlen 2-Pot) 8) (setq 2-Pot (strcat 2-Pot " ")))
(setq 3-fil (vlax-invoke-method DX "StrGet" pExeName "s"))
(setq 4-ful (strcat 1-PID 2-Pot 3-fil))

(setq List-1 (append List-1 (list 4-ful)))

(setq n (1+ n))
)

;Добавляем в конец каждой строки перенос на другую строку
(setq List-1 (mapcar '(lambda (x) (strcat x "\r\n")) List-1))
;Добавляем к списку, в начало списка количество процессов
(setq list-1 (append (list (strcat "Всего процессов: " (itoa n) "\r\n\r\n" )) List-1))


(vlax-invoke-method DX "CloseHandle" hSnap);Освобождение хэндла.
(vlax-invoke-method DX "GlobalFree" pStruct);Освобождение памяти.

;============= Вывод данных в окно Блокнота ==============

(vlax-invoke-method WSShell "Run" "Notepad.exe")

(while (= 0 (progn 
              (setq hNotepad (vlax-invoke-method DX "FindWindowW" "Notepad" "Безымянный - Блокнот"))
              (setq hEdit (vlax-invoke-method DX "FindWindowExW" hNotepad 0 "Edit" 0))
)))
(vlax-invoke-method DX "SendMessageW" hEdit WM_SETTEXT 0 (apply 'strcat List-1))

Последний раз редактировалось Supermax, 03.12.2008 в 11:32.
Supermax вне форума  
 
Непрочитано 03.12.2008, 10:40
#26
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Побуду "тупицей": а теперь то же самое, но без сторонних библиотек и языков
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.12.2008, 11:15
#27
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Язык-то здесь один: AutoLISP
Makswell вне форума  
 
Автор темы   Непрочитано 03.12.2008, 11:19
#28
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ну, без библиотек никуда, хоть местные, хоть сторонние. И в частности без СОМ "DynamicWrapperX" тоже. Все эти библиотеки использовались самими создателями Автокада, так что то, что мы видим, делается с их использованием, только на более низком уровне.
А вот на счет языков - тут чужих нет (в отличии от работы с реакторами).
Supermax вне форума  
 
Непрочитано 03.12.2008, 11:19
#29
Кулик Алексей aka kpblc
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-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.12.2008, 11:29
#30
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Ну нету у клиента на машине этого класса! Нету!
Нету? А мозги у него тоже "нету"?
Даже на VBScript без этого СОМ увы никак. Попробуй на VBA это сделать, а то на VBA такого примера тоже "нету".
Supermax вне форума  
 
Непрочитано 03.12.2008, 11:39
#31
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Честно говоря, мне сейчас лень разбираться с тем, что лично мне понадобится очень не скоро. 6-я студия на работе не установлена, поэтому только часть объявлений (которые, кстати, тянутся еще с 98-х Windows):
Код:
[Выделить все]
Public Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GlobalAlloc Lib "kernel32" Alias "GlobalAlloc" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Public Declare Function GlobalFree Lib "kernel32" Alias "GlobalFree" (ByVal hMem As Long) As Long
Это VB чистой воды. Если надо, в MSDN можно найти информацию и по объявлению остальных функций. Без привлечения чего бы то ни было.
Почему-то кажется, что функции "CreateToolhelp32Snapshot", "Process32First" и "Process32Next" пришли вместе с .NET (в MSDN для 2002-й студии они уже упоминаются по крайней мере)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.12.2008, 11:51
#32
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я честно, VBA не знаю и поэтому глупый вопрос: В VBA со структурами можно работать напрямую? Или при передачи имени переменной, в которой записана строка, функции, в качестве аргумента, копия ей передается, или сама строка? (я на эти грабли наступил на Сером форуме). И вообще, ты что, против Автолиспа имеешь? Такое расширение функционала народу подарили!, а ты недоволен.
Supermax вне форума  
 
Непрочитано 03.12.2008, 12:13
#33
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Со структурами? Вообще-то можно, насколько мне известно. Передача данных может быть как по ссылке, так и по значению.
Цитата:
И вообще, ты что, против Автолиспа имеешь?
Типа "А за лисп ты сейчас ответишь!"
Цитата:
Такое расширение функционала народу подарили!, а ты недоволен.
Да, недоволен. Потому что расширение это - искуственное, привнесенное "снаружи" и требующее установки дополнительных утилит. Это сегодня язык бесплатный и его можно свободно скачивать и устанавливать. А что будет завтра - не знает никто.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.12.2008, 12:55
#34
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Да, недоволен. Потому что расширение это - искуственное, привнесенное "снаружи" и требующее установки дополнительных утилит. Это сегодня язык бесплатный и его можно свободно скачивать и устанавливать. А что будет завтра - не знает никто.
А завтра AutoDesk продадут за долги, к примеру. Так зачем связываться с AutoCAD?

Я уже как-то тебе говорил, что то, что ты уже имеешь у тебя никто не отберет. И подарить тебе, то, что ты имеешь, никто не запрещает. А думать, что завтра прийдут большевики и поставять всх к стенке не нужно. Прийдут, поставят, расстреляют, ну и пусть, а думать об этом все равно не нужно.
Скорее всего завтра будет так: У меня есть, а у тебя нет.
Supermax вне форума  
 
Непрочитано 03.12.2008, 13:32
#35
ShaggyDoc

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, но оборачивают в более удобный вид, скрывая детали реализации. Очень полезно бывает посмотреть, что там дополнительно делается.

Часто в них реализован еще и визуальный интерфейс.

Естественно, для серьезного использования надо иметь все библиотеки в исходных текстах.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 03.12.2008, 14:27
#36
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Смутно догадываюсь, что меня сильно ругать не будут.
Я согласен, что уметь делать и то и се, нужно. И голый AutoLISP тоже является своеобразным фанатизмом. И интерфейсы тоже нужны и еще много чего. И компилировать в fas тоже нужно очень часто, так что все, что прибыло не есть плохо.
Про исходные тексты вообще молчу. Нужно.
Supermax вне форума  
 
Автор темы   Непрочитано 03.12.2008, 22:33
#37
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Новый прикол!
Лисп, показывающий список окон.

Здесь реализована передача аргументов функции Windows API EnumWindows, функции AutoLISP.

Есть такие функции в Windows API, аргументами которых являются указатели на другие функции, которым они передают результаты свой работы. Я транслировал через VBScript эти аргументы функции AutoLISP-a

Код:
[Выделить все]
(setq DX (vlax-get-or-create-object "DynamicWrapperX"))
(setq WSShell (vlax-get-or-create-object "WScript.Shell"))

(setq ScriptControl (vlax-get-or-create-object "MSScriptControl.ScriptControl"))
(vlax-put-property ScriptControl "Language" "VBScript")

;Создаем функцию-транслятор (VBScript) CbkEnumWin получающую аргументы и передающую их функции AutoLISP-a "Proba".
; Функция всегда должна возвращать 1, иначе опрос окон остановится.
(vlax-invoke-method ScriptControl "AddCode" "
  Set AutoCAD = GetObject(, \"AutoCAD.Application\")
  Set ActiveDocument = AutoCAD.ActiveDocument
  Function CbkEnumWin(hwnd, lparam)
    ActiveDocument.SendCommand \"(Proba \" & hwnd & \" \" & lparam & \") \"
  CbkEnumWin = 1
  End Function
")


;Создаем функцию "Proba", получающую аргументы от функции CbkEnumWin
(defun Proba (hwnd lparam /)
;Читаем заголовок и пишем его в буфер
(vlax-invoke-method DX "GetWindowTextw" hwnd pBuffer 256)
;Читаем заголовок из буфера
(setq Title (vlax-invoke-method DX "StrGet" pBuffer))
(if (> (strlen Title) 0) (progn (setq n (1+ n)) (setq spis-list (append spis-list (list Title)))))
(setq m (1+ m))
)

;Транслируем нужные нам функции Windows API
(vlax-invoke-method DX "Register" "user32" "FindWindowW" "i=ww" "r=h")
(vlax-invoke-method DX "Register" "user32" "FindWindowExW" "i=hhwl" "r=h")
(vlax-invoke-method DX "Register" "user32" "SendMessageW" "i=huuw" "r=l")
(vlax-invoke-method DX "Register" "kernel32.dll" "GlobalAlloc" "i=uu" "r=p")
(vlax-invoke-method DX "Register" "kernel32.dll" "GlobalFree" "i=p" "r=p")
(vlax-invoke-method DX "Register" "user32" "EnumWindows" "i=pl")
(vlax-invoke-method DX "Register" "user32" "GetWindowTextW" "i=hpl")


; Запрос памяти под буфер, получаем указатель на неё.
(setq pBuffer (vlax-invoke-method DX "GlobalAlloc" 64 512))

;Передаем указатель функции CbkEnumWin методу RegisterCallback
;Этот метод нужен для получения указателя на скриптовую функцию, пригодного для передачи какой-либо функции API. 
(setq pCbkFunc (vlax-invoke-method DX "RegisterCallback"
 (vlax-invoke-method ScriptControl "Eval" "GetRef(\"CbkEnumWin\")") "i=hl" "r=l"))

;Обнуляем счетчик именованых окон
(setq n 0)
;Обнуляем счетчик всех окон
(setq m 0)
;Очистка списка заголовков окон
(setq spis-list nil)
;И наконец-то запускаем получение заголовков окон
(vlax-invoke-method DX "EnumWindows" pCbkFunc 0)


(vlax-invoke-method DX "GlobalFree" pBuffer);Освобождение памяти.

;============= Вывод данных в окно Блокнота ==============

(vlax-invoke-method WSShell "Run" "Notepad.exe")

;Добавляем в конец каждой строки перенос на другую строку
(setq spis-list (mapcar '(lambda (x) (strcat x "\r\n")) spis-list))

;Добавляем шапку к списку заголовков
(setq spis-list (append (strcat "Всего окон: " (itoa m) "\r\s" "С заголовками: " (itoa n) "\r\s\r\n") spis-list))

(while (= 0 (progn 
              (setq hNotepad (vlax-invoke-method DX "FindWindowW" "Notepad" "Безымянный - Блокнот"))
              (setq hEdit (vlax-invoke-method DX "FindWindowExW" hNotepad 0 "Edit" 0))
)))
(vlax-invoke-method DX "SendMessageW" hEdit 12 0 (apply 'strcat spis-list))

Последний раз редактировалось Supermax, 04.12.2008 в 13:31.
Supermax вне форума  
 
Автор темы   Непрочитано 12.12.2008, 22:56
#38
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Некоторые данные по текущему состоянию DynamicWrapperX.
В этой версии, ссылка на которую в первом посте, есть следующие недостатки.

Не выгружаются библиотеки. Тобишь все запрошенные ресурсы. Это сейчас в процессе реализации и скоро (надеюсь) будет готово. Выгружаться будут и выборочно, через специальный метод и все скопом, при уничтожении СОМ объекта DynamicWrapperX.

Транслированные функции дают возврат не в конце выполнения функции, а в начале. Поясню. Вот вы подаете команду - запустить функцию. Можно получить эхо - да, запущена, а можно - да, функция выполнена. Вот тут происходит именно первый вариант. В частности с функцией EnumWindows.
Эта функция опрашивает все открытые окна, а это процесс не быстрый и получается, что строчка (см. пост #37)
Код:
[Выделить все]
(vlax-invoke-method DX "EnumWindows" pCbkFunc 0)
дает добро на продвижение по коду лиспа раньше, чем функция закончит свою работу.
С одной стороны это хорошо, поскольку лисп быстро закончился и командная строка освободилась, что дает возможность туда посылать запуск функций "Proba" и я не представляю, как бы работал лисп, если бы
Код:
[Выделить все]
(vlax-invoke-method DX "EnumWindows" pCbkFunc 0)
держала ком. строку запертой до окончания своего действия, которое бы не могло быть выполненным, из за того, что строка заперта.
А с другой стороны, как определить, что функция EnumWindows закончила листать окна? Код-то надо дальше толкать.
Проблема, однако.
Вставить признак в метод, чтобы пользователь сам назначал условия возврата данных можно, и даже нужно, но проблему это не решает.

Supermax вне форума  
 
Непрочитано 12.12.2008, 23:51
#39
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Вот скажи, а зачем тебе иметь в лиспе (!) список окон (!)? Специально повторяю - окон! А не приложений.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.12.2008, 00:17
#40
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


А зачем в лиспе вообще winapi? так скоро будем асм вперемешку с лиспом юзать))
Supermax, чешуться руки - осваивай arx
zamtmn вне форума  
 
Автор темы   Непрочитано 13.12.2008, 10:47
#41
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Да не нужем мне список окон, мне конкретное окно нужно,в редакторе Автолиспа. Не рамочное (дайте повыпендриваться), а дочернее, где лисп редактируется. Хочу туда из DLL тексты функций вставлять.
Вот сижу и перебираю все Windows API в поисках нужных функций. Стал через EnumWindows указатели смотреть, заодно глюки в лиспе из #37 решил подправить и призадумался на часок, который до сих пор продолжается.
И какая разница из какого языка этими WinAPI пользоваться? Они же трансязыковые. Все равно, чтобы найти нужное окно, активировать его (если оно не активно) и т.д. и т.п. голыми пальцами это не сделать.
Это проще всего, "сидеть на заборе" и кричать человеку, который что-то пытается сделать, но не получается - "Да брось ты!"; "Да оно тебе надо?"; "Вот нашел себе гиморрой!" и т.п. вместо того, чтобы взять и просто помочь.
Supermax вне форума  
 
Непрочитано 13.12.2008, 11:20
#42
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Это проще всего, "сидеть на заборе" и кричать человеку, который что-то пытается сделать, но не получается - "Да брось ты!"; "Да оно тебе надо?"; "Вот нашел себе гиморрой!" и т.п. вместо того, чтобы взять и просто помочь.
Сидят на заборе и видят, как человек бьется об него головой, пытаясь пройти. Хотя рядом распахнутые настежь ворота, через которые все спокойно и идут. Естественно, советуют - "Да брось ты! Заходи в ворота!" Но человек предпочитает действовать по принципу мухи, бьющейся башкой об стекло. Ей кажется, что вот он, выход.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 13.12.2008, 14:33
#43
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А где доказательства? Где ваши ворота? Где повествования, как и что надо сделать, чтобы добиться того-то и того-то?
Да, предположим я слеп. Вместо того, чтобы сказать мне "правее на столько-то" или левее вы констатируете все время факт - "ага!, опять не попал".
Интересный однако факт. Вы ShaggyDoc, разделяете то убеждение, что VBA в Автокаде - "бородавка" на его теле. Я читал ваши посты на эту тему. Но в VBA есть доступ к использованию функций Windows API. А когда кто-то (не я придумал DynamicWrapperX, да и YMP, на сколько мне известно только свой вариант сделал, уже ранее придуманного) пытается уравнять возможности языка, вы это квалифицируете, как слепоту и ударение лбом в забор.

Я давно хотел вас спросить, а не могли бы вы сами написать такой СОМ объект и его подарить всем желающим? Ведь вам, как мне это известно, такое по зубам.

Может вы подскажете, как к дочернему окну через WinAPI добраться?
Не через WinAPI, так через что? Этот же вопрос интересует не только меня, и не только для Автокада.

Такие посты, как #39, #40, #42 и т.п. писать легко. Я тоже могу и очень хорошо умею "наводить тень на плетень".

Последний раз редактировалось Supermax, 13.12.2008 в 18:47.
Supermax вне форума  
 
Непрочитано 13.12.2008, 18:54
#44
ShaggyDoc

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.

Доказывать что существуют "ворота" и излагать основы программирования в индивидуальном порядке, такому чрезвычайно самоуверенному "руководителю фирмы" у меня нет никакого желания. Садись за азбуку самостоятельно.
ShaggyDoc вне форума  
 
Непрочитано 13.12.2008, 21:12
#45
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Supermax, а вот я (хотя и пьян прилично) выскажусь. Список окон в реальной жизни нужен как зайцу стоп-сигнал. Окно редактора может быть элементарно не запущено - ты об этом не думал?
Если тебе так уж невтерпеж работать с WinAPI - делай собственную dll, требуй ее регистрации в системе и работай дальше как с обычным СОМ-объектом. Примеров такой работы через VisualLISP - как у дурака фантиков - достаточно задать поиск по слову "get-or-create-object" (префикс не помню, а AutoCAD запускать лениво).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.12.2008, 12:33
#46
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


ShaggyDoc,
Цитата:
Для того, чтобы открыть такие "секреты" ("повествования, как и что надо сделать") я специально написал книгу "САПР на базе AutoCAD - как это делается". Там достаточно примеров. В том числе вызов WinAPI и через ObjectARX, и через COM.
Через ObjectARX это не через AutoLISP, а через СОМ - какая страница?

Цитата:
Доказывать что существуют "ворота" и излагать основы программирования в индивидуальном порядке, такому чрезвычайно самоуверенному "руководителю фирмы" у меня нет никакого желания. Садись за азбуку самостоятельно.
Ну, для себя лично, я ликбез и тем более по основам не просил. Уверенность в себе мне всегда нужна, но только для продвижения к конкретной цели. Я специально написал в информации о себе, что я руководитель фирмы, чтобы не приставали ко мне с частными заказами. Windows API - не азбука. С и С++ штудирую с утра до вечера и пока книжек мне достаточно.

Кулик Алексей aka kpblc, список окон мне (хоть я и трезв всегда) "ни за деньги не надь, ни даром не надь". Окно редактора не может быть не запущено, поскольку я уже в нем и из него пытаюсь определить его указатель.
Про dll - ты предлагаешь мне написать свой СОМ для вызова функций Windows API? А то, что это уже сделал YMP с Серого форума не подойдет?

Вернусь к проблеме, которая меня сейчас волнует. Не желающих мне помочь (хотя бы советом), просьба не беспокоить.

Как известно, я не сторонник чистого лиспа. Очень часто применяю смешенный вариант написания программ, в частности VBScript+AutoLISP.
Только такой сцепкой мне удалось реализовать работу с HTМL файлами и с созданием реактора объекта, который сам себя редактирует.
Сейчас вот Windows API зацепил, и вообще, все функции из DLL-файлов. То, что у меня нет пока инструмента для создания структур, массивов, классов, объединений и пр. низкоуровневой лабуды, для полноценной работы с функциями из DLL - не беда. Скоро будет. Но есть одна проблема не языкового уровня.
Как пример, я взял функцию EnumWindows. Только как пример! Пост #38.

Мне надо в середине процесса выполнения лисп-программы выходить из нее, освобождая доступ к командной строке и возвращаться обратно, в то место,из которого я программу покинул.

YMP, если ты читаешь эту тему. Все, абсолютно все экспортированные функции из DLL должны иметь один необязательный аргумент - указатель на функцию. В случае с такими функциями, как EnumWindows, получится два указателя на функцию. Один для EnumWindows, а второй - если он есть, то по окончании выполнения функции, экспортированной из DLL, выполняется эта функция. Только так я могу узнать, что работа низкоуровневой функции закончилась и можно продолжать выполнение высокоуровневой задачи.

Понимаешь, мне, получается, надо останавливать работу автолиспа и ждать окончания работы низкоуровневой функции. А она,зараза, долго может работать. По многу раз она свои лисп-выражения запускает и только когда все окна перелопатит - дает знать, что работа окончена, вот тут и надо запустить вторую функцию, которая даст мне возможность продолжить прерванный процесс. Ей, никакие аргументы передавать не надо. Просто запускать, по окончании работы низкоуровневой функции (той, которая экспортирована).
По поводу признака продолжения работы (см. пост #38) - тоже надо.
Supermax вне форума  
 
Непрочитано 17.12.2008, 23:17
#47
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Supermax, ты зря обижаешься - я днюху праздновал. Свою днюху.
Теперь
Цитата:
ты предлагаешь мне написать свой СОМ для вызова функций Windows API?
Да
Цитата:
А то, что это уже сделал YMP с Серого форума не подойдет?
Лично мне - нет. Я просто поостерегся бы использовать достаточно опасный инструмент, написанный не мной. Думаешь, почему я стал лиспом заниматься?
Ладно, это лирика была. Теперь по делу.
Я сильно подозреваю (подозреваю, т.к. ни один из примеров не запускал; в коде "обертки" не копался и не собираюсь - даже если он открыт), что "остановить" выполнение API-шной функции "где-то посередке" невозможно. Ну или самостоятельно полностью перерабатывать API.
Засим откланиваюсь - все равно нить рассуждений для меня в состоянии "и не находил".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.12.2008, 12:13
#48
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А я и не обижаюсь, с чего это ты взял?
Да кто бы ни написал "обертку" и открыл код, копаться в чужом - полный мрак. Правда если с пояснениями, да еще в теме, с обсуждениями и спорами - другой базар. Даже интересно и познавательно.
Я не Windows API намерен останавливать, а процесс лиспа. Читай внимательнее.
Да что мы все время цепляемся к Windows API? "Обертка" дает возможность пользоваться экспортируемыми функциями DLL. Любых DLL, даже тех, которые ты написал сам. А что можно написать, зная, что это будет использовано в Автолиспе? Думаю очень много всего.
Делать "обертку" на каждую, нужную функцию, да еще в СОМ ее интегрировать не так, как это в DynamicWrapperX реализовано, а скажем намертво вбивая обращение к ней специальным методом - фигня.

Но меня по прежнему волнует глобальный вопрос - это хорошо или плохо, когда высокоуровневый язык получает доступ к низкоуровневым операциям, с помощью низкоуровневых функций и СОМ объектов?

Вся эта тема создана только для того, чтобы выяснить отношение публики к вышеупомянутому вопросу.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вызов функций Windows API из AutoLISP



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка нажатия CTRL в LISP в фоновом режиме(не grread) BH LISP 10 22.08.2006 22:23
Программеры, где моя ошибочка? {Smirnoff} Программирование 11 01.03.2004 11:08