Все оказалось проще.
Переустановка VB5 решила проблему, до переустановки неработал только D3DX. Так что зря я напряг высокое общество таким пустяком

.
Но у меня была еще одна родственная проблема.
Вот простейший код, использующий рендер в текстуру:
- Код: Выделить всё
Option Explicit
Dim dx As New DirectX8
Dim d3d As Direct3D8
Dim d3dDevice As Direct3DDevice8
Dim MainC As Direct3DSurface8
Dim TexRT As Direct3DTexture8
Dim NewC As Direct3DSurface8
Dim Running As Boolean
Private Sub InitD3D()
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS
Set d3d = dx.Direct3DCreate
d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode
d3dpp.Windowed = True
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
d3dpp.BackBufferFormat = DispMode.Format
Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
Set MainC = d3dDevice.GetRenderTarget
Set TexRT = d3dDevice.CreateTexture(128, 128, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT)
Set NewC = TexRT.GetSurfaceLevel(0)
End Sub
Private Sub Render()
d3dDevice.SetRenderTarget NewC, Nothing, 0
d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
d3dDevice.SetRenderTarget MainC, Nothing, 0
d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub
Private Sub Form_Load()
' On Local Error Resume Next
Me.Show
InitD3D
Running = True
Do While DoEvents
Render
Loop
Set MainC = Nothing
Set NewC = Nothing
Set TexRT = Nothing
Set d3dDevice = Nothing
Set d3d = Nothing
Set dx = Nothing
End Sub
Он работает в среде VB, работает, если скомпилировать в P-code, но не работает в Native Code. Иногда выдается ошибка "Object Variable or With Block not set", но чаще просто "Программа выполнила недопустимую операцию..."
Ошибка явно происходит в процедуре Render, по крайней мере если ее заремить - все работает. Но введение "On Local Error Resume Next" в эту процедуру не спасает, зато спасает, если ввести это в Form_Load, где ошибки быть просто не может.