com事件需要C3702 atl

时间:2017-07-29 18:19:22

标签: c++ events mfc com atl

我正面临错误" 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() 也写在主要但未解决的

注释此行会更改错误性质但无解决方案: 的 // [event_receiver(COM)] 此行导致编译器错误C3731(不兼容的事件&#39; function1&#39;和处理程序&#39; function2&#39 ;;事件源和事件处理程序必须是同一类型)

.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社区版。

1 个答案:

答案 0 :(得分:0)

你解决问题的方法是正确的。必须定义_ATL_ATTRIBUTES。

但你是在改变代码之前在“stdafx.h”的#include

中做到的
#define _ATL_ATTRIBUTES 1
#pragma once
#include "stdafx.h"    

只要使用预编译头,就会忽略#include“stdafx.h”之前的所有语句。你必须在stdafx.h中做到这一点! (即使你写道,这不起作用,你没有告诉我们为什么......)