ошибка: «CAtlServiceModuleT»: не является членом «ATL»

Правильное построение проекта C++/ATL: я пытаюсь использовать свой код MFC в проекте ATL (Service EXE). В котором я включил все свои Existing Items. Когда я настроил проект на Use MFC in a Shared DLL, во время отладки у меня появилось это сообщение об ошибке:

ошибка C2039: «CAtlServiceModuleT»: не является членом «ATL».

И отладчик подчеркнул отмеченную строку:

class CATLProject6Module : public ATL::CAtlServiceModuleT< CATLProject6Module, IDS_SERVICENAME > //this one
{
public :
    DECLARE_LIBID(LIBID_ATLProject6Lib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_ATLPROJECT6, "{3A7F25E3-CA7E-4C90-8B37-11DA70E42248}")
        HRESULT InitializeSecurity() throw()
    {
        // TODO : Call CoInitializeSecurity and provide the appropriate security settings for your service
        // Suggested - PKT Level Authentication, 
        // Impersonation Level of RPC_C_IMP_LEVEL_IDENTIFY 
        // and an appropriate Non NULL Security Descriptor.

        return S_OK;
    }
    };

CATLProject6Module _AtlModule;

Как мне это исправить, пожалуйста?

Вы можете найти здесь мой stdafx.h :

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently

#if !defined(AFX_STDAFX_H__91E578F6_59F0_4867_BDE7_FCC229588C74__INCLUDED_)
#define AFX_STDAFX_H__91E578F6_59F0_4867_BDE7_FCC229588C74__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers

#define _WIN32_WINNT 0x0502 //so that I can use ReadDirectoryChanges

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdtctl.h>       // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>         // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__91E578F6_59F0_4867_BDE7_FCC229588C74__INCLUDED_)


#ifndef STRICT
    #define STRICT
#endif

#include "targetver.h"

#define _ATL_FREE_THREADED

#define _ATL_NO_AUTOMATIC_NAMESPACE

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS  // some CString constructors will be explicit


#define ATL_NO_ASSERT_ON_DESTROY_NONEXISTENT_WINDOW

#include "resource.h"
#include <atlbase.h>
#include <atlcom.h>
#include <atlctl.h>

Большое спасибо !!


person Lucie kulza    schedule 11.02.2014    source источник


Ответы (1)


Основная проблема заключается в том, что вы смешиваете две похожие вещи с разными концепциями.

MFC и ATL предоставляют возможность базовым классам поддерживать внутренние функции программы (цикл сообщений, регистрация и т. д.).

Если вы сначала включаете заголовки MFC, классы для модулей (включая шаблон CAtlServiceModuleT) исключаются. Вы видите #ifndef _AFX в файлах заголовков.

Вы можете сначала решить эту проблему, включив заголовки atl. Но вам нужно #undef WINDOWS перед включением заголовка afx.h. Но это взлом!

Возможно, лучше использовать структуру MFC в качестве базовых классов. Причина проста: большинство ретрансляторов MFC существующего CWinApp... так что вам это нужно. Но когда вы используете это, вам больше не нужен CAtlServiceModuleT!

person xMRi    schedule 13.02.2014
comment
Спасибо за ответ, интересно узнать. Не могли бы вы сказать мне, почему это hack ? - person Lucie kulza; 14.02.2014
comment
Это хак, потому что заголовки MFC включают заголовок Windows по умолчанию. Теперь заголовок включается дважды, потому что защита не определена. Лучше всего было бы использовать MFC в качестве основного экземпляра и включить в него части ATL. Как я уже писал: MFC работает только с CWinApp. Так что вам это нужно. Итак, почему вы должны использовать модуль ATL? - person xMRi; 15.02.2014
comment
Мне нужно запустить приложение как службу и оптимизировать использование оперативной памяти. - person Lucie kulza; 16.02.2014
comment
И зачем вам MFC Framework И ATL Framework. Если это служба, вы можете найти фреймворки для нее по адресу naughter.com/serv.html. Я не понимаю, зачем вам все это смешивать? - person xMRi; 16.02.2014
comment
в случае, если я изменю порядок и сначала включу atl, я получаю E0266 'CString' неоднозначно, как мне это решить? - person Daniel W.; 19.11.2018