GUID это Глобальный Универсальный ID (идентификатор) приложения
LIBID это ID библиотеки, которую использует приложение
Выглядят эти ID следующим образом: "{851A4561-F4EC-4631-9B0C-E7DC407512C9}" (это LIBID).
Зная GUID приложения в реестре можно найти название этого приложения и LIBID, название библиотеки которую использует это приложение и название (полный путь) файла этой библиотеки, а зная название файла библиотеки, можно подключить эту библиотеку програмным способом в VBA.
Поэтому мне надо научиться получать GUID верхнего окна AutoCAD из ответных даных функции EnumWindows!
Посмотрите для дополнительной информации следующие страницы: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=31057hl http://www.autocad.ru/cgi-bin/f1/board.cgi?t=30870FC http://www.autocad.ru/cgi-bin/f1/board.cgi?t=30875Kz
Re: Помогите получить GUID из отв. данных функции EnumWindow
Здравствуйте, MishaVBA, Вы писали:
MVB>GUID это Глобальный Универсальный ID (идентификатор) приложения MVB>LIBID это ID библиотеки, которую использует приложение MVB>Выглядят эти ID следующим образом: "{851A4561-F4EC-4631-9B0C-E7DC407512C9}" (это LIBID). MVB>Зная GUID приложения в реестре можно найти название этого приложения и LIBID, название библиотеки которую использует это приложение и название (полный путь) файла этой библиотеки, а зная название файла библиотеки, можно подключить эту библиотеку програмным способом в VBA. MVB>Поэтому мне надо научиться получать GUID верхнего окна AutoCAD из ответных даных функции EnumWindows!
[off]Толчение воды в ступе...[/off]
Можно, используя дескриптор окна, извлечь путь к exe-шнику.
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib"user32" ( _
ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib"kernel32" ( _
ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Declare Function CloseHandle Lib"kernel32" ( _
ByVal hObject As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib"kernel32" ( _
ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Const TH32CS_SNAPMODULE = &H8
Private Const MAX_PATH = 260
Private Const MAX_MODULE_NAME32 = 255
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Long
modBaseSize As Long
hModule As Long
szModule(0 To MAX_MODULE_NAME32) As Byte
szExePath(0 To MAX_PATH - 1) As Byte
End Type
Private Declare Function Module32First Lib"kernel32" ( _
ByVal hSnapshot As Long, lpme As MODULEENTRY32) As Long
Private Const INVALID_HANDLE_VALUE As Long = -1&
Public Function GetExePathFromhWnd(ByVal hWnd As Long) As String
Dim ProcessId As Long
Dim hProcess As Long
Dim hModuleSnap As Long
Dim me32 As MODULEENTRY32
Dim sExePath As String
GetWindowThreadProcessId hWnd, ProcessId
If ProcessId = 0 Then Exit Function
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessId)
If hProcess = 0 Then Exit Function
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId)
If hModuleSnap = INVALID_HANDLE_VALUE Then CloseHandle hProcess: Exit Function
me32.dwSize = LenB(me32)
If Module32First(hModuleSnap, me32) Then
sExePath = StrConv(me32.szExePath, vbUnicode)
GetExePathFromhWnd = Left$(sExePath, InStr(sExePath, vbNullChar) - 1)
End If
CloseHandle hModuleSnap
CloseHandle hProcess
End Function
Как из пути к exe-шнику извлечь "GUID верхнего окна AutoCAD" — дело твоё.
Re[2]: Помогите получить GUID из отв. данных функции EnumWin
Здравствуйте, Бенедикт, Вы писали:
Б>Как из пути к exe-шнику извлечь "GUID верхнего окна AutoCAD" — дело твоё.
Мне сказали, что функция EnumWindows возвращает Handle, а как получить через Handle -> GUID приложения, в итоге мне надо получить путь к библиотеке этого приложения через LIBID этого приложения, но самое главное сейчас надо научиться получать GUID через Handle приложения. Как это сделать?
Re[3]: Помогите получить GUID из отв. данных функции EnumWin
Здравствуйте, MishaVBA, Вы писали:
Б>>Как из пути к exe-шнику извлечь "GUID верхнего окна AutoCAD" — дело твоё. MVB>Мне сказали, что функция EnumWindows возвращает Handle, а как получить через Handle -> GUID приложения, в итоге мне надо получить путь к библиотеке этого приложения через LIBID этого приложения, но самое главное сейчас надо научиться получать GUID через Handle приложения. Как это сделать?
Я предлагаю другой путь: идти от известных GUIDов к окнам и хендлам. (У меня, правда, нет АвтоКАДа, поэтому путь может корректироваться с учетом реалий)
1. Для всех тебе известных версий АвтоКАДа ты знаешь его GUIDы, вернее, его ProgIDы, в виде "AutoCAD.Application.nnn" и "AutoCAD.Application" для самой последней версии.
2. Для любого известного ProgIDа можно получить запущенный экземпляр его приложения через
Dim app As Object
Set app = GetObject(,"AutoCAD.Application.nnn") ' и "AutoCAD.Application" соответственно
3. У этого приложения можно перебрать все его активные окна (как — не знаю) и сравнить с тем, которое тебя интересует.
4. У интересующего приложения через объект можно получить его библиотеку типов. Один из способов — использовать TLBINF32.DLL (TypeLib Information).
Dim ta As TLI.TLIApplication, tlinfo As TLI.TypeLibInfo
Set ta = New TLI.TLIApplication
Set tlinfo = ta.ClassInfoFromObject(app).Parent
5. Использовать эту библиотеку типов для своих целей.
Здравствуйте, MishaVBA, Вы писали:
MVB>Здравствуйте, Бенедикт, Вы писали:
MVB>Мне сказали, что функция EnumWindows возвращает Handle, а как получить через Handle -> GUID приложения, в итоге мне надо получить путь к библиотеке этого приложения через LIBID этого приложения, но самое главное сейчас надо научиться получать GUID через Handle приложения. Как это сделать?
Спасибо за пересказ начального сообщения темы.
а) Библиотека типов AutoCAD-а, насолько я видел, находится в том же каталоге, что и exe-шник, имеет расширение .tlb (по крайней мере, для 2000-го).
б) Ссылку на библиотеку можно добавить не только по LIBID, но и указав на файл: References.AddFromFile.
в) а + б = ?
Re[4]: Помогите получить GUID из отв. данных функции EnumWin
Здравствуйте, Vi2, Вы писали:
Vi2>4. У интересующего приложения через объект можно получить его библиотеку типов. Один из способов — использовать TLBINF32.DLL (TypeLib Information). Vi2>
Vi2>Dim ta As TLI.TLIApplication, tlinfo As TLI.TypeLibInfo
Vi2>Set ta = New TLI.TLIApplication
Vi2>Set tlinfo = ta.ClassInfoFromObject(app).Parent
Vi2>
Vi2>5. Использовать эту библиотеку типов для своих целей.
А можно получить объект app используя ответные данные функции EnumWindows?
Вот пример работы функции EnumWindows:
'Add this code to a formPrivate Sub Form_Load()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
'Set the form's graphics mode to persistent
Me.AutoRedraw = True'call the Enumwindows-function
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub'Add this code to a moduleDeclare Function EnumWindows Lib"user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Declare Function GetWindowText Lib"user32"Alias"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib"user32"Alias"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
Dim sSave As String, Ret As Long
Ret = GetWindowTextLength(hwnd)
sSave = Space(Ret)
GetWindowText hwnd, sSave, Ret + 1
Form1.Print Str$(hwnd) + " " + sSave
'continue enumeration
EnumWindowsProc = True
End Function