【问题标题】:Atl71.dll denpendency still exists even Static link to ATL is selected即使选择了指向 ATL 的静态链接,Atl71.dll 依赖仍然存在
【发布时间】:2010-11-19 05:35:12
【问题描述】:

我已经花了一整天的时间来解决这个问题,但还没有运气。在我的项目中,我在 General 属性页上将 Use of ATL 属性设置为 Static Link to ATL 并设置 Runtime库 属性到代码生成 属性页(C/C++ 文件夹)上的多线程(/MT)。但是 DependencyWalker 仍然显示 Atl71.dll 依赖关系。

我在 Google 上搜索并找到了这个页面 http://www.eggheadcafe.com/forumarchives/vcatl/Mar2006/post26077463.asp,并找到了在 atlbase.h 之后添加 atlwin.h 的解决方案。该解决方案确实有助于减少对 atl71.dll 的依赖。但是它引入了一个新问题,即 CreateWindow 不能正常工作..

  // Creates the Web Browser control and navigates to the 
  // specified web page.
  HWND hWnd = ::CreateWindow("AtlAxWin", "http://www.microsoft.com", 
     WS_CHILD|WS_VISIBLE, 10, 10, 500, 300, hParent, NULL,
     ::GetModuleHandle(NULL), NULL);

hwnd 为 NULL。

所以不能使用添加atlwin.h的解决方案,不知道有没有人遇到过类似的静态链接问题?如何解决?

环境:VS 2003 .Net

谢谢!

【问题讨论】:

    标签: c++ winapi activex atl static-libraries


    【解决方案1】:

    我在从 Visual Studio 6 升级到 2005 时发现了类似的问题。修复方法是在窗口类名称中包含版本号,所以在我的例子中它看起来像这样:

    hwndControl = ::CreateWindow("AtlAxWin80", ...);
    

    因此,使用 Visual Studio 2003,您可能会发现:

    hwndControl = ::CreateWindow("AtlAxWin71", ...);
    

    有效。

    (在更基本的层面上,你打电话给AtlAxWinInit()?)

    【讨论】:

    • 我把它改成了:#define ATLAXWIN_CLASS "AtlAxWin71" (def in atldef.h) hwnd = ::CreateWindow(_T(ATLAXWIN_CLASS), ...);问题仍然存在。 GetLastError 结果为 0 (ERROR_SUCCESS)。有什么想法吗?
    【解决方案2】:

    顺便说一句:删除“多线程 (/MT)”似乎是多余的,此选项与运行时有关,但与 ATL 无关。

    请添加以下代码(来自 msdn 示例)以发现 hwnd 为 NULL 的原因

        LPVOID lpMsgBuf;
    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        0, // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL 
    );
    
    // Display the string.
    MessageBox( NULL, (LPCTSTR)lpMsgBuf, LError, MB_OK | MB_ICONINFORMATION );
    // Free the buffer.
    LocalFree( lpMsgBuf );
    

    【讨论】:

    • GetLastError() 的返回值为 0 = ERROR_SUCCESS。所以 CreateWindow 是成功的。但是 hwnd = 0x00000000
    • 在这种情况下,请检查您的窗口 proc 并确保您在 WM_CREATE、WM_NCCREATE 等期间没有做任何愚蠢的事情,包括在您应该传递给 DefWindowProc 时没有做任何事情。
    • 抱歉,执行 CreateWIdow 后输出有一些错误。我刚找到它。这里是:DlgStatic.exe 中 0x004a6ebc 的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。 “microsoft.com”的控件创建失败错误代码:0x8007000e - 没有足够的存储空间来完成此操作。添加 atlwin.h 后会出现此错误。没有它,除了 ATL71.DLL 问题,它工作正常
    【解决方案3】:

    CreateWindow 调用的替代方法是 AtlAxCreateControl。但是,据我所知,如果您使用它,您仍然会带来对 atl71.dll 的依赖。

    如果您想托管 Web 浏览器并且不能依赖 atl71.dll,您可能需要自己编写胶水代码。基本托管并不难——它应该比你花在这上面的时间少。然后你也有更多的控制权。

    这是一个示例:http://support.microsoft.com/default.aspx/kb/196339/en-us

    您只需要其中的一小部分,主要是 CWBExplorerBar::SetSite 中的逻辑加上实现 OLE 接口的子集,其中大部分可以返回 E_NOTIMPL,直到您需要该功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多