Что нового

Еще один Dll Viewer

Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
AZJIO
Спасибо - гляну.
-------------------------
joiner
А при каких опциях такие варианты? (те что по умолчанию выставлены?)
Попробуй выставить в настройках программы (во флагах загрузки символов) значение UDNAME, а галочку с раздекоорирования вообще снять - это будет фактически идентично тому, что используется в Dll Helper (тем более что основная функция EnumDllProc у меня и так из WinAPIEx.au3 от Yashied'а)-
по идее тогда вообще никакой разницы между нашими программами в получаемых именах быть не должно.


Добавлено:
Сообщение автоматически объединено:

Проверил сейчас на iphlpapi.dll - с параметром загрузки символов UDNAME работает чище, чем при любых опциях раздекорирования.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
да, при таких настройках имена функций не обрезаются..только есть лишние символы. и соответственно эти имена для поиска не годны. смотри скрин
нужно оставить так и перед вставкой чистить строку
думаю, что эти опции должны быть по умолчанию. чтобы пользователь не парился сразу с настройкой программы. да и в настройке слова типа UNDNAME ничего не говорят что это за настройка. можно придумать что то наводящее. понятно что в справке нужно подробнее описать. ну или просто описать в справке, а обозначения пусть останутся те же.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
joiner
Это не совсем 'лишние' символы - cdecl и stdcall - это обозначения типа\метода вызова функции в С++, а :: или _ - добавляют компиляторы перед именем функции. Они по любому остаются после раздекорирования - так как такой вариант это и есть раздекорированный. Далее 'очищать' большого смысла нет - и к тому же затруднительно, если не знаешь синтаксиса С++.
Dll Export, к примеру, вообще вот так оставляет: ?table_size@$ctype@D@std@@2IB и ?_BADOFF@std@@3JB.
Согласно msdn есть еще опция NO_CPP - она должна заменять :: на нижнее подчеркивание. Правда, ее нужно использовать вместе с флагом UDNAME - но установка суммы флагов у меня пока в GUI не предусмотрена.(но сделаю обязательно).
-----------------------------------------------------------------------------
В справку постараюсь добавить описание опций и по умолчанию выставлю наиболее оптимальные.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
ну что можно сказать.
по этим именам (с двоеточиями) на MSDN ничего не найдешь
вобщем я нашел средний вариант настроек, который и нужно сделать по умолчанию
при этих настройках все показывает корректно. смотри скрин


Добавлено:
Сообщение автоматически объединено:

точнее, скорее всего достаточно только опции NAME_ONLY. остальное как есть
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Если развернуть на весь экран, затем зайти в настройки и закрыть их, то окно вернется в исходное положение :blink:
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
inververs
У меня главное окно блокируется (@SW_DISABLE) при открытии дополнительных, а потом опять включается: GUISetState(@SW_ENABLE, $hMainWnd) и GUISetState(@SW_RESTORE, $hMainWnd) - иначе остается свернутым в панели. А @SW_RESTORE восстанавливает именно оригинальный размер окна, а не последний. Пока максимизация окна была заблокирована - все было окей. А сейчас сам обратил внимание на это. Но какая опция отвечает за 'развернуть окно и восстановить последний размер' - непонятно.


Добавлено:
Сообщение автоматически объединено:

------------------------------------------
Есть еще одна проблемка - горячие клавиши не регистрируются если на компе раскладка по умолчанию не английская(не предусмотрел такой вариант).
Решил поправить это. Вставил в код перед установкой акселераторов проверку
Код:
If @KBLayout <> 00000409 Or @KBLayout <> 0409  Then
_WinAPI_SetKeyboardLayout($hMainWnd,0409)
EndIf

затем сменил у себя на компе раскладку по умолчанию на русскую (для теста) . Запускаю программу - смена не проходит и клавиши не регистрируются. Не могу понять почему.
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
erlik
Потому что противоположное @SW_DISABLE есть @SW_ENABLE, а не @SW_RESTORE. Если по другому никак, то хранить флаг текущего состояния окна. А лучше выяснить почему сворачивается.

Есть еще одна проблемка - горячие клавиши не регистрируются если на компе раскладка по умолчанию не английская
http://pastebin.com/iasqvvsN
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
AZJIO
лучше выяснить почему сворачивается
Согласен. Правда я почему то думал, что так оно и должно быть - поэтому всегда применял на пару @SW_ENABLE и @SW_RESTORE после @SW_DISABLE. Но попробую выяснить.
----------------
По раскладке - спасибо :smile:. Сначала подумал - что все идентично функции Yashied_WinAPI_SetKeyboardLayout. Однако протестив выяснил - что вариант из WinAPIEx.au3 не работал из-за параметра $hWnd - который нужно передавать обязательно. Передавал я туда хэндел от GUICreate. А в твоем в примере хендел окна выясняется динамически и другим способом. И это работает (опять же если хэндел не передавать).


Добавлено:
Сообщение автоматически объединено:

-------------------------------------------
Выяснил причину сворачивания главного окна при закрытии дополнительного окна.
Оказывается нужно было просто поменять порядок следования функций.
Вместо:
Код:
GUIDelete($hSettingsWnd); удаляем окно настроек
GUISetState(@SW_ENABLE, $hMainWnd);  разблокируем главное окно

надо было
Код:
GUISetState(@SW_ENABLE, $hMainWnd)
GUIDelete($hSettingsWnd)

Тогда никаких @SW_RESTORE не требуется.
-----------------------------------------------
Все правки внесу в новую версию.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Обновил программу до версии 1.0.0.5.
Собственно ничего сверхнового не добавлено (список изменений в шапке), но после окончательного разбора проблем с файловым редиректом скомпилировал наконец рабочую 32-битную версию программы, которая нормально работает и в 64-битной версии Windows (если не считать некоторых ограничений чисто системного характера).
В шапку добавлена ссылка на исходник.
----------------------------------------------
Поясню некоторые нюансы по следам предыдущих постов.
Была проблема с открытием папки system32 64-битной Windows и выбора оттуда библиотек для загрузки. Собственно проводник делает вид, что папку открывает, но на самом деле отображает содержимое SysWOW64. Эта проблема решена использованием псевдонима sysnative для system32, так что папка в диалоге выбора файлов открывается истинная.
Помнится Yashied писал, что его DllHelper 64-битные dll открывает. И что интересно, он был прав. За исключением пары нюансов. Если у dll нет 32-битной копии - ее просто нельзя будет выбрать через диалог выбора файлов, так как проводник отображает именно SysWOW64. Кроме того, если у dll нет 64-битной копии, а только 32-разрядная - программа выдаст ошибку о том, что файл не найден, так как функция _WinAPI_EnumDllProc работает по неперенаправленным путям. Во всех остальных случаях все нормально - получив путь вида c:\windows\system32\ntdll.dll (проводник подсовывая вместо system32 - sysWOW64, так же нагло возвращает Не истинный путь выбранного файла), DllHelper открывает файл именно по этому пути.
Собственно вот эти нюансы и были учтены в новой версии программы DllViewer: где то используется отключение редиректа, где то псевдоним sysnative.
Программа скомпилирована в одну 32-битную версию, но ничто не мешает вам скомпилировать из исходника 64-разрядную. В последнем случае не будет ограничений на доступ к 64-битным процессам (32-битная версия не может открывать 64-разрядный процесс, поэтому получить список модулей текущих процессов, увы, нельзя).

PS: если кто-то захочет поразбираться с модулем WinAPI_PE.au3 - буду очень признателен за его поправки и дополнения.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
при клике на функцию программа пишет, что отсутствует интернет соединение.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
joiner
У тебя интернет подключение не стандартное?
Наличие соединения системная функция _WinAPI_IsNetworkAlive() проверяет + ping. Впрочем просто в ini файле в параметре CheckConnect=1 поменяей на CheckConnect=0. Тогда программа проверять ничего не будет.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
у меня через роутер.
_WinAPI_IsNetworkAlive - пример из справки работает. показывает , что соединение есть
Ping - пример из справки работает. только для проверки я взял яндекс.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
joiner
У тебя _WinAPI_IsNetworkAlive что возвращает при отсутствии и наличии интернета?
У меня 1 и 3. А на XP 0 и 3.
В общем я так и думал, что на нее полагаться нельзя. По справке 0 - если нет, и не 0- если есть. Но в моем случае на Windows 7 при прямом кабельном Ethernet - без роутера, уже результат справке не соответствует. Я поэтому в проверку результата и добавил еще одно условие на 1, полагая что так нужно под семерку :smile: Выходит зря. Может вообще чисто пингом обойтись?
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
возвращает 1 если есть инет, в противном случае - 0
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Вот нарыл в своих запасах мегафункцию. Должна железно возвращать - есть или нет подключение.
Проверь что у тебя вернет.
Код:
#include <array.au3>
;=====================================================
; RASAPI32.DLL
;=====================================================
Global Const $RAS_MaxEntryName = 256
Global Const $RAS_MaxPhoneNumber = 128
Global Const $RAS_MaxCallbackNumber = 128
Global Const $UNLEN = 256
Global Const $PWLEN = 256
Global Const $DNLEN = 12
Global Const $RAS_MaxDeviceType = 16
Global Const $RAS_MaxDeviceName = 128
Global Const $MAX_PATH = 260


Global Const $tagRASCONN = 'dword dwSize;hwnd hRasConn;' & _
	'char szEntryName[' & $RAS_MaxEntryName  +1 &'];' & _
	'char szDeviceType['& $RAS_MaxDeviceType +1 &'];' & _
	'char szDeviceName['& $RAS_MaxDeviceName +1 &'];' & _
	'char szPhonebook[' & $MAX_PATH &'];' & _
	'dword dwSubEntry;byte guidEntry[16];dword dwFlags;byte luid[8]'

Local $aRet=_RasEnumConnections()
If $aRet[0]=0 Then MsgBox(0,'', 'Нет открытых подключений')
_ArrayDisplay($aRet)
; возвращает информацию об активном подключении удаленного доступа
Func _RasEnumConnections()

    Local $tRASCONN,$aRASCONN[11]
    $tRASCONN = DllStructCreate($tagRASCONN)

    Global $iCntByte = DllStructCreate("dword")
    Global $iCntConn = DllStructCreate("dword")
    DllStructSetData($iCntByte, 1, DllStructGetSize($tRASCONN))
    DllStructSetData($tRASCONN, "dwSize", DllStructGetSize($tRASCONN))

    Local $aRet = DllCall("rasapi32.dll", "int", "RasEnumConnections", "ptr", DllStructGetPtr($tRASCONN), "ptr", DllStructGetPtr($iCntByte), "ptr", DllStructGetPtr($iCntConn))
    If $aRet[0] Then
		ReDim $aRASCONN[1]
		$aRASCONN[0]=0
	    Return SetError(1, 0, $aRASCONN)
    EndIf
	If DllStructGetData($iCntConn,1)<1 Then
	    ReDim $aRASCONN[1]
		$aRASCONN[0]=0
		Return SetError(2, 0 ,$aRASCONN) ; Ошибка: нет открытых соединений
    EndIf
	For $i=1 To 11
	   $aRASCONN[$i-1]=DllStructGetData($tRASCONN, $i)
	Next
    Return $aRASCONN
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
пишет, что нет открытых подключений. в массиве пишет нуль
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
joiner
Вот засада :smile: Я уже все функции какие есть перепробовал и InternetCheckConnection('http://www.google.com') и _InternetGetConnectedState() и _InternetGoOnline('http://rambler.ru') - это все системные функции и ни одна не дает нужного результата пригодного для всех типов подключений. Выходит остается ограничиться пингом.


Добавлено:
Сообщение автоматически объединено:

Хотя нет - _InternetCheckConnection() с аргументом URL работает. Но это по сути тот же ping.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
думаю, что нужно использовать несколько функций проверки. возможно, найти варианты для каждой ситуации. или использовать их по кругу все ( две-три). если хотя бы одна сработала, то значит инет есть
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
В общем оставил проверку чисто пингом. Ну его ... эти дополнительные проверки.
Перезалил обе ссылки.
Если что, можно как я уже писал, вообще отключить. Ничего критического тут нет - проверка все равно чисто формальная.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В Vista и выше лучше использовать _WinAPI_IsInternetConnected(). В XP надежнее пингом, т.к. _WinAPI_IsNetworkAlive() не распознает прямое соединение с интернетом (не VPN) при наличии внутренней сети. А так, нужно проверять флаг NETWORK_ALIVE_WAN (0x02).
 
Верх