Написал простенькую ф-цию в dll на asm'e, пытаюсь вызвать её из VB, но выскакивает ошибка 49: "Плохое dll соглашение вызова". Все возможные причины такого просмотрел в msdn, вроде всё правильно, но увы... не работает. Со строками получается передача параметров в dll, c числами - dword - не получается. Вернее параметры в dll приходят, я их там вижу, вызываю диалог выбора цвета, он мне выдает decimal значение выбраного цвета и при возвращении из dll - ошибка. Тут процедура: Код (Text): ChooseColour proc hWin:DWORD, Flags:DWORD LOCAL hHandle :DWORD LOCAL dwFlags :DWORD m2m hHandle,hWin m2m dwFlags,Flags invoke ColorDialog,hHandle,hInstance,dwFlags ;ф-ция из masm32lib ret ChooseColour endp А тут вызов её: Код (Text): Declare Function ChooseColour Lib "BrowseDLG.dll" ( _ ByVal hwnd As Long, _ ByVal dwFlags As Long) As Long ChooseColour ByVal Me.hwnd, ByVal 0 Кто знает vb подскажите, где тут могут быть грабли?
cresta предохраняй регистры и все будет в порядке. Глянул на колор диалог - там edi корежится, вот VB и ругается праведно
В msdn написаны основные регистры, которые должны быть сохранены. ChooseColour PROC EXPORT LOCAL hHandleWORD LOCAL dwFlagsWORD PUSHA MOV EAX,DWORD PTR [ESP+32+12+04+00] MOV hHandle,EAX MOV EAX,DWORD PTR [ESP+32+12+04+04] MOV dwFlags,EAX invoke ColorDialog,hHandle,hInstance,dwFlags ;ф-ция из masm32lib POPA ret 8 ChooseColour endp masquer, опередил...
masquer,PavPS Оцеловал бы, но не модно... (могут неправильно понять) Сделал ChooseColour proc uses edi esi hWinWORD, FlagsWORD - работает PavPS не знаю нужно ли ещё, но на всякий случай приаттачил. 988415669__BrowseDLG.Asm