关于MFC中SelectObject的纳闷,求解惑

关于MFC中SelectObject的困惑,求解惑。
使用SelectObject会见到一下几种使用方式:

CPen WhitePen(PS_SOLID,0,RGB(255,255,255)); 
CPen*   pOldPen;
pOldPen= dc.SelectObject(&WhitePen);
dc.SelectObject(pOldPen);
WhitePen.DeleteObject();



CPen WhitePen(PS_SOLID,0,RGB(255,255,255)); 
HPEN  pOldPen;
pOldPen= (HPEN)dc.SelectObject(&WhitePen);
dc.SelectObject(pOldPen);
WhitePen.DeleteObject();



CPen WhitePen(PS_SOLID,0,RGB(255,255,255)); 
HPEN    pOldPen;
pOldPen=  (HPEN)dc.SelectObject(WhitePen);
dc.SelectObject(pOldPen);
WhitePen.DeleteObject();


我困惑的问题:
1、这三种方式是否都正确?
2、这三种方式有什么区别?如果没有的话 为什么会有这三种方式?
3、是否有某一种或多种存在内存泄露的风险?

还有一个问题是连续使用SelectObject的情况是否会产生内存泄露 代码如下:

CPen WhitePen(PS_SOLID,0,RGB(255,255,255)); 
CPen GrayPen(PS_SOLID,0,RGB(50,50,50));
CPen*   pOldPen;
pOldPen= dc.SelectObject(&WhitePen);
dc.SelectObject(&GrayPen);
dc.SelectObject(pOldPen);
GrayPen.DeleteObject();
WhitePen.DeleteObject();


望牛人们给解答一下 谢谢。
------解决方案--------------------
你知道为什么插排上既有三角插座,也有两脚插座吗?并不是功能有什么不同,而是可以用在不同的场合下。
对应到函数,那么就是为了适应不同的接口,方便外部调用,内部处理没有什么区别。
如果你有一个HPEN对象,那么你可以直接用SelectObject选入;如果你有一个CPen对象,也可以直接用SelectObject选入。
好处就是我不需要用一个HPEN对象,先生成一个CPen对象后再调用SelectObject了。
麻烦了自己,方便了别人。

连续调用SelectObject,只要你的句柄对象不丢失或被改变,及时释放就没有什么问题。
------解决方案--------------------
你第二、第三种方式中的pOldPen是什么类型?
还是CPen*么?
编译不抱错?