Приветствую. Подсобите с кодом. Пишу DLL возвращающую различные параметры системы. Пишу потоками, чтобы можно было запрашивать сразу несколько параметров. вот код: Код (Text): section '.data' data readable writable thID dd 0 szTitle db "Computer Name",0 szComputerName rb 16 iComputerNameSize dd 16 bThreadCreated db 0 section '.code' code readable executable proc Thread arg invoke GetComputerName, szComputerName, iComputerNameSize [u] invoke MessageBox, 0, szComputerName, szTitle, MB_OK[/u] ret endp proc DllEntryPoint hinstDLL,fdwReason,lpvReserved cmp [bThreadCreated], 0 jnz @F inc byte [bThreadCreated] invoke CreateThread, 0, 0, Thread, 0, 0, thID @@: mov eax,TRUE ret endp Как вместо MessageBox вернуть значение (имя комапьютера) в качестве параметра ???
Ну делается это определенно не в дллмейн Вообще, странный подход у тебя к модулям Сделай свою процедуру Thread экспортируемой и потом просто вызывай из ехе. А как возвращать - да выдели один глобальный буфер в длл (а правильнее наверное в самом ехе, а указатель на буфер - в качестве параметра) - и возвращай тру или фолс.
пока упростил задачку (потоки отменяются), но все равно код не поддается. вычитал, что result ф-ии передается в eax, но чую что-то недописал ... вы уж простите неуча, с дельфи на фасм тяжко слезать, но необходимо. помогите найти ашипку ))), код ниже sysinfo.asm Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint include 'win32a.inc' section '.data' data readable writeable szComputerName rb 16 section '.code' code readable executable proc DllEntryPoint hinstDLL,fdwReason,lpvReserved mov eax,TRUE ret endp proc ShowComputerName, STD_OUTPUT_HANDLE invoke GetComputerName, eax, szComputerName; ret endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL' import kernel,\ GetComputerName, 'GetComputerNameA',\ LocalFree,'LocalFree' section '.edata' export data readable export 'sysinfo.dll',\ ShowComputerName,'ShowComputerName' section '.reloc' fixups data discardable use.asm Код (Text): format PE GUI 4.0 entry start include 'win32a.inc' section '.data' data readable writeable title db 'Функция возвратила указатель на строку:',0 output dd 0 section '.code' code readable executable start: invoke ShowComputerName mov [output], eax invoke MessageBox, 0, eax, title, MB_OK invoke ExitProcess,0 section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ errormsg,'sysinfo.dll' import kernel,\ ExitProcess,'ExitProcess' import user,\ MessageBox,'MessageBoxA' import errormsg,\ ShowComputerName,'ShowComputerName'
Код (Text): BOOL GetComputerName( LPTSTR lpBuffer, // computer name LPDWORD lpnSize // size of name buffer ); а у тебя invoke GetComputerName, eax, szComputerName где имя компутера то?
ууух на смех как меня пробило как ты можешь поместить строку в регистр eax, он же 32 битный, так никто не делает. первым аргументом передается указатель на буфер строковой, в который будет записано имя компьютера, вторым размер буфера. вот и напиши в секции неинициализированных данных buffer rb 512 и передавай указатель на этот буфер (invoke GetComputerName,buffer,512)
Чуял жж что одним регистром не отделаешься ... а как мне в основной программе вызвать значение, которое в lib`е в буфер занесется ... ? если организовать в dll некую структуру, то как передать значения в основную программу. Код (Text): struct strCN CN rb 512 szCN dd 512 ends примерчик бы ...
Ты издеваешься или как? Я ж тебе сказал, как сделать. В ехе делаешь так: Код (Text): Some_string db 100h dup(?) потом так: Код (Text): invoke MyMegaProc,addr Some_string,sizeof Some_string cmp eax,1 ;true jz _good jmp _bag потом в своей функции ты имеешь адрес, куда записать строку, размер - сколько можно записать. На выходе помещаешь в еах 1 если все ок, и 0 - если ошибка. ЧТО ЕЩЕ МОЖЕТ БЫТЬ ПРОЩЕ???
Спасибо огромное MSoft, SL7549, irrona за то что пнули старика под зад и заставили пролистать дюжену доков и примеров по fasm решением моего вопроса стало DLL Код (Text): section '.data' data readable writeable szCN dd 16 section '.code' code readable executable ... proc ShowComputerName, CN invoke GetComputerName, [CN], szCN; ret endp section '.edata' export data readable export 'test.dll',\ ShowComputerName,'ShowComputerName' и USE Код (Text): section '.data' data readable writeable message db 16 dup(?) section '.code' code readable executable ... invoke ShowComputerName, message invoke MessageBox, 0, message, title, MB_OK ...