как создать DLL на FASM для VB6

Тема в разделе "WASM.BEGINNERS", создана пользователем kw33, 22 июн 2011.

  1. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Задумал написать несколько функций на ассемблере и поместить их в DLL, чтобы использовать в программе на VB6.
    Решил пользовать FASM. Но даже функция DLL из примеров FASMа не вызывается программой на VB6. Подскажите пожалуйста шаблон DLL или ссылку на описание.
     
  2. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Для VB6 подходят самые обычные DLL, всё должно работать.
    Как вы описываете прототип вызываемой функции на VB6 ?
    Пробовали вызывать WinAPI ?
     
  3. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    VB это вредоносная среда. На голой оси ваше приложение не будет работать. Иначе оно будет глючить, лагать, крэшится и вообще это не среда для коденга.
     
  4. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Разумеется, API-функции вызываются на-ура.
    Я не на своём компе, по этому пока что вот исходник примера из FASM.

    Код (Text):
    1. ; DLL creation example
    2.  
    3. format PE GUI 4.0 DLL
    4. entry DllEntryPoint
    5.  
    6. include 'win32a.inc'
    7.  
    8. section '.text' code readable executable
    9.  
    10. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    11.         mov     eax,TRUE
    12.         ret
    13. endp
    14.  
    15. ; VOID ShowErrorMessage(HWND hWnd,DWORD dwError);
    16.  
    17. proc ShowErrorMessage hWnd,dwError
    18.   local lpBuffer:DWORD
    19.         lea     eax,[lpBuffer]
    20.         invoke  FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,[dwError],LANG_NEUTRAL,eax,0,0
    21.         invoke  MessageBox,[hWnd],[lpBuffer],NULL,MB_ICONERROR+MB_OK
    22.         invoke  LocalFree,[lpBuffer]
    23.         ret
    24. endp
    25.  
    26. ; VOID ShowLastError(HWND hWnd);
    27.  
    28. proc ShowLastError hWnd
    29.         invoke  GetLastError
    30.         stdcall ShowErrorMessage,[hWnd],eax
    31.         ret
    32. endp
    33.  
    34. section '.idata' import data readable writeable
    35.  
    36.   library kernel,'KERNEL32.DLL',\
    37.           user,'USER32.DLL'
    38.  
    39.   import kernel,\
    40.          GetLastError,'GetLastError',\
    41.          SetLastError,'SetLastError',\
    42.          FormatMessage,'FormatMessageA',\
    43.          LocalFree,'LocalFree'
    44.  
    45.   import user,\
    46.          MessageBox,'MessageBoxA'
    47.  
    48. section '.edata' export data readable
    49.  
    50.   export 'ERRORMSG.DLL',\
    51.          ShowErrorMessage,'ShowErrorMessage',\
    52.          ShowLastError,'ShowLastError'
    53.  
    54. section '.reloc' fixups data discardable
     
  5. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Кладу DLL в папку с проектом, объявляю функцию (Declare ShowLastError...) - при запуске программы пишет, что DLL не найдена...
     
  6. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Код (Text):
    1. Declare Function ShowLastError Lib "test_dll.dll" (ByVal hWnd As Long) As Long
    2.  
    3. Sub test()
    4.     ShowLastError (0)
    5. End Sub
    у меня работает, проверил вордом
     
  7. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Прописал полный путь к файлу, ошибок нет, но и результата работы функции тоже.
     
  8. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    попробовал с другой, уже готовой DLL, она работает.
     
  9. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Эээх.... Чувствую себя дебилом! Я думал это выкрутасы VB6, а сам ByVal не указал!!
    Спасибо dinoweb.
     
  10. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    ну вот... я же сразу спрашивал как вы прототип объявляете
     
  11. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    по умолчанию VB6 передаёт параметры по ссылке (ByRef), а VB .NET по значению...
    поэтому всегда нужно явно указывать.
     
  12. kw33

    kw33 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    12
    Ещё ведь важно - учитываются большие и маленькие буквы в имени функции, а я на С++ не писал, вот и забыл.
    А так же DLL должна импортировать и использовать хотя бы одну функцию из WinAPI в любой своей функции, иначе система выводит ошибку: файл ХХХ.DLL не найден.