即使选择了到ATL的静态链接,Atl71.dll依赖仍然存在

时间:2009-08-13 08:07:00

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

我已经花了一整天来解决这个问题,但还没有运气。在我的项目中,我在 Genera l属性页面上将使用ATL 属性设置为静态链接到ATL 并设置运行时代码生成属性页(C / C ++文件夹)上的库属性为多线程(/ MT)。但是DependencyWalker仍然显示Atl71.dll依赖。

我用Google搜索并在 atlbase.h 之后找到了这个页面http://www.eggheadcafe.com/forumarchives/vcatl/Mar2006/post26077463.asp并添加 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

谢谢!

3 个答案:

答案 0 :(得分:0)

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

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

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

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

作品。

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

答案 1 :(得分:0)

BTW:似乎删除“多线程(/ 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 );

答案 2 :(得分:0)

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

如果您想托管Web浏览器并且无法依赖atl71.dll,您可能需要自己编写粘合代码。基本托管并不是很困难 - 它应该花费不到你花在这上面的那一天。你也可以有更多的控制权。

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

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