GetDC will crash
Posted: Thu Dec 31, 2009 12:17 am
hello coders,
first sorry about my bad English
every time i call GetDC the program will crash
same if i use the DC from desktop (0=NULL)
thank you for any hint
(how to use code tags in this forum?)
Joshy
[code]onst PFD_TYPE_RGBA = 0
const PFD_TYPE_COLORINDEX = 1
const PFD_MAIN_PLANE = 0
const PFD_OVERLAY_PLANE = 1
const PFD_UNDERLAY_PLANE = -1
const PFD_DOUBLEBUFFER = 1
const PFD_STEREO = 2
const PFD_DRAW_TO_WINDOW = 4
const PFD_DRAW_TO_BITMAP = 8
const PFD_SUPPORT_GDI = 16
const PFD_SUPPORT_OPENGL = 32
const PFD_GENERIC_FORMAT = 64
const PFD_NEED_PALETTE = 128
const PFD_NEED_SYSTEM_PALETTE = 256
const PFD_SWAP_EXCHANGE = 512
const PFD_SWAP_COPY = 1024
const PFD_SWAP_LAYER_BUFFERS = 2048
const PFD_GENERIC_ACCELERATED = 4096
const PFD_DEPTH_DONTCARE = &H20000000
const PFD_DOUBLEBUFFER_DONTCARE = &H40000000
const PFD_STEREO_DONTCARE = &H80000000
const pSize =1
const pVersion=3
const pFlags=5
const pPixelType=9
const pColorBits=10
const pRedBits=11
const pRedShift=12
const pGreenBits=13
const pGreenShift=14
const pBlueBits=15
const pBlueShift=16
const pAlphaBits=17
const pAlphaShift=18
const pAccumBits=19
const pAccumRedBits=20
const pAccumGreenBits=21
const pAccumBlueBits=22
const pAccumAlphaBits=23
const pDepthBits=24
const pStencilBits=25
const pAuxBuffers=26
const pLayerType=27
const pReserved=28
const pLayerMask=29
const pVisibleMask=33
const pDamageMask=36
function MakePixelFormat (Bits as integer, Depth as integer, Stencil as integer,Accum as integer ) as string
dim s as string
s=string$(0,40 )
mid$ s,pSize=mkw$(40 )
mid$ s,pVersion=mkw$(1)
mid$ s,pFlags=mki$(PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER)
mid$ s,pPixelType=chr$(PFD_TYPE_RGBA)
mid$ s,pColorBits=chr$(Bits)
mid$ s,pDepthBits=chr$(Depth)
mid$ s,pStencilBits=chr$(Stencil)
mid$ s,pAccumBits=chr$(Accum)
result=s
end function
declare GetDC as "GetDC" of "gdi32.dll"
hWND as integer
result as integer
end declare
declare ReleaseDC as "ReleaseDC" of "gdi32.dll"
hWND as integer
hDC as integer
result as integer
end declare
declare ChoosePixelFormat as "ChoosePixelFormat" of "gdi32.dll"
hDC as integer
ppfd as string byaddress
result as integer
end declare
declare SetPixelFormat as "SetPixelFormat" of "gdi32.dll"
hDC as integer
iFormat as integer
ppfd as string byaddress
result as integer
end declare
declare wglCreateContext as "wglCreateContext" of "opengl32.dll"
hDC as INTEGER
result as INTEGER
end declare
declare wglDeleteContext as "wglDeleteContext" of "opengl32.dll"
hRC as INTEGER
result as INTEGER
end declare
declare wglMakeCurrent as "wglMakeCurrent" of "opengl32.dll"
hdc as integer
hrc as integer
result as integer
end declare
type RENDERDEVICE
dim PixelFormatDesc as string
dim hWnd as integer
dim hDC as integer
dim hRc as integer
dim iFormat as integer
end type
object window as FORM
Width=640
Height=480
Caption = "OpenGL with FNX Basic"
end object
`````LOADLIBRARY "gdi32.dll"
`````LOADLIBRARY "opengl32.dll"
dim MyDevice as RENDERDEVICE
Window.Show
print "create()"
Window.Show
MyDevice.hWND=Window.Hwnd
if MyDevice.hWND=0 then
ShowMessage "error: Create() hWND=NULL !"
end if
print "GetDC(" + str$(MyDevice.hWnd) + ")"
GetDC.hWnd=MyDevice.hWnd
GetDC
MyDevice.hDC=GetDC.Result
print "after GetDC"
if MyDevice.hDC=0 then
ShowMessage "error: GetDC() !"
end if
print "MakePixelFormat"
MyDevice.PixelFormatDesc=MakePixelFormat(16,16,0,0)
print "ChoosePixelFormat()"
ChoosePixelFormat.hDC=MyDevice.hDC
ChoosePixelFormat.pPFD=MyDevice.PixelFormatDesc
ChoosePixelFormat
MyDevice.iFormat=ChoosePixelFormat.Result
if MyDevice.iFormat=0 then
ShowMessage "error: ChoosePixelFormat() !"
ReleaseDC.hWnd=MyDevice.hWnd
ReleaseDC.hDC=MyDevice.hDC
ReleaseDC
MyDevice.hDC=0
MyDevice.hWND=0
end if
print "ok"
do
doevents
loop until window.visible=false
sleep(10000)
end[/code]
first sorry about my bad English
every time i call GetDC the program will crash
same if i use the DC from desktop (0=NULL)
thank you for any hint
(how to use code tags in this forum?)
Joshy
[code]onst PFD_TYPE_RGBA = 0
const PFD_TYPE_COLORINDEX = 1
const PFD_MAIN_PLANE = 0
const PFD_OVERLAY_PLANE = 1
const PFD_UNDERLAY_PLANE = -1
const PFD_DOUBLEBUFFER = 1
const PFD_STEREO = 2
const PFD_DRAW_TO_WINDOW = 4
const PFD_DRAW_TO_BITMAP = 8
const PFD_SUPPORT_GDI = 16
const PFD_SUPPORT_OPENGL = 32
const PFD_GENERIC_FORMAT = 64
const PFD_NEED_PALETTE = 128
const PFD_NEED_SYSTEM_PALETTE = 256
const PFD_SWAP_EXCHANGE = 512
const PFD_SWAP_COPY = 1024
const PFD_SWAP_LAYER_BUFFERS = 2048
const PFD_GENERIC_ACCELERATED = 4096
const PFD_DEPTH_DONTCARE = &H20000000
const PFD_DOUBLEBUFFER_DONTCARE = &H40000000
const PFD_STEREO_DONTCARE = &H80000000
const pSize =1
const pVersion=3
const pFlags=5
const pPixelType=9
const pColorBits=10
const pRedBits=11
const pRedShift=12
const pGreenBits=13
const pGreenShift=14
const pBlueBits=15
const pBlueShift=16
const pAlphaBits=17
const pAlphaShift=18
const pAccumBits=19
const pAccumRedBits=20
const pAccumGreenBits=21
const pAccumBlueBits=22
const pAccumAlphaBits=23
const pDepthBits=24
const pStencilBits=25
const pAuxBuffers=26
const pLayerType=27
const pReserved=28
const pLayerMask=29
const pVisibleMask=33
const pDamageMask=36
function MakePixelFormat (Bits as integer, Depth as integer, Stencil as integer,Accum as integer ) as string
dim s as string
s=string$(0,40 )
mid$ s,pSize=mkw$(40 )
mid$ s,pVersion=mkw$(1)
mid$ s,pFlags=mki$(PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER)
mid$ s,pPixelType=chr$(PFD_TYPE_RGBA)
mid$ s,pColorBits=chr$(Bits)
mid$ s,pDepthBits=chr$(Depth)
mid$ s,pStencilBits=chr$(Stencil)
mid$ s,pAccumBits=chr$(Accum)
result=s
end function
declare GetDC as "GetDC" of "gdi32.dll"
hWND as integer
result as integer
end declare
declare ReleaseDC as "ReleaseDC" of "gdi32.dll"
hWND as integer
hDC as integer
result as integer
end declare
declare ChoosePixelFormat as "ChoosePixelFormat" of "gdi32.dll"
hDC as integer
ppfd as string byaddress
result as integer
end declare
declare SetPixelFormat as "SetPixelFormat" of "gdi32.dll"
hDC as integer
iFormat as integer
ppfd as string byaddress
result as integer
end declare
declare wglCreateContext as "wglCreateContext" of "opengl32.dll"
hDC as INTEGER
result as INTEGER
end declare
declare wglDeleteContext as "wglDeleteContext" of "opengl32.dll"
hRC as INTEGER
result as INTEGER
end declare
declare wglMakeCurrent as "wglMakeCurrent" of "opengl32.dll"
hdc as integer
hrc as integer
result as integer
end declare
type RENDERDEVICE
dim PixelFormatDesc as string
dim hWnd as integer
dim hDC as integer
dim hRc as integer
dim iFormat as integer
end type
object window as FORM
Width=640
Height=480
Caption = "OpenGL with FNX Basic"
end object
`````LOADLIBRARY "gdi32.dll"
`````LOADLIBRARY "opengl32.dll"
dim MyDevice as RENDERDEVICE
Window.Show
print "create()"
Window.Show
MyDevice.hWND=Window.Hwnd
if MyDevice.hWND=0 then
ShowMessage "error: Create() hWND=NULL !"
end if
print "GetDC(" + str$(MyDevice.hWnd) + ")"
GetDC.hWnd=MyDevice.hWnd
GetDC
MyDevice.hDC=GetDC.Result
print "after GetDC"
if MyDevice.hDC=0 then
ShowMessage "error: GetDC() !"
end if
print "MakePixelFormat"
MyDevice.PixelFormatDesc=MakePixelFormat(16,16,0,0)
print "ChoosePixelFormat()"
ChoosePixelFormat.hDC=MyDevice.hDC
ChoosePixelFormat.pPFD=MyDevice.PixelFormatDesc
ChoosePixelFormat
MyDevice.iFormat=ChoosePixelFormat.Result
if MyDevice.iFormat=0 then
ShowMessage "error: ChoosePixelFormat() !"
ReleaseDC.hWnd=MyDevice.hWnd
ReleaseDC.hDC=MyDevice.hDC
ReleaseDC
MyDevice.hDC=0
MyDevice.hWND=0
end if
print "ok"
do
doevents
loop until window.visible=false
sleep(10000)
end[/code]