Вообще беда... чё-то я недопонимаю политику InteropService...
вызываю IDirect3DVertexBuffer метод Lock, который по ссылке возвращает указатель на адрес...
потом вызываю IDirect3DVertexBuffer метод UnLock...
На UnLock вылетает с экспшеном типа, что память не может быть Read
В связи с тем, что вышел новый билд Win7 - переставил на него и поставил VS2010 Beta 1
Ситуация повторилась...
Заглянул в заголовочный файл DirectX SDK, но там ещё к объявленным интерфейсам прикручены методы интерфейса IUnknown...
Сделал тоже самое у себя... Тогда студия стала ругаться "Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack."
Закоментил методы IUnknown и попробовал ещё раз... Всё стало работать как и должно... Lock стал нормально возвращать адрес по ссылке, и UnLock вызывается без проблем...
И не подскажите, как скопировать в память по указателю массив структур вида :
- Код: Выделить всё
<StructLayout(LayoutKind.Sequential)> _
Structure CustomVertex
Dim X, Y, Z, RHW As Single
Dim Color As UInt32
End Structure
CVertex() as CustomVertex
ReDim CVertex(2)
... Заполнение данными ...
Marshal.Copy копирует массив из определённых типов
Marshal.StructureToPtr копирует тока структуру
а вот как быть с массивом структур?
как бы я сделал
- Код: Выделить всё
Dim iPtr as Integer = pData.ToInt32
For i = 0 To UBound(CVertex)
if i > 0 Then pData = New IntPtr(iPtr + Marshal.SizeOf(GetType(CustomVertex)) * i)
Marshal.StructureToPtr(CVertex(i), pData, True)
Next
но может есть ли лучше вариант?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる