Наследование COM интерфейсов

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

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

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Наследование COM интерфейсов

Сообщение FireFenix » 08.10.2009 (Чт) 23:36

В связи с особеннотю моей студии... есть багофитча - обязательное указание всех методов интерфейса, а иначе ничего пахать не будет или вовсе не будет запускаться...

В мануле DirectX написанно :
Код: Выделить всё
IDirect3DVertexBuffer9 inherits additional functionality from the IDirect3DResource9 interface.


Попробывал вызвать чистый IDirect3DVertexBuffer9 - облом ...

Попробывал конструкцию
Код: Выделить всё
Interface IDirect3DVertexBuffer9 : Inherits IDirect3DVertexBuffer9
  ... методы ...
End Interface

Облом ...

Попробывал
Код: Выделить всё
Interface IDirect3DVertexBuffer9
  ... методы IDirect3DResource9 ...
  ... методы IDirect3DVertexBuffer9 ...
End Interface

Всё пашет!

Можно ли обмануть багофитчу? А то переписывать все методы IDirect3DResource9 в 8 интерфейсов не красиво и не этично!
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Наследование COM интерфейсов

Сообщение Nord777 » 09.10.2009 (Пт) 7:34

Это точно не баг. Скорее всего неправильное использование.
Я DirectX не юзал, но возможно что-то в этом роде:
Код: Выделить всё
<ComImport(), _
Guid("0000000c-0000-0000-C000-000000000046"), _
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IStream
....
End Interface


А вообще мне казалось, что там все просто.
Подключил в референсы Microsoft.DirectX и погнал...
Код: Выделить всё
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D

Public Class Form1
   Sub aaa()
      Dim Buff As New VertexBuffer(....)
   End Sub
End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Наследование COM интерфейсов

Сообщение MIT » 09.10.2009 (Пт) 9:02

Nord777 писал(а):А вообще мне казалось, что там все просто. Подключил в референсы Microsoft.DirectX и погнал...
Это разные DirectX`ы :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Наследование COM интерфейсов

Сообщение Nord777 » 09.10.2009 (Пт) 9:09

Это разные DirectX`ы
Это как?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Наследование COM интерфейсов

Сообщение MIT » 09.10.2009 (Пт) 15:02

Тот который COM - это "настоящий" DirectX, а тот который в референсах - это MDX, т.е. НЕТовская реализация половины стандартного DirectX`а на основе тех же COM библ. Они не взаимозаменяемы, т.к. MDX имеет расширенный и удобный (по словам Тома Миллера) функционал.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Наследование COM интерфейсов

Сообщение Nord777 » 09.10.2009 (Пт) 15:17

Managed DirectX - это всего лишь обёртка над DirectX.
И это не разные DirectX`ы
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Наследование COM интерфейсов

Сообщение FireFenix » 09.10.2009 (Пт) 21:32

Nord777 писал(а):Это точно не баг. Скорее всего неправильное использование.
Я DirectX не юзал, но возможно что-то в этом роде:
Код: Выделить всё
<ComImport(), _
Guid("0000000c-0000-0000-C000-000000000046"), _
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IStream
....
End Interface

Если бы неправильно использование, то оно бы и вовсе не работало =)

Вот пример объявления IDirect3DVertexBuffer9
Код: Выделить всё
Imports Main.DirectX.Enum
Imports Main.DirectX.Structure

Imports System.Runtime.InteropServices

Namespace DirectX.Interface
    <Guid("B64BB1B5-FD70-4df6-BF91-19D0A12455E3")> _
    <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
    Public Interface IDirect3DVertexBuffer
        <PreserveSig()> _
        Function GetDevice(ByRef ppDevice As IDirect3DDevice) As UInt32

        <PreserveSig()> _
        Function SetPrivateData(ByRef refguid As Guid, <MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=2)> ByVal pData As Byte(), ByVal SizeOfData As UInt32, ByVal Flags As UInt32) As UInt32

        <PreserveSig()> _
        Function GetPrivateData(ByRef refguid As Guid, <MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=2)> ByVal pData As Byte(), ByRef pSizeOfData As UInt32) As UInt32
        <PreserveSig()> _
        Function FreePrivateData(ByRef refguid As Guid) As UInt32

        <PreserveSig()> _
        Function SetPriority(ByVal PriorityNew As UInt32) As UInt32

        <PreserveSig()> _
        Function GetPriority() As UInt32

        <PreserveSig()> _
        Sub PreLoad()

        <PreserveSig()> _
        Function [GetType]() As D3DRESOURCETYPE

        '''''' Типа разделитель интерфейсов

        <PreserveSig()> _
        Function GetDesc(ByRef pDesc As D3DVERTEXBUFFER_DESC) As UInt32

        <PreserveSig()> _
        Function Lock(ByVal OffsetToLock As UInt32, ByVal SizeToLock As UInt32, ByRef ppbData As Integer, ByVal Flags As Lock) As UInt32

        <PreserveSig()> _
        Function Unlock() As UInt32
    End Interface
End Namespace

До разделителя - наследуемый интерфейс IDirect3DResource9

P.S. Правда я после создания топиг вроде как удалил, подумал - глупо... но он почему-то оказался жив =)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Наследование COM интерфейсов

Сообщение FireFenix » 11.10.2009 (Вс) 13:50

Вообще беда... чё-то я недопонимаю политику 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

но может есть ли лучше вариант?
Последний раз редактировалось FireFenix 11.10.2009 (Вс) 21:38, всего редактировалось 1 раз.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Наследование COM интерфейсов

Сообщение Nord777 » 11.10.2009 (Вс) 19:31

А зачем тебе копировать?
Передавай адрес массива.

И вообще я не понимаю твоих мучений.
Используй XNA и будет тебе счастье.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Наследование COM интерфейсов

Сообщение FireFenix » 11.10.2009 (Вс) 19:56

Nord777 писал(а):А зачем тебе копировать?
Передавай адрес массива.

DirectX отдаёт тока указатель, куда нуна скопировать
Nord777 писал(а):И вообще я не понимаю твоих мучений.
Используй XNA и будет тебе счастье.

XNA - неинтересно... Хочется изучить без обёрткок =)

И вообще мучения не с DirectX, а с самой реакцией компонентов .НЕТ, которая просто убивает парадоксами!
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Наследование COM интерфейсов

Сообщение Nord777 » 11.10.2009 (Вс) 21:29

И вообще мучения не с DirectX, а с самой реакцией компонентов .НЕТ, которая просто убивает парадоксами!
По мере изучения .Net ты будешь так думать о VB6. А если нет, то бросай это неблагодарное дело и пересаживайся на Си :)

Изучай взаимодействие .Net c COM
Кажись на RSDN была статья.

1) Получить адрес первого элемента массива (UnsafeAddrOfPinnedArrayElement)
2) Получить размер структуры (SizeOf)
3) Скопировать по указателю [Длинна_Массива*Размер_структуры] байт (CopyMemory)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Наследование COM интерфейсов

Сообщение FireFenix » 11.10.2009 (Вс) 21:37

Nord777 писал(а):
И вообще мучения не с DirectX, а с самой реакцией компонентов .НЕТ, которая просто убивает парадоксами!
По мере изучения .Net ты будешь так думать о VB6. А если нет, то бросай это неблагодарное дело и пересаживайся на Си :)

О VB6 у меня хорошее впечатление, хотя с ним в самые дебри не лазил =) Но он нормально не держит COM...
Nord777 писал(а):Изучай взаимодействие .Net c COM
Кажись на RSDN была статья.

1) Получить адрес первого элемента массива (UnsafeAddrOfPinnedArrayElement)
2) Получить размер структуры (SizeOf)
3) Скопировать по указателю [Длинна_Массива*Размер_структуры] байт (CopyMemory)

Вроде бы CopyMemory это WinAPI =)

и я как бы сделал
Код: Выделить всё
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

Думал есть решение в одну строчку =)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Наследование COM интерфейсов

Сообщение Nord777 » 11.10.2009 (Вс) 22:25

Вроде бы CopyMemory это WinAPI =)
Ну COM тоже вроде как не управляемый, однако ты им не гнушаеся :)

Думал есть решение в одну строчку =)
Ну да, а это не в одну?
CopyMemory(DesrPtr, Marshal.UnsafeAddrOfPinnedArrayElement(CVertex, 0), CVertex.Length * Marshal.SizeOf(CVertex(0)))
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Re: Наследование COM интерфейсов

Сообщение Mikle » 13.10.2009 (Вт) 10:09

Nord777 писал(а):Managed DirectX - это всего лишь обёртка над DirectX.
И это не разные DirectX`ы

Эта обёртка не установлена по умолчанию, и, если в WinXP это решается с помощью "DXSetup /installmanageddx", то в Висте и "семёрке" это не прокатывает. Можно, конечно, вручную вскрыть ManagedDX.CAB из состава DirectX9.0c, тогда MDX ставится и на Висту, и на "семёрку", но насколько это легально? Да и советовать такой геморрой всем пользователям своей программы тоже не интересно.


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

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

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

    TopList