到 ATL 的静态链接总是失败

Posted

技术标签:

【中文标题】到 ATL 的静态链接总是失败【英文标题】:Static link to ATL always fails 【发布时间】:2012-12-19 16:26:31 【问题描述】:

我使用一些 ATL 函数来创建一个媒体控件,但似乎我只能使用动态链接到 ATL 选项。当我切换到 ATL 的静态链接时,我无法成功创建控件。

我很困惑。谁能帮帮我?

这是我的代码:

//related headers
#include <wmp.h>
#include <atlbase.h>
#include <atlcom.h>
#include <atlhost.h>
#include <atlctl.h>

//related vars
CAxWindow  m_wndView;  // ActiveX host window class.    CComPtr<IWMPPlayer>  
m_spWMPPlayer;  // Smart pointer to IWMPPlayer interface.

//related function code:
CComPtr<IAxWinHostWindow>  spHost;
HRESULT  hr;
m_wndView.Create(m_hWnd, rect, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
hr = m_wndView.QueryHost(&spHost);
/*
when I switch to "Static Link to ATL" option, I will fail here
E_FAIL == hr;//the failure flag
*/
if(!SUCCEEDED(hr)) return FALSE;

hr = spHost->CreateControl(CComBSTR(_T("6BF52A52-394A-11d3-B153-00C04F79FAA6")), m_wndView, 0);
if(!SUCCEEDED(hr)) return FALSE;

hr = m_wndView.QueryControl(&m_spWMPPlayer);
if(!SUCCEEDED(hr)) return FALSE;

【问题讨论】:

S_FAIL == hr;//失败标志 没有S_FAIL 这样的东西。可能是E_FAIL 【参考方案1】:

当静态链接到 ATL 时,你必须使用预处理器:_ATL_DLL,

您可以在此处进行设置:属性页 | C/C++ |预处理器

【讨论】:

以上是关于到 ATL 的静态链接总是失败的主要内容,如果未能解决你的问题,请参考以下文章

xcode加载静态链接库.a文件总是失败

g++ 尝试(失败)静态链接到 libstdc++ 以获取共享对象

由于架构不匹配,将静态库从 Xcode 链接到 Lazarus 应用程序失败

如何链接到静态库?

Shell 扩展:C/C++ 运行时 DLL 的静态链接与动态链接

将静态本机库链接到托管 C++ 项目会在