在windows7平台下chrome 加载ATL控件报错,经调试发现在ATL控件中创建一个从CWindowImpl派生的窗口时报错,具体代码是这一行  pFrame->Create(hWnd,CRect(0, 0, width , height), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN |WS_CLIPSIBLINGS)  (其中pFrame 是从CWindowImpl派生的类的指针,已经被初始化) 跟踪进去发现是 这里报错
HWND hWnd = ::CreateWindowEx(dwExStyle, (LPCTSTR)MAKELONG(atom, 0), szWindowName,
dwStyle, rcPos.left, rcPos.top, rcPos.right - rcPos.left,
rcPos.bottom - rcPos.top, hWndParent, (HMENU)nID,
_Module.GetModuleInstance(), lpCreateParam);
(这个是ATL的代码),再跟踪发现是这里报错:
template <class TBase, class TWinTraits>
LRESULT CALLBACK CWindowImplBaseT< TBase, TWinTraits >::StartWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CWindowImplBaseT< TBase, TWinTraits >* pThis = (CWindowImplBaseT< TBase, TWinTraits >*)_Module.ExtractCreateWndData();
ATLASSERT(pThis != NULL);
pThis->m_hWnd = hWnd;
pThis->m_thunk.Init(pThis->GetWindowProc(), pThis);
WNDPROC pProc = (WNDPROC)&(pThis->m_thunk.thunk);
WNDPROC pOldProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);
#ifdef _DEBUG
// check if somebody has subclassed us already since we discard it
if(pOldProc != StartWindowProc)
ATLTRACE2(atlTraceWindowing, 0, _T("Subclassing through a hook discarded.\n"));
#else
pOldProc; // avoid unused warning
#endif
return pProc(hWnd, uMsg, wParam, lParam);}
 最终是在红色哪里报错,返回的错误代码 "0xC0000005: Access Violation" 
这个在XP和2003下都没有报错。不知道DX们有没有出现这样的问题,怎么解决呢。。

解决方案 »

  1.   

    我试过在WINDOS7下创建ATL窗口没问题的,但现在是这个窗口在DLL里创建的并且被CHROME浏览器加载,倒低问题出在哪呢。
    各位DX们出出招吧。。
    这个问题都纠结我三天了。
      

  2.   

    如果是windos7,请确保你有足够的权限可以执行,否则会出现此问题,你试试用administrator权限运行,有问题我们再交流!!
      

  3.   

    先排除UAC问题,如上exe 右键 -》 run as Administrator试试
      

  4.   

    ATL控件并不依赖哪些DLL,本身就是被CHROME加载的。。
    根据返回的错误代码应该是ATL内部调用的默认窗口过程地址不能被访问,可能是VC6自带的ATL库的BUG。
    但是问题应该怎么解决呢,有没有人能提供些chrome里加载ATL控件的例子。。
      

  5.   

    建议看这篇文章:http://blogs.msdn.com/b/ed_maurer/archive/2007/12/14/nxcompat-and-the-c-compiler.aspx.
    估计是类似问题.