Работа с Win API в Win64.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Работа с Win API в Win64.

Сообщение Mikle » 11.10.2018 (Чт) 12:06

В общем, решил попробовать сделать 64-битный порт для SR2D. Выбросил из dll весь ассемблер, перекомпилировал для 64-битной платформы, сделал в vb.net проекте 64x целевую платформу - dll нормально подключается и работает, но не работает отображение спрайта на форму через SetDiBitsToDevice. В Win32 это было так:
При создании формы получаем hDC:
Код: Выделить всё
  Private Sub Form1_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.HandleCreated
    Grp = Me.CreateGraphics
    hDC = New HandleRef(Grp, Grp.GetHdc)
  End Sub

Используем его в SetDIBitsToDevice:
Код: Выделить всё
SetDIBitsToDevice(hDC, 0, 0, meWidth, meHeight, 0, 0, 0, meHeight, cBuf(0), bi32BitInfo, 0)

В 64х это не работает, нет никакой ошибки, просто на форму ничего не отображается.
В bi32BitInfo пробовал менять biSize с 32-х на 64 - не помогает, хотя, как я понял, это разрядность цвета, и менять не нужно?
Подскажите, куда рыть?

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Работа с Win API в Win64.

Сообщение The trick » 11.10.2018 (Чт) 14:56

Скинь проект (скомпилированный) который воспроизводит ошибку.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с Win API в Win64.

Сообщение Mikle » 11.10.2018 (Чт) 16:01

Вот пример. Скомпилированный EXE в папке \bin\x64\Release.
Тут рабочий Win32 пример и пример Win64, из которого выкинуты ф-ции, которых нет в dll потому, что они были ассемблерными.
Сомнений, что работают ф-ции из dll, нет - раскоментируй строку с SaveToFile, и программа сгенерирует этот файл, он будет увеличен, то есть сработала ф-ция Resize.
В таком виде, как сейчас, форма просто должна окрашиваться чёрным, можно раскоментировать строку с DrawEBM, тогда должна появиться некая картинка, в Win32 версии можно повторить и посмотреть какая.
Вложения
SR2D_NET.zip
(572.16 Кб) Скачиваний: 279

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Работа с Win API в Win64.

Сообщение The trick » 11.10.2018 (Чт) 16:44

Передаешь неверный указатель на пиксели, сейчас посмотрю почему это может быть.
Посмотрел. В общем передается только указатель на временное значение которое копируется из массива пикселей. По-видимому в NET нельзя так передавать:
Код: Выделить всё
Private Shared Function SetDIBitsToDevice(ByVal hDC As HandleRef, ByVal x As Integer, ByVal y As Integer, ByVal Dx As Integer, ByVal Dy As Integer, ByVal SrcX As Integer, ByVal SrcY As Integer, ByVal Scan As Integer, ByVal NumScans As Integer, [b]ByRef Bits As Integer[/b], ByRef BitsInfo As BITMAPINFO, ByVal wUsage As Integer) As Integer

Нужно передавать именно адрес начала данных массива. У тебя вроде PTR там есть.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с Win API в Win64.

Сообщение Mikle » 11.10.2018 (Чт) 17:38

The trick писал(а):Передаешь неверный указатель на пиксели

Но в Win32 это работает.
И ещё, если это недопустимый для чтения указатель на память - была бы ошибка, а если допустимый - то на форму должен был отобразиться мусор.
Смогу попробовать передавать ByVal PTR вечером.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Работа с Win API в Win64.

Сообщение The trick » 11.10.2018 (Чт) 19:30

У тебя картинка 512х512 пикселей 4 байта на пиксель = 0x100000 там просто нет такого доступного региона памяти. Вот к примеру если я поменяю адрес, то будет мусор:
bad_region_demonstration.png
bad_region_demonstration.png (41.03 Кб) Просмотров: 4065


Но в Win32 это работает.

Как в NET правильно передавать такие буфера?

Смогу попробовать передавать ByVal PTR вечером.

Я попробовал, все работает (только странно выглядит):
ptr_draw_demonstration.png
ptr_draw_demonstration.png (643.05 Кб) Просмотров: 4065
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с Win API в Win64.

Сообщение Mikle » 11.10.2018 (Чт) 19:41

The trick писал(а):Я попробовал, все работает (только странно выглядит)

Отлично! Так и должно быть, это же другой вид бампа, контент не подходит.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с Win API в Win64.

Сообщение Mikle » 11.10.2018 (Чт) 22:21

Да, работает. Замена передачи данных ByRef на ByVal PTR решила проблему. Что же тогда передаёт ByRef, если не 64-битный адрес переменной?

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Работа с Win API в Win64.

Сообщение The trick » 11.10.2018 (Чт) 22:26

В общем передается только указатель на временное значение которое копируется из массива пикселей.

Первый элемент копируется во временное значение и адрес этого временного значения передается.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с Win API в Win64.

Сообщение Mikle » 11.10.2018 (Чт) 22:31

Получается, что в Win32 и в Win64 это работает по-разному?
Откуда эта цитата, кстати?

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Работа с Win API в Win64.

Сообщение The trick » 11.10.2018 (Чт) 22:43

Mikle писал(а):Получается, что в Win32 и в Win64 это работает по-разному?

Получается так, можно просто проверить что передается в функцию и чему равен PTR на разных платформах.

Mikle писал(а):Откуда эта цитата, кстати?

Я выше отписал.
UA6527P


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList