· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.HELHEIM —› Вопрос по DLL

Посл.отвђт Сообщен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


Еще раз спасибо.