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

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

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

Ответ
Поиск в этой теме
Непрочитано 28.11.2008, 21:39
Вызов функций 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 перегнать.
Просмотров: 9211
 
Автор темы   Непрочитано 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
С.-Петербург
Сообщений: 39,846


Побуду "тупицей": а теперь то же самое, но без сторонних библиотек и языков
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 39,846


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
С.-Петербург
Сообщений: 39,846


Честно говоря, мне сейчас лень разбираться с тем, что лично мне понадобится очень не скоро. 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
С.-Петербург
Сообщений: 39,846


Со структурами? Вообще-то можно, насколько мне известно. Передача данных может быть как по ссылке, так и по значению.
Цитата:
И вообще, ты что, против Автолиспа имеешь?
Типа "А за лисп ты сейчас ответишь!"
Цитата:
Такое расширение функционала народу подарили!, а ты недоволен.
Да, недоволен. Потому что расширение это - искуственное, привнесенное "снаружи" и требующее установки дополнительных утилит. Это сегодня язык бесплатный и его можно свободно скачивать и устанавливать. А что будет завтра - не знает никто.
__________________
Моя библиотека 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,381


Наивно радоваться, что кто-то "подарил рыбу". Надо учится "ловить рыбу", потому что подаренная рыба завтра протухнет. Или выяснится, что она с глистами.

Надо просто научиться делать такие "обертки" самому, на это уйдет гораздо меньше времени, а пользы будет неимоверно больше. Создавать такие "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
С.-Петербург
Сообщений: 39,846


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

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


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

Размещение рекламы


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