【发布时间】:2018-01-05 15:36:06
【问题描述】:
我在源代码中面临错误“com 事件需要 C3702 atl”,但没有任何帮助我解决这个问题。
在 stafx.h 或 .h 文件中包含这些标头不起作用:
#include <comdef.h>
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
在 stdafx.h 或 .h 文件中评论和取消评论这一行确实有效: //使用命名空间 ATL;
在 stdafx.h 或 .h 文件中添加以下行不起作用: #define _ATL_ATTRIBUTES 1
在 MFC 中添加 ATL 支持也不适合我。
CoInitialize(NULL)和CoUninitialize()也写在main里但是没解决 p>
评论此行会改变错误性质但没有解决方案: //[event_receiver(com)] 此行导致编译器错误 C3731(不兼容的事件 'function1' 和处理程序 'function2';事件源和事件处理程序必须是同一类型)
.H 文件
#define _ATL_ATTRIBUTES 1
#pragma once
#include "stdafx.h"
[event_receiver(com)]
class CMainDlg
{
public:
CMainDlg() {};
~CMainDlg() {};
public:
bool OnCallStart();
HRESULT AbtoPhone_OnInitialized(BSTR Msg);
void HookPhoneEvents(IAbtoPhone* pSource);
void UnHookPhoneEvents(IAbtoPhone* pSource);
};//CMainDlg
CPP 文件
#include "stdafx.h"
#include "MainDlg.h"
bool CMainDlg::OnCallStart()
{
HRESULT hr = m_AbtoPhone.CreateInstance(__uuidof(CAbtoPhone));
if (FAILED(hr))
{
AfxMessageBox(_T("Can't load CAbtoPhone component.\nCheck is registered 'SIPVoIPSDK.dll'"));
}
HookPhoneEvents(m_AbtoPhone);
return true;
}
void CMainDlg::HookPhoneEvents(IAbtoPhone* pSource)
{
__hook(&_IAbtoPhoneEvents::OnInitialized, pSource, &CMainDlg::AbtoPhone_OnInitialized);
}
void CMainDlg::UnHookPhoneEvents(IAbtoPhone* pSource)
{
__unhook(pSource);
}
HRESULT CMainDlg::AbtoPhone_OnInitialized(BSTR Msg)
{
return S_OK;
}
我正在使用 Microsoft Visual Studio 2017 社区版。
【问题讨论】:
-
您的示例与您(令人钦佩地)尝试过的事情列表相比处于不清楚的状态。例如,此代码中的 _ATL_ATTRIBUTES 设置是 a) 错误和 b) 与您所说的尝试不同。我会查看 Microsoft 为 COM 事件提供的小示例代码,然后再从那里返回以了解您的不同之处。减少您自己的示例代码,直到您只有事件处理程序,这样比较容易。 msdn.microsoft.com/en-us/library/hdcxwbd5.aspx