Возврат значения параметра процедурой (proc) ???

Тема в разделе "WASM.ASSEMBLER", создана пользователем miae, 31 май 2009.

  1. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    Приветствую.

    Подсобите с кодом. Пишу DLL возвращающую различные параметры системы. Пишу потоками, чтобы можно было запрашивать сразу несколько параметров.

    вот код:
    Код (Text):
    1. section '.data' data readable writable
    2. thID dd 0
    3. szTitle db "Computer Name",0
    4. szComputerName          rb 16
    5. iComputerNameSize       dd 16
    6. bThreadCreated db 0
    7.  
    8. section '.code' code readable executable
    9. proc Thread arg
    10.         invoke GetComputerName, szComputerName, iComputerNameSize
    11.        [u] invoke MessageBox, 0, szComputerName, szTitle, MB_OK[/u]
    12.         ret
    13. endp
    14.  
    15. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    16.         cmp     [bThreadCreated], 0
    17.         jnz @F
    18.         inc byte [bThreadCreated]
    19.         invoke  CreateThread, 0, 0, Thread, 0, 0, thID
    20.    @@:  mov     eax,TRUE
    21.         ret
    22. endp
    Как вместо MessageBox вернуть значение (имя комапьютера) в качестве параметра ???
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Ну делается это определенно не в дллмейн :) Вообще, странный подход у тебя к модулям :) Сделай свою процедуру Thread экспортируемой и потом просто вызывай из ехе. А как возвращать - да выдели один глобальный буфер в длл (а правильнее наверное в самом ехе, а указатель на буфер - в качестве параметра) - и возвращай тру или фолс.
     
  3. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    Есть ли дока на эту тему, кою почитать можно ??
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    на какую именно тему??? стукни в аську, пока я в сети
     
  5. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    пока упростил задачку (потоки отменяются), но все равно код не поддается.
    вычитал, что result ф-ии передается в eax, но чую что-то недописал ... вы уж простите неуча, с дельфи на фасм тяжко слезать, но необходимо.

    помогите найти ашипку ))), код ниже

    sysinfo.asm
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.  
    8.     szComputerName rb 16
    9.  
    10. section '.code' code readable executable
    11.  
    12. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    13.     mov eax,TRUE
    14.     ret
    15. endp
    16.  
    17. proc ShowComputerName, STD_OUTPUT_HANDLE
    18.     invoke  GetComputerName, eax, szComputerName;
    19.     ret
    20. endp
    21.  
    22. section '.idata' import data readable writeable
    23.  
    24.   library kernel,'KERNEL32.DLL'
    25.   import kernel,\
    26.      GetComputerName, 'GetComputerNameA',\
    27.      LocalFree,'LocalFree'
    28.  
    29. section '.edata' export data readable
    30.  
    31.   export 'sysinfo.dll',\
    32.      ShowComputerName,'ShowComputerName'
    33.  
    34. section '.reloc' fixups data discardable
    use.asm
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.     title db 'Функция возвратила указатель на строку:',0
    8.     output dd 0
    9.  
    10. section '.code' code readable executable
    11.  
    12.   start:
    13.     invoke  ShowComputerName
    14.     mov [output], eax
    15.     invoke  MessageBox, 0, eax, title, MB_OK
    16.     invoke  ExitProcess,0
    17.  
    18. section '.idata' import data readable writeable
    19.  
    20.   library kernel,'KERNEL32.DLL',\
    21.       user,'USER32.DLL',\
    22.       errormsg,'sysinfo.dll'
    23.  
    24.   import kernel,\
    25.      ExitProcess,'ExitProcess'
    26.   import user,\
    27.      MessageBox,'MessageBoxA'
    28.  
    29.   import errormsg,\
    30.      ShowComputerName,'ShowComputerName'
     
  6. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Код (Text):
    1. BOOL GetComputerName(
    2.   LPTSTR lpBuffer,  // computer name
    3.   LPDWORD lpnSize   // size of name buffer
    4. );
    а у тебя invoke GetComputerName, eax, szComputerName где имя компутера то?
     
  7. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    ну вроде как в EAX ...
     
  8. SL7549

    SL7549 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    17
    ууух на смех как меня пробило
    как ты можешь поместить строку в регистр eax, он же 32 битный, так никто не делает. первым аргументом передается указатель на буфер строковой, в который будет записано имя компьютера, вторым размер буфера. вот и напиши в секции неинициализированных данных buffer rb 512 и передавай указатель на этот буфер (invoke GetComputerName,buffer,512)
     
  9. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    Чуял жж что одним регистром не отделаешься ... а как мне в основной программе вызвать значение, которое в lib`е в буфер занесется ... ? если организовать в dll некую структуру, то как передать значения в основную программу.
    Код (Text):
    1. struct strCN
    2.   CN rb 512
    3.   szCN dd 512
    4. ends
    примерчик бы ...
     
  10. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Ты издеваешься или как? Я ж тебе сказал, как сделать.
    В ехе делаешь так:
    Код (Text):
    1. Some_string  db 100h dup(?)
    потом так:
    Код (Text):
    1. invoke MyMegaProc,addr Some_string,sizeof Some_string
    2. cmp eax,1   ;true
    3. jz _good
    4. jmp _bag
    потом в своей функции ты имеешь адрес, куда записать строку, размер - сколько можно записать. На выходе помещаешь в еах 1 если все ок, и 0 - если ошибка. ЧТО ЕЩЕ МОЖЕТ БЫТЬ ПРОЩЕ???
     
  11. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Проще - подождать когда добрый дядя MSoft сделает готовое решение и выложит его.
     
  12. miae

    miae Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    44
    Спасибо огромное MSoft, SL7549, irrona
    за то что пнули старика под зад и заставили пролистать дюжену доков и примеров по fasm

    решением моего вопроса стало
    DLL
    Код (Text):
    1. section '.data' data readable writeable
    2.      szCN dd 16
    3. section '.code' code readable executable
    4. ...
    5. proc ShowComputerName, CN
    6.      invoke  GetComputerName, [CN], szCN;
    7.      ret
    8. endp
    9. section '.edata' export data readable
    10.   export 'test.dll',\
    11.      ShowComputerName,'ShowComputerName'
    и USE
    Код (Text):
    1. section '.data' data readable writeable
    2.     message db 16 dup(?)
    3. section '.code' code readable executable
    4. ...
    5.     invoke  ShowComputerName, message
    6.     invoke  MessageBox, 0, message, title, MB_OK
    7. ...