procedure GetPrimarySurface;
var
  ddsd:DDSURFACEDESC2;hr:HResult;
begin
  
  if g_lplpDD<>nil then 
  begin
    ZeroMemory(@ddsd,sizeof(DDSURFACEDESC));
    ddsd.dwSize:= sizeof( ddsd );
    ddsd.dwFlags:= DDSD_CAPS ;
    ddsd.ddsCaps.dwCaps:=DDSCAPS_PRIMARYSURFACE;
    hr:=g_lplpDD.EnumSurfaces( DDENUMSURFACES_MATCH, ddsd, nil, @EnumSurfacesProc);
    if hr=DD_OK then showmessage('GetPrimarySurface,DD_OK')
    else showmessage('GetPrimarySurface,Error:='+inttostr(hr)+';ox'+format('%x',[hr]))    
    showmessage(inttostr(hr-_MAKE_DDHRESULT));
  end;
end;为什么调用EnumSurfaces不成功,返回的hr=_MAKE_DDHRESULT + 100,根本就没进回调函数(在回调函数最前面加ShowMessage未被调用)
(*
 * One or more of the caps bits passed to the callback are incorrect.
 *)
  DDERR_INVALIDCAPS                       = HResult(_MAKE_DDHRESULT + 100);

解决方案 »

  1.   

    给完整的看。
    比如:g_lplpDD 是什么?我们都不知道,怎么调?
      

  2.   

    var
      g_lplpDD: IDirectDraw7;
    function MyDirectDrawCreateEx(lpGUID: PGUID; out lplpDD: IDirectDraw7;
                                  const iid: TGUID; pUnkOuter: IUnknown): HResult; stdcall;
    type
      TNewDirectDrawCreateEx=function(lpGUID: PGUID; out lplpDD: IDirectDraw7;
                                  const iid: TGUID; pUnkOuter: IUnknown): HResult; stdcall;
    begin
      //showmessage('MyDirectDrawCreateEx');
      Hook[2].UnHook;
      Result := TNewDirectDrawCreateEx(Hook[2].BaseAddr)(lpGUID, lplpDD, iid, pUnkOuter);
      Hook[2].Hook;
      if Result<>DD_OK then  Exit;
      Result:=lplpDD.QueryInterface(IID_IDirectDraw7,g_lplpDD);
      if Result<>S_OK then
      begin
        showmessage('QueryInterface failed!');
        Exit;
      end;
    end;
      

  3.   

    第一个参数是不是应该这样,DDENUMSURFACES_DOESEXIST or DDENUMSURFACES_MATCH,可以看看这里的帮助:http://msdn.microsoft.com/en-us/library/aa921423.aspx