我已经花了一整天来解决这个问题,但还没有运气。在我的项目中,我在 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
谢谢!
答案 0 :(得分:0)
从Visual Studio 6升级到2005时,我发现了一个类似的问题。修复是在窗口类名中包含版本号,所以在我的情况下它看起来像这样:
hwndControl = ::CreateWindow("AtlAxWin80", ...);
因此,使用Visual Studio 2003,您可能会发现:
hwndControl = ::CreateWindow("AtlAxWin71", ...);
作品。
(在更基础的层面上,你打电话给AtlAxWinInit()
吗?)
答案 1 :(得分:0)
请添加以下代码(来自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,直到您需要该功能。