1

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

我用谷歌搜索,发现这个页面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

谢谢!

4

3 回答 3

0

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

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

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

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

作品。

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

于 2009-08-13T08:13:09.287 回答
0

顺便说一句:似乎删除“多线程(/ 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 );
于 2009-08-13T08:16:14.540 回答
0

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

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

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

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

于 2009-08-13T16:22:33.753 回答