|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 2, 2004 11:46:28 Есть тестовая dll: .386 .model flat, stdcall option casemap: none include \masm32\include\WINDOWS.INC include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .code DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD mov eax,TRUE Ret DllEntry EndP RSExecute proc strURL:DWORD mov ebx,strURL invoke MessageBox,0,strURL,strURL,MB_OK xor eax,eax ret RSExecute endp End DllEntry Как сделать так,чтобы сама ф-ция вернула значение параметра strURL? В данном варианте она возвращает 0 при удачном выполнении. |
|
|
Дата: Июл 2, 2004 12:07:45 написать в конце вместо xor eax, eax mov eax, strURL и ebx неплохо бы восстанавливать при выходе |
|
|
Дата: Июл 2, 2004 13:31:22 · Поправил: Asterix > и ebx неплохо бы восстанавливать при выходе Или убрать строчку mov ebx, strURL ;-) |
|
|
Дата: Июл 2, 2004 14:28:08 Дело в том что эта строка не важна.И без нее прекрасно работает.Спасибо masquer подсказал.Только я написал до этого,что это лишь тестовая библиотека.В реальной библиотеке,которую я пишу,в функции выполняется некоторое количество операций,результат которых накапливается в буфферной переменной.Если я в конце процедуры(читай функции) вывожу MessageBox,вторым параметром которого задаю адрес буффера,он мне показывает результат,которого я,собственно,ожидаю.Но при переноса значения буффера в eax,я не совсем понимаю что происходит.Так как при вызове dll из тестовой программы.Функция возвращает мне всего 4 байта.И все... |
|
|
Дата: Июл 2, 2004 14:47:47 задаю адрес буффера правильно переноса значения буффера не значение(содержимое) , а тот же адрес . strURL это адрес (смещение,начало) текстовой строки , которую ты выводишь в сообщении . После mov eax,strURL вызови из проги invoke MessageBox,0,eax,eax,MB_OK и ты должен получить тоже самое , что и из этой тестовой dll . |
|
|
Дата: Июл 2, 2004 14:54:42 irrona В eax тебе функция должна вернуть указатель на буфер, т.е. адрес первого байта буфера, и это именно DWORD. |
|
|
Дата: Июл 2, 2004 15:17:04 Да как же мне указатель на буфер передать в eax?
...
.data ?
strBuffer dd ? ;это накопительный буфер
.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,TRUE
Ret
DllEntry EndP
SomeTest proc strURL:DWORD
LOCAL NumberOfBytesRead:DWORD
LOCAL hBool:DWORD
LOCAL nBuffer:DWORD
LOCAL rBuffer[4096]:BYTE
;=======Дальше сам код процедуры и в конце следующее======
mov hBool,1
.while hBool == 1
...
rBuffer,addr NumberOfBytesRead
.if NumberOfBytesRead == 0
mov hBool,0
jmp end_reading
.else
invoke lstrcat, addr strBuffer, addr rBuffer
.endif
.endw
end_reading:
invoke MessageBox,0,addr strBuffer,addr AppName,MB_OK ; показывает нормальную строку в буфере
mov eax, strBuffer
ret
SomeTest endp
End DllEntry
После этого из тестовой проги вызываю dll,пытаясь получить возвращаемое функцией значение
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib SomeTest.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
SomeTest PROTO :DWORD
.data
AppName db "Test Application",0
strUrl db "127.0.0.1/test/test1.asp",0
.data
strBuffer dd ?
.code
start:
invoke SomeTest,addr strUrl
mov strBuffer,eax
invoke MessageBox,0,addr strBuffer,addr AppName,MB_OK ; здесь получаю только первые четыре символа
invoke ExitProcess,NULL
end start
|
|
|
Дата: Июл 2, 2004 15:22:25 вместо mov eax, strBuffer нужно mov eax, OFFSET strBuffer |
|
|
Дата: Июл 2, 2004 15:33:49 Огромное спасибо всем кто ответил.Все заработало после mov eax,offset strBuffer кроме того нужно было еще в тестовой проге писать invoke MessageBox,0,strBuffer,addr AppName,MB_OK Еще раз спасибо. |