Задумал написать несколько функций на ассемблере и поместить их в DLL, чтобы использовать в программе на VB6. Решил пользовать FASM. Но даже функция DLL из примеров FASMа не вызывается программой на VB6. Подскажите пожалуйста шаблон DLL или ссылку на описание.
Для VB6 подходят самые обычные DLL, всё должно работать. Как вы описываете прототип вызываемой функции на VB6 ? Пробовали вызывать WinAPI ?
VB это вредоносная среда. На голой оси ваше приложение не будет работать. Иначе оно будет глючить, лагать, крэшится и вообще это не среда для коденга.
Разумеется, API-функции вызываются на-ура. Я не на своём компе, по этому пока что вот исходник примера из FASM. Код (Text): ; DLL creation example format PE GUI 4.0 DLL entry DllEntryPoint include 'win32a.inc' section '.text' code readable executable proc DllEntryPoint hinstDLL,fdwReason,lpvReserved mov eax,TRUE ret endp ; VOID ShowErrorMessage(HWND hWnd,DWORD dwError); proc ShowErrorMessage hWnd,dwError local lpBuffer:DWORD lea eax,[lpBuffer] invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,[dwError],LANG_NEUTRAL,eax,0,0 invoke MessageBox,[hWnd],[lpBuffer],NULL,MB_ICONERROR+MB_OK invoke LocalFree,[lpBuffer] ret endp ; VOID ShowLastError(HWND hWnd); proc ShowLastError hWnd invoke GetLastError stdcall ShowErrorMessage,[hWnd],eax ret endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL' import kernel,\ GetLastError,'GetLastError',\ SetLastError,'SetLastError',\ FormatMessage,'FormatMessageA',\ LocalFree,'LocalFree' import user,\ MessageBox,'MessageBoxA' section '.edata' export data readable export 'ERRORMSG.DLL',\ ShowErrorMessage,'ShowErrorMessage',\ ShowLastError,'ShowLastError' section '.reloc' fixups data discardable
Кладу DLL в папку с проектом, объявляю функцию (Declare ShowLastError...) - при запуске программы пишет, что DLL не найдена...
Код (Text): Declare Function ShowLastError Lib "test_dll.dll" (ByVal hWnd As Long) As Long Sub test() ShowLastError (0) End Sub у меня работает, проверил вордом
по умолчанию VB6 передаёт параметры по ссылке (ByRef), а VB .NET по значению... поэтому всегда нужно явно указывать.
Ещё ведь важно - учитываются большие и маленькие буквы в имени функции, а я на С++ не писал, вот и забыл. А так же DLL должна импортировать и использовать хотя бы одну функцию из WinAPI в любой своей функции, иначе система выводит ошибку: файл ХХХ.DLL не найден.