Автор вопроса: freeloader | Web-сайт:freeloader.folder-pro.net | ICQ: 50804884
помогите перевести на MASM:
Public Function RegGetValue(ByVal hKey As RootKey, _
ByVal sSubKey As String, _
ByVal sValueName As String, _
Optional ByVal sDefault As String = vbNullString) As String
Dim lngDataLen As Long, hSubKey As Long, lType As Long
If Not RegOpenKeyEx(hKey, sSubKey, &H0, KEY_READ, hSubKey) = ERROR_SUCCESS Then GoTo SetDefValue
RegGetValue = String$(&HFF, &H0): lngDataLen = Len(RegGetValue)
If Not RegQueryValueEx(hSubKey, sValueName, ByVal &H0, lType, ByVal RegGetValue, lngDataLen) = ERROR_SUCCESS Then GoTo SetDefValue
If lngDataLen < 1& Then GoTo SetDefValue
RegGetValue = Left$(RegGetValue, lngDataLen - 1&)
Call RegCloseKey(hSubKey)
If Not lType = REG_SZ Then GoTo SetDefValue
Exit Function
SetDefValue:
Call RegCloseKey(hSubKey)
RegGetValue = sDefault
End Function
Дык легче пример найти, зачем заново велосипед изобретать
ЗЫ
А откуда ты этот код взял, уж очень он на мой стиль стиль похож... а может и не похож, но я бы тут ни строчки не исправил, стал бы так пользоваться (это было раньше, сейчас бы пару символов подкорректировал )
Легче? обшарил весь wasm.ru, ничего не нашел...
где это еще может быть?
сдесь то не особо сложно, вот только знаний у меня пока не хватает...,
ЗЫ:
Ладно придуриваться, сам же знаешь, что этот код ты мне дал, еще наверное месяца три назад )
Это надо искать в примерах... Пусть там все не функциями, но использование-то RegOpenKeyEx имеется да и вообще работа с реестром наблюдается в них... могу выслать...
ЗЫ
Я же не могу помнить что кому отослал... памяти на все не хватит
Если ты не против, я немного подправлю твой стиль
1.Передача самой переменной в функцию, чтобы она её заполнила.
2.Возвращаемое значение - не String, а Long: если 1 - успешно, можно читать sValue, если 0 - нет, sValue останется незаполненной (т.е. Default'ное значение NULL).
Сама функция:
;#########################################################################
RegGetValue proc hKey:DWORD,sSubKey:DWORD,sValueName:DWORD,sValue:DWORD
LOCAL lngDataLen:DWORD
local hHandleKey:DWORD
local lType :DWORD
Private Declare Function RegGetValue Lib "BrowseDLG.dll" ( _
ByVal hRoot As Long, _
ByVal sSubKey As String, _
ByVal sValueName As String, _
ByVal sValue As String) As Long
 im sSubKey As String
 im sValueName As String
 im sValue As String
 im ret As Long
sSubKey = "SOFTWARE\ACD Systems\PlugIns"
sValueName = "PIFolder"
sValue = String(255, Chr$(0))
ret = RegGetValue(ByVal HKEY_LOCAL_MACHINE, ByVal sSubKey, ByVal sValueName, ByVal sValue)
If ret = 1 Then
MsgBox sValue
Else
MsgBox "Can't read key value"
End If
Да я думаю что табы уж я расставлю, дай бог это умею )),
спасибо всем,!,
сейчас буду разбираться со всем этим написанным ), а что касается вызова в VB, то он мне не нужен, вся программа будет на асме, если мне вызывать ее из самой программы на ассемблере то как будет выглядеть эта строка?
;sValue = String(255, Chr$(0))
????
в секции инициализированых данных создается строка длиной 255 нулей.
а весь вызов осуществляется так:
;=======это в секцию данных=================
.data
SubKey db "SOFTWARE\ACD Systems\PlugIns",0
ValueName db "PIFolder",0
Value db 255 dup(0)
;=====это в секцию кода (откуда будет вызываться=====================
.code
invoke RegGetValue,HKEY_LOCAL_MACHINE,ADDR SubKey,ADDR ValueName,ADDR Value
.if eax==1 ;если функция успешно вернулась
invoke MessageBox,NULL,ADDR Value,ADDR ValueName,MB_OK
.endif
;====================================
;если ключ и значение есть (строковое), то API- функция заполнит пустой буфер Value (т.е. забитый нулями), адрес которого ты ей передаёшь, значением, считаным из реестра. Если нет, он так и останется забитым нулями. В этом случае, если ты запросишь MessageBox со строкой Value, то он покажет пустое окошко.
И не забудь указать инклюды для работы с реестром:
include \masm32\include\advapi32.inc
includelib \masm32\lib\advapi32.lib
И ещё: чтобы можно было использовать invoke, опиши прототип функции:
На этот вопрос несколько ответов:
1) Этот сайт ориентирован на vb, НО ассемблерщика полюбому тут есть, всвязи с этим я подумал, то что мне здесь смогут объяснить более подробно.
2) Тоже как продолжение первого, а более подробно потому что, здесь таковых не много, а следовательно на этот вопрос не ринуться все отвечать, таким образом не будет каши в ответах.
3) и наконец доминирующий ответ, хотя он и расположен в конце , это то что меня не закидают , если вопрос будет слишком простой
Сразу вспоминается тот случай, когда я написал сообщение и через два часа мне на него ктото ответил: "Ну прям ясли", после чего его удалили
Можно конечно есть пару штук написать, но основное здесь
Тот твой вопрос не был удалён, он был перемещён в другой раздел. Да, на том форуме надо хорошо продумать вопрос и способ его подачи, чтобы получить на него ответ. Особенно для начинающего это сложно.
1. Тот код, что ты прислал:
invoke RegGetValProc,HKEY_LOCAL_MACHINE,addr SsSubKey, addr STsKey, addr Value
пытается считать значение параметра 'Show in TaskBar' из ключа HKEY_LOCAL_MACHINE\HideWnd.
Вот теперь ты мне объясни, каким таким способом ты смог создать такой ключ??? Я попытался - Винда мне не позволила. Так как непосредственно в HKEY_LOCAL_MACHINE есть 5 подветок: HARDWARE, SAM, SECURITY, SOFTWARE, SYSTEM. Другие подветки создать невозможно. Можно создать ключ HideWnd в одной из пяти вышеперечисленных подветок.
Так вот я предполагаю, что твой HideWnd и находится внутри одной из этих пяти. Например: HKEY_LOCAL_MACHINE\SOFTWARE\HideWnd, а ты пытаешься считать его из HKEY_LOCAL_MACHINE\HideWnd. Проверь ещё раз, где находится твой параметр и если так, как я предположил, то скорректируй SsSubKey.
2.Какая такая форма? Вопрос не очень корректен, поэтому предположительно: тебя интересует, как создаётся диалог? Если ты создавал проект в RadASM'e то загляни в папку Res. Там должен быть файл "имя_проекта_Dlg.rc". Открой его блокнотом и увидишь, какие параметры там описываются (размеры, стили, какие контролы используются и описание каждого из них). Эти параметры и используются для передачи их в API CreateDialogBoxParam, которая и создаёт диалог. Этот файл (.rc) аналогия vb-шного .frm, только в нём нет кода. Код вынесен в .asm, .inc
Дааааа лопухнулся я, уже замкнуло... писал то я в HKCU, а читал с HKLM )
На второй вопрос все верно, посмотрел, но ожидал увидеть несколько другое...
теперь у меня еще вопрос, объсните мне разницу между
push eax
pop hWin
И
mov hWin, eax
посути дела, они ведь делают одно и тоже, только первый закладывает в стек, а потом извлекает уже под другим именем правильно понимаю? а во втором случае в hWin копируется значение из eax? Или может есть какая то более существенная разница между этим?
Теперь у меня вторая часть вопроса.
Все нормально, значение устанавливаю и получаю, а что касается сравнения строки то тут MASM, а точнее RadASM ругается, вот что я делаю:
.if Value==SsValYes
;SHOW IN TRAY
invoke MessageBox,hWin, addr SsSubKey, addr STsKey,MB_OK
.endif
invoke RegGetValProc,HKEY_CURRENT_USER, addr SsSubKey, addr AWsKey, addr Value
.if Value==SsValYes
;Auto Load With Windows
.endif
Мне кажется вся проблема вот в чем, правильно я понимаю и как от это перебороть?:
...
SsValYes db 'Yes',0
...
Value db 255 dup(0)
...
3. Что можете посоветовать для обучения, может есть какая книженция хорошая, как в электронном виде так и в печатном издании?
Многие начинают изучение ассемблера с DOS, но я не могу понять зачем мне знать все прерывания доса, которые в винде не используется, или я ошибаюсь?
4. ну вот вроде бы и все
Дааааа лопухнулся я, уже замкнуло... писал то я в HKCU, а читал с HKLM )
На второй вопрос все верно, посмотрел, но ожидал увидеть несколько другое...
теперь у меня еще вопрос, объсните мне разницу между
push eax
pop hWin
И
mov hWin, eax
посути дела, они ведь делают одно и тоже, только первый закладывает в стек, а потом извлекает уже под другим именем правильно понимаю? а во втором случае в hWin копируется значение из eax? Или может есть какая то более существенная разница между этим?
Теперь у меня вторая часть вопроса.
Все нормально, значение устанавливаю и получаю, а что касается сравнения строки то тут MASM, а точнее RadASM ругается, вот что я делаю:
.if Value==SsValYes
;SHOW IN TRAY
invoke MessageBox,hWin, addr SsSubKey, addr STsKey,MB_OK
.endif
invoke RegGetValProc,HKEY_CURRENT_USER, addr SsSubKey, addr AWsKey, addr Value
.if Value==SsValYes
;Auto Load With Windows
.endif
Мне кажется вся проблема вот в чем, правильно я понимаю и как от это перебороть?:
...
SsValYes db 'Yes',0
...
Value db 255 dup(0)
...
3. Что можете посоветовать для обучения, может есть какая книженция хорошая, как в электронном виде так и в печатном издании?
Многие начинают изучение ассемблера с DOS, но я не могу понять зачем мне знать все прерывания доса, которые в винде не используется, или я ошибаюсь?
4. ну вот вроде бы и все