会DirectX的请帮个很容易的忙(200分)

  • 主题发起人 主题发起人 Scrate
  • 开始时间 开始时间
S

Scrate

Unregistered / Unconfirmed
GUEST, unregistred user!
下面一段代码:
procedure TForm1.Button1Click(Sender: TObject);
var
dx:IDirectDraw;
sf:IDirectDrawSurface;
ddrval:HRESULT;
ddsd:TDDSurfaceDesc;
begin

ddrval:=DirectDrawCreate(nil, dx,nil);
ddrval:= dx.Setcooperativelevel(Handle,ddscl_normal);
ddrval:= dx.SetDisplayMode(640,480,16);

ZeroMemory(@ddsd, sizeof(ddsd));
ddsd.dwsize := sizeof(ddsd);
ddsd.dwflags := ddsd_caps;
ddsd.ddscaps.dwcaps :=DDSCAPS_PRIMARYSURFACE;
ddrval:= dx.createsurface(ddsd, sf, nil);
end;


运行时没事,退出程序时出错,提示"EAccessViolation"错误
请问这是为什么?该怎么办
 
"EAccessViolation"错误应该是引发Kernel32.dll or User32.dll错误?!

{$IFDEF DELPHI_1}
EAccessViolation = class(Exception);
{$ENDIF}

应该是访问了未分配或者受保护的物理存储器空间的数据所致!你是用什么操作系统?
 
如在WinNT下有两个64kB空间保留在其顶和底部,而其中最底的4kB是一个无指针指向的空间。
如果对其访问将产生进入EAccessViolation异常。
所以应该很小心的保证每个指针在它的计划界限内,以免出现0或者无效指针。
你可以先用VirtualAlloc()函数申请自己的空间,这样就可以避免上面的非法访问情况!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=674354
 
刚刚又好好看了一遍你的代码,实在是“如此脆弱的代码”啊!^_^
首先几个地方没有进行判断就调用,没运行出错已是万幸!
如:ddrval:= dx.createsurface(ddsd, sf, nil);
一句应该改为
If dx.createsurface(ddsd, sf, nil) <> DD_OK then
Exit else
...
同样对于SetDisplayMode及SetCooperativeLevel过程都应该这么做!

至于运行时没事,退出程序时出错,提示"EAccessViolation"错误。能否贴点代码出来!
比如如何退出?如何释放资源的(如 Buffer)?
你可以参考示例如下,当然以下代码中有些你可能根本没用到,希望对你有所帮助!
dx.RestoreDisplayMode;
//恢复显示模式
ShowCursor(True);
//恢复鼠标
Buffer:=nil;
//释放Buffer
sf:=nil;
//释放IDirectDrawSurface对象
dx:=nil;
//释放IDirectDraw对象
YourForm.Release;
//释放窗体
 
唉呀,实在脆弱,没有任何错误判断。
生成表面参数要齐全
看看我的一个最基本的例子吧。希望对你有些帮助(没有夸耀之意)
http://go.163.com/progame/mytest.html
 
高手就是高手怎么还不开个DIRECTX的栏目?
[:(!]
 
多人接受答案了。
 
后退
顶部