Страница: 1 | 2 |
Предлагаю, скидывать сюда ошибки и неточности, обнаруженные в файле Win32Api.inc, а К примеру, вчера вечером дома, долго мучился с функцией установки курсора в консоли: ... На моей Win2000 (assembling 2195, SP4), получаю GPF при вызове: CopyMemory BYVAL VARPTR(Pos), x, 2 Вообще-то я не люблю эту функцию, ее активно использовали во времена Win95/98 для Declare Function SetConsoleCursorPosition Lib "KERNEL32.DLL" Alias "SetConsoleCursorPosition"_ А в MSDN она описывается как: Type COORD Declare Function SetConsoleCursorPosition Lib "KERNEL32.DLL" Alias "SetConsoleCursorPosition"_ Sub LOCATE(ByVal x As Word, ByVal y As Word) :)
Вопрос: Ошибки в Win32Api.inc
Добавлено: 25.05.04 14:01
Автор вопроса: alex
также в других .inc файлах...
SUB LOCATE(x AS WORD, y AS WORD)
DIM Pos AS DWORD PTR
CopyMemory BYVAL VARPTR(Pos), x, 2
CopyMemory BYVAL (VARPTR(Pos)+2), y, 2
SetConsoleCursorPosition STD_OUT_HANDLE, Pos
END SUB
.....
CopyMemory BYVAL (VARPTR(Pos)+2), y, 2
работы с указателями в VB, но под NT5 она работает криво (может организация памяти
другой стала, или Unicode виноват).
Потом заглянув в Win32Api.inc увидел вот такую декларацию SetConsoleCursorPosition:
(ByVal hConsoleOutput As Dword, ByVal dwCursorPosition As Dword) As Long
x As Integer
y As Integer
End Type
(ByVal hConsoleOutput As Dword, ByVal dwCursorPosition As COORD ) As Long
Короче говоря, я заменил dwCursorPosition на тип COORD, и переписал функцию LOCATE в виде:
Local Pos As COORD
Pos.x=x
Pos.y=y
SetConsoleCursorPosition hConsoleOut, Pos
End Sub
После этого все заработало!
Курсор устанавливается правильно....
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #1
Добавлено: 25.05.04 14:38
И у меня Вин 2000 СП4... и всё работает прекрастно +) ну не суть... переопределить ... в любом случаи надо было +) так как сократит код ... а проще было сделать вот так...
Declare Function SetConsoleCursorPosition Lib "KERNEL32.DLL" Alias "SetConsoleCursorPosition"_
 ByVal hConsoleOutput As Dword, ByVal dwCursorPositionX As Integer, ByVal dwCursorPositionY As Integer) As Long
Это ещё и упростит и уменьшит код +)
Номер ответа: 2
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #2
Добавлено: 25.05.04 15:08
Вообще то там всё правильно написано. Pb, в отличие от Vb, не высчитывает адрес UDT автоматически.
Почему бы не сделать так:
dim MyCOORD as COORD
SetConsoleCursorPosition STD_OUT_HANDLE, VarPtr(MyCOORD)
Номер ответа: 3
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #3
Добавлено: 25.05.04 15:11
Зачем ты передаёшь адрес... туда? там должно передоваться значение Х У .. нижнии байты это Х а верхнии У... вот и всё (или наоборот +)) а передовая туда ДВОРД который содержит адрес.. ты переместишь курсор .. фиг знает куда...
Номер ответа: 4
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #4
Добавлено: 25.05.04 15:12
Declare Function SetConsoleCursorPosition Lib "KERNEL32.DLL" Alias "SetConsoleCursorPosition"_
 ByVal hConsoleOutput As Dword, ByVal dwCursorPositionX As Integer, ByVal dwCursorPositionY As Integer) As Long
При компиляции выдается сообщение:
Error 481 in CONSOLE.INC(30:67): Parameter mismatch with prior declaration
Line 30: (ByVal hConsoleOutput As Dword, ByVal dwCursorPositionX As Integer, ByVal dwCursorPositionY As Integer) As Long
Номер ответа: 5
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #5
Добавлено: 25.05.04 15:13
Parameter mismatch with prior declaration ну само сабой он гворит что ты уже где то раньше или позже... определил эту АПи но с другми параметрами...... погляди код свой
Номер ответа: 6
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #6
Добавлено: 25.05.04 15:27
Ok, подрубил лишнюю декларацию. Прога компилируется, ошибок нет. Но курсор не устанавливается на нужную позицию!
Номер ответа: 7
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #7
Добавлено: 25.05.04 15:36
странно.. счас проверю...
Номер ответа: 8
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #8
Добавлено: 25.05.04 15:44
По ИКСу пашет +) а вот по Игрику нет .. забавно ...
Номер ответа: 9
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #9
Добавлено: 25.05.04 15:53
у меня кстати не копи мемори а МУВ мемори +))
Номер ответа: 10
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #10
Добавлено: 25.05.04 16:01
Хм.. странно ладно дома покапаюсь счас что то туплю... такого быть не должно прсото ... странно...
Номер ответа: 11
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #11
Добавлено: 25.05.04 16:29
Ну вот, я тоже вчера вечером с такими странностями боролся, пока не заглянул в MSDN и не продекларировал:
Declare Function SetConsoleCursorPosition Lib "KERNEL32.DLL" Alias "SetConsoleCursorPosition"_
 ByVal hConsoleOutput As Dword, ByVal dwCursorPosition As COORD ) As Long
Наверное, тут что-то с типами мудрится...
В конце-концов майкрософт лучше знает, какие параметры для их API нужны...
Номер ответа: 12
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #12
Добавлено: 25.05.04 16:46
Ну пофиг на самом деле... в памяти будет лежать первые 2 байта и вторые два байта... так вотпрос ... какая тогда нафиг разница если я их запишу двумя параметрами?... опять же вообщем надо покапаться... в чём проблема +)
Номер ответа: 13
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #13
Добавлено: 25.05.04 20:00
Вроде бы этой функции передается через стек 2 дворда: хандл консоли и адрес 4 байт в памяти, в которых первые два байта - ворд X, вторые - ворд Y, из чего можно сделать вывод, что должно вызываться, если использовать Declare Function SetConsoleCursorPosition Lib "kernel32.dll" (ByVal hConsole As Long, dwCursorPosition As Long) As Long, где dwCursorPosition=65536*x+y, так, что ли?
Номер ответа: 14
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #14
Добавлено: 26.05.04 09:19
обсалютно верно
Номер ответа: 15
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #15
Добавлено: 26.05.04 21:24
Всё намного проще.
См. товет номер 5
http://www.vbnet.ru/forum/show.aspx?id=44044