Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 |

 

  Вопрос: Ошибки в Win32Api.inc Добавлено: 25.05.04 14:01  

Автор вопроса:  alex

Предлагаю, скидывать сюда ошибки и неточности, обнаруженные в файле Win32Api.inc, а
также в других .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
.....

На моей  Win2000 (assembling 2195, SP4), получаю GPF при вызове:

CopyMemory BYVAL VARPTR(Pos), x, 2
CopyMemory BYVAL (VARPTR(Pos)+2), y, 2

Вообще-то я не люблю эту функцию, ее активно использовали во времена Win95/98 для
работы с указателями в VB, но под NT5 она работает криво (может организация памяти
другой стала, или Unicode виноват).
Потом заглянув в Win32Api.inc увидел вот такую декларацию SetConsoleCursorPosition:

Declare Function SetConsoleCursorPosition Lib "KERNEL32.DLL" Alias "SetConsoleCursorPosition"_
 (ByVal hConsoleOutput As Dword, ByVal dwCursorPosition As Dword) As Long          

А в MSDN она описывается как:

Type COORD
  x As Integer
  y As Integer
End Type

Declare Function SetConsoleCursorPosition Lib "KERNEL32.DLL" Alias "SetConsoleCursorPosition"_
 (ByVal hConsoleOutput As Dword, ByVal dwCursorPosition As COORD ) As Long


Короче говоря, я заменил  dwCursorPosition на тип COORD, и переписал функцию LOCATE в виде:

Sub LOCATE(ByVal x As Word, ByVal y As Word)
Local Pos As COORD
Pos.x=x
Pos.y=y
SetConsoleCursorPosition hConsoleOut,  Pos
End Sub    


После этого все заработало!
Курсор устанавливается правильно....

:)

Ответить

  Ответы Всего ответов: 19  

Номер ответа: 1
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #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-сайт: basicproduction.nm.ru/
 Профиль | | #2
Добавлено: 25.05.04 15:08
 Вообще то там всё правильно написано. Pb, в отличие от Vb, не высчитывает адрес UDT автоматически.
 Почему бы не сделать так:
 dim MyCOORD as COORD
 SetConsoleCursorPosition STD_OUT_HANDLE, VarPtr(MyCOORD)

Ответить

Номер ответа: 3
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #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-сайт: mudator.by.ru
 Профиль | | #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-сайт: mudator.by.ru
 Профиль | | #7
Добавлено: 25.05.04 15:36
странно.. счас проверю...

Ответить

Номер ответа: 8
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #8
Добавлено: 25.05.04 15:44
По ИКСу пашет +) а вот по Игрику нет .. забавно ...

Ответить

Номер ответа: 9
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #9
Добавлено: 25.05.04 15:53
у меня кстати не копи мемори а МУВ мемори +))

Ответить

Номер ответа: 10
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #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-сайт: mudator.by.ru
 Профиль | | #12
Добавлено: 25.05.04 16:46
Ну пофиг на самом деле... в памяти будет лежать первые 2 байта и вторые два байта... так вотпрос ... какая тогда нафиг разница если я их запишу двумя параметрами?... опять же вообщем надо покапаться... в чём проблема +)

Ответить

Номер ответа: 13
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: mudator.by.ru
 Профиль | | #14
Добавлено: 26.05.04 09:19
обсалютно верно

Ответить

Номер ответа: 15
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #15
Добавлено: 26.05.04 21:24
Всё намного проще.
См. товет номер 5
http://www.vbnet.ru/forum/show.aspx?id=44044

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам