真正彻底 实现vc6下 activex dll 的xp风格(theme) 的方法。

来源:互联网 发布:php cookie模拟登录 编辑:程序博客网 时间:2024/05/16 03:09

网上基于vc6.0的activex增加 xp 风格(theme)都不起作用(其实已经实现了,只是大多数程序都是用mfc的创建用户控件函数所以还是不起作用),

如何定义XP风格的文章很多,可参见http://blog.csdn.net/greenerycn/article/details/3150247,但是纯粹采用这个办法采用MFC的Activex或者DLL项目根本就没有反应。原因如下:

原来是因为定义了#define ISOLATION_AWARE_ENABLED 1关键字后,所有的创建函数转到WinBase.Inl中,

通过 application and hosted component来实现,但是mfc中的实现并没有转

,所以只要在调用前稍作修改就能真正实现vc6的 activex控件xp风格了。

所以通过这个方法,用vc6编写的activex IE插件 动态库等应该都能实现xp风格了。

 

关键代码:

 

BOOL fResult = FALSE;

    ULONG_PTR  ulpCookie = 0;

    const BOOL fActivateActCtxSuccess = IsolationAwarePrivateG_FqbjaLEiEL || IsolationAwarePrivatenCgIiAgEzlnCgpgk(&ulpCookie);

    if (!fActivateActCtxSuccess)

        return fResult;

    __try

    {

        //fResult = GetClassInfoExW(unnamed1,unnamed2,unnamed3);

CRect rect(0,0,200,20);

button.Create("test",WS_VISIBLE,rect,this,12);   //这里是真正的mfc创建控件的调用

    }

    __finally

    {

        if (!IsolationAwarePrivateG_FqbjaLEiEL)

        {

            const BOOL fPreserveLastError = (fResult == FALSE);

            const DWORD dwLastError = fPreserveLastError ? GetLastError() : NO_ERROR;

            (void)IsolationAwareDeactivateActCtx(0, ulpCookie);

            if (fPreserveLastError)

                SetLastError(dwLastError);

        }

    }

    return fResult;

 

 

朋友做的封装,可以参考:

class CXP

{

public:

CXP() {

m_ulpCookie = 0;

m_bCtxSuccess = IsolationAwarePrivateG_FqbjaLEiEL || IsolationAwarePrivatenCgIiAgEzlnCgpgk(&m_ulpCookie);

}

virtual ~CXP() {

if(m_bCtxSuccess) IsolationAwareDeactivateActCtx(0, m_ulpCookie);

}

 

ULONG_PTR  m_ulpCookie;

BOOL m_bCtxSuccess;

};

CDlg_Test dlg;

{

  CXP XP;

  if(dlg.DoModal()==IDCANCEL) return FALSE;

}

 

原创粉丝点击