Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Assembler

Страница: 1 | 2 | 3 |

 

  Вопрос: Registry Добавлено: 12.10.04 05:26  

Автор вопроса:  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

Ответить

  Ответы Всего ответов: 35  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 12.10.04 08:37
Дык легче пример найти, зачем заново велосипед изобретать ;)

ЗЫ
А откуда ты этот код взял, уж очень он на мой стиль стиль похож... а может и не похож, но я бы тут ни строчки не исправил, стал бы так пользоваться ;) (это было раньше, сейчас бы пару символов подкорректировал ;))

Ответить

Номер ответа: 2
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #2
Добавлено: 12.10.04 09:02
Легче? обшарил весь wasm.ru, ничего не нашел...
где это еще может быть?
сдесь то не особо сложно, вот только знаний у меня пока не хватает...,
ЗЫ:
Ладно придуриваться, сам же знаешь, что этот код ты мне дал, еще наверное месяца три назад :))

Ответить

Номер ответа: 3
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 12.10.04 19:12
Это надо искать в примерах... Пусть там все не функциями, но использование-то RegOpenKeyEx имеется да и вообще работа с реестром наблюдается в них... могу выслать...

ЗЫ
Я же не могу помнить что кому отослал... памяти на все не хватит ;)

Ответить

Номер ответа: 4
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #4
Добавлено: 13.10.04 11:01
шли
что бы быть яснее напишу, что мне непонятно:
    RegGetValue = String$(&HFF, &H0)
 
RegGetValue = Left$(RegGetValue, lngDataLen - 1&;)
c остальным проблем нет...

Ответить

Номер ответа: 5
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #5 Добавлено: 13.10.04 14:55
freeloader

Если ты не против, я немного подправлю твой стиль :)
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

invoke RegOpenKeyEx,hKey,sSubKey,NULL,KEY_READ,addr hHandleKey
.if eax==ERROR_SUCCESS
invoke RegQueryValueEx,hHandleKey,sValueName,NULL,addr lType,sValue,addr lngDataLen
.if eax==ERROR_SUCCESS
mov eax,lngDataLen
.if eax!=0
mov eax,lType
.if eax==REG_SZ
invoke RegQueryValueEx,hHandleKey,sValueName,NULL,addr lType,sValue,addr lngDataLen
invoke RegCloseKey,hHandleKey
mov eax,1
jmp Exit_Success
.endif
.endif
.endif
.endif
invoke RegCloseKey,hHandleKey
xor eax,eax
Exit_Success:
ret

RegGetValue endp

Если надо вызывать из VB, то вызов такой:

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

    ;Dim sSubKey As String
    ;Dim sValueName As String
    ;Dim sValue As String
    ;Dim 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

Ответить

Номер ответа: 6
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 13.10.04 15:00
Ну вот, masm'овское форматирование потерялось, но думаю, расставишь табы где надо

Проверял (воткнул в dll и вызывал из VB) - всё работает.

Ответить

Номер ответа: 7
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #7
Добавлено: 13.10.04 16:24
Да я думаю что табы уж я расставлю, дай бог это умею )),
спасибо всем,!,
сейчас буду разбираться со всем этим написанным ), а что касается вызова в VB, то он мне не нужен, вся программа будет на асме, если мне вызывать ее из самой программы на ассемблере то как будет выглядеть эта строка?
;sValue = String(255, Chr$(0))
????

Ответить

Номер ответа: 8
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #8 Добавлено: 13.10.04 19:14
;sValue = String(255, Chr$(0))


Это выглядит так:

.data
sValue db 255 dup(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, опиши прототип функции:

RegGetValue PROTO:DWORD,:DWORD,:DWORD,:DWORD

Ответить

Номер ответа: 9
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #9 Добавлено: 13.10.04 19:18
А вообще, чего здесь, а не на асмовом сайте спрашиваешь? :)

Ответить

Номер ответа: 10
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #10
Добавлено: 14.10.04 10:39
Спасибо, все доходчиво описал!

На этот вопрос несколько ответов:
1) Этот сайт ориентирован на vb, НО ассемблерщика полюбому тут есть, всвязи с этим я подумал, то что мне здесь смогут объяснить более подробно.
2) Тоже как продолжение первого, а более подробно потому что, здесь таковых не много, а следовательно на этот вопрос не ринуться все отвечать, таким образом не будет каши в ответах.
3) и наконец доминирующий ответ, хотя он и расположен в конце :), это то что меня не закидают , если вопрос будет слишком простой :)
Сразу вспоминается тот случай, когда я написал сообщение и через два часа мне на него ктото ответил: "Ну прям ясли", после чего его удалили :)
Можно конечно есть пару штук написать, но основное здесь :)

Ответить

Номер ответа: 11
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #11 Добавлено: 14.10.04 14:48
Тот твой вопрос не был удалён, он был перемещён в другой раздел. Да, на том форуме надо хорошо продумать вопрос и способ его подачи, чтобы получить на него ответ. Особенно для начинающего это сложно.

Ответить

Номер ответа: 12
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #12
Добавлено: 14.10.04 14:57
cresta:

1. С твоим кодом есть небольшой вопрос, поэтому посмотри пожалуйсто, я тебе отправил на мыло кусок в котором ничего не происходит :(

2. Как можно с RadAsm'a вытащить код самой формы? сколько времени уже тыкаюсь ни как не могу найти...

Ответить

Номер ответа: 13
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #13 Добавлено: 14.10.04 17:29
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

Если ты спрашиваешь не об этом, то уточни вопрос.

Ответить

Номер ответа: 14
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #14
Добавлено: 15.10.04 14:51
Дааааа лопухнулся я, уже замкнуло... писал то я в 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


 Assembling: HideWnd.asm
HideWnd.asm(61) : error A2070: invalid instruction operands
HideWnd.asm(66) : error A2070: invalid instruction operands

Мне кажется вся проблема вот в чем, правильно я понимаю и как от это перебороть?:

...
SsValYes db 'Yes',0
...
Value db 255 dup(0)
...

3. Что можете посоветовать для обучения, может есть какая книженция хорошая, как в электронном виде так и в печатном издании?
Многие начинают изучение ассемблера с DOS, но я не могу понять зачем мне знать все прерывания доса, которые в винде не используется, или я ошибаюсь?
4. ну вот вроде бы и все :)

Ответить

Номер ответа: 15
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #15
Добавлено: 15.10.04 14:52
Дааааа лопухнулся я, уже замкнуло... писал то я в 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


 Assembling: HideWnd.asm
HideWnd.asm(61) : error A2070: invalid instruction operands
HideWnd.asm(66) : error A2070: invalid instruction operands

Мне кажется вся проблема вот в чем, правильно я понимаю и как от это перебороть?:

...
SsValYes db 'Yes',0
...
Value db 255 dup(0)
...

3. Что можете посоветовать для обучения, может есть какая книженция хорошая, как в электронном виде так и в печатном издании?
Многие начинают изучение ассемблера с DOS, но я не могу понять зачем мне знать все прерывания доса, которые в винде не используется, или я ошибаюсь?
4. ну вот вроде бы и все :)

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам