I translated the DDraw.h from WM6 but I always fail on create surface,
even example from WM SDK still fail while creating surface.(I deploy the example in VS)
But the example from here can use directdraw on both emulator and my HTC Touch.
http://www.codeproject.com/KB/mobile/Caleidoscope.aspx

my direct draw code:

Code:
var
  Form1    : TForm1;
  m_pdd    :  IDirectDraw;
  m_ddsd   : TDDSURFACEDESC ;
  m_psurf  : IDirectDrawSurface ;
  m_psurf2  : IDirectDrawSurface ;
  m_cbpp : DWORD;
  m_xpitch : longint;
  m_ypitch : longint;
  m_framebufwidth : DWORD;
  m_framebufheight : DWORD;
  aimage : TPicture;    

...

procedure TForm1.FormCreate(Sender: TObject);
Var mResult : HResult;
begin
mResult := DirectDrawCreate(nil,m_pdd ,nil);
  if mResult <> DD_OK then exit;

mResult &#58;= m_pdd.SetCooperativeLevel&#40;Handle,DDSCL_FULLSCREEN&#41;;
  if mResult <> DD_OK then
    begin
    m_pdd._Release;
    m_pdd &#58;= nil;
    exit;
    end;

m_psurf &#58;= nil;
end;   

...

procedure TForm1.FormClose&#40;Sender&#58; TObject; var CloseAction&#58; TCloseAction&#41;;
begin
try
    m_psurf._Release;
    m_psurf &#58;= nil;
    m_pdd._Release;
    m_pdd &#58;= nil;
  except
  end;
end; 
...

procedure TForm1.Timer1Timer&#40;Sender&#58; TObject&#41;;
var DF&#58; TDDBltFX;
    mResult &#58; HResult;
    pbuf &#58; pwidechar;
    buf &#58; array &#91;0 .. 255&#93; of widechar;
    mhdc &#58; HDC;
begin
if  m_psurf = nil then
begin
ZeroMemory&#40;@m_ddsd, sizeof&#40;m_ddsd&#41;&#41;;
m_ddsd.dwSize&#58;= sizeof&#40;m_ddsd&#41;;
m_ddsd.dwFlags&#58;=DDSD_CAPS or DDSD_PIXELFORMAT;
m_ddsd.ddsCaps.dwCaps&#58;= DDSCAPS_PRIMARYSURFACE ;
m_ddsd.ddpfPixelFormat.dwSize&#58;= sizeof&#40;DDPIXELFORMAT&#41;;
m_ddsd.ddpfPixelFormat.dwFlags&#58;=DDPF_RGB;



mResult &#58;= m_pdd.CreateSurface&#40;m_ddsd, m_psurf2,nil&#41;; //<----Always Fail Here
  if mResult <> DD_OK then
    begin
    timer1.Enabled&#58;=false;   
    m_pdd._Release;
    m_pdd &#58;= nil;
    exit;
    end;


//load image from file
pbuf &#58;= pwidechar&#40;buf&#41;;
GetModuleFileName&#40;null,pbuf,255&#41;;
aimage.LoadFromFile&#40;buf1+'tmp.jpg'&#41;;



ZeroMemory&#40;@m_ddsd, sizeof&#40;m_ddsd&#41;&#41;;
m_ddsd.dwSize&#58;= sizeof&#40;m_ddsd&#41;;
mResult &#58;= m_psurf.Lock&#40;nil,m_ddsd,DDLOCK_WAITNOTBUSY, 0&#41;;
if mResult <> DD_OK then
    begin
    m_psurf._Release;
    m_psurf &#58;= nil;
    m_pdd._Release;
    m_pdd &#58;= nil;
    exit;
    end;

 m_cbpp       &#58;=m_ddsd.ddpfPixelFormat.dwRGBBitCount;
 m_xpitch     &#58;=m_ddsd.lXPitch;
 m_ypitch     &#58;=m_ddsd.lPitch;
 m_framebufwidth  &#58;=m_ddsd.dwWidth;
 m_framebufheight &#58;=m_ddsd.dwHeight;

m_psurf.GetDC&#40;mHDC&#41;;
BitBlt&#40;mHDC,0,0,320,240,aimage.Bitmap.Canvas.Handle,0, 0, SRCCOPY&#41;;
m_psurf.ReleaseDC&#40;mHDC&#41;;

m_psurf.Unlock&#40;nil&#41;;
end;


m_ddsd.dwSize &#58;= sizeof&#40;m_ddsd&#41;;

mResult &#58;= m_psurf.Lock&#40;nil,m_ddsd,DDLOCK_WAITNOTBUSY, 0&#41;;
  if mResult <> DD_OK then
    begin
    m_psurf._Release;
    m_psurf &#58;= nil;
    m_pdd._Release;
    m_pdd &#58;= nil;
    exit;
    end;
//fill 0! clear scr
//DF.dwsize &#58;= SizeOf&#40;DF&#41;;
//DF.dwFillColor &#58;= 0;

//m_psurf.Blt&#40;srcrect,nil,destrect,DDBLT_COLORFILL or DDBLT_WAITNOTBUSY, DF&#41;;

//DF.dwROP&#58;= SRCCOPY;
//m_psurf.Blt&#40;srcrect,m_psurf2,destrect,DDBLT_ROP,DF&#41;;

m_psurf.Unlock&#40;nil&#41;;


end;