2013-10-08 4 views
1

DirectShow 기반 실시간 스트리밍 플레이어를 ActiveX 컨트롤로 쓰려고 할 때 문제가 발생했습니다.VS2010 IntelliSense 메시지 : CComPtr이 템플릿이 아닙니다.

먼저 VS2010 (VC++ 범주 아래), 으로 MFC ActiveX 컨트롤 프로젝트를 만들고 컨트롤에 대화 상자를 첨부 한 다음 간단한 html 페이지로 테스트했습니다.

29 IntelliSense: CComPtr is not a template (CIceBaseLivestreamPlayerCore.h, Line 37) 
30 IntelliSense: CComPtr is not a template (CIceBaseLivestreamPlayerCore.h, Line 38) 
31 IntelliSense: CComPtr is not a template (CIceBaseLivestreamPlayerCore.h, Line 44) 
32 IntelliSense: CComPtr is not a template (CIceBaseLivestreamPlayerCore.h, Line 44) 
33 IntelliSense: CComPtr is not a template (CIceBaseLivestreamPlayerCore.h, Line 47) 
34 IntelliSense: CComPtr is not a template (CIceBaseLivestreamPlayerCore.h, Line 48) 
35 IntelliSense: CComPtr is not a template (CIceBaseLivestreamPlayerCore.h, Line 49) 
36 IntelliSense: CComPtr is not a template (CIcePlayAndSaveAXCore.h, Line 19) 
37 IntelliSense: CComPtr is not a template (CIcePlayAndSaveAXCore.h, Line 20) 
38 IntelliSense: CComPtr is not a template (CIcePlayAndSaveAXCore.h, Line 21) 
39 IntelliSense: CComPtr is not a template (CIcePlayAndSaveAXCore.h, Line 22) 
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (CIceBaseLivestreamPlayerCore.h, Line 37) 
Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (CIceBaseLivestreamPlayerCore.h, Line 38) 
Error 14 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (CIcePlayAndSaveAXCore.h, Line 19) 
Error 17 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (CIcePlayAndSaveAXCore.h, Line 20) 
Error 20 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (CIcePlayAndSaveAXCore.h, Line 21) 
Error 23 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (CIcePlayAndSaveAXCore.h, Line 22) 
Error 25 error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_vInfTee' is not a base or member (CIcePlayAndSaveAXCore.h, Line 9) 
Error 27 error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_fileWriter' is not a base or member (CIcePlayAndSaveAXCore.h, Line 9) 
Error 28 error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_AVIMux' is not a base or member (CIcePlayAndSaveAXCore.h, Line 9) 
Error 26 error C2614: 'CIcePlayAndSaveAXCore' : illegal member initialization: 'm_aInfTee' is not a base or member (CIcePlayAndSaveAXCore.h, Line 9) 
Error 12 error C2614: 'CIceBaseLivestreamPlayerCore' : illegal member initialization: 'm_pGraph' is not a base or member (CIceBaseLivestreamPlayerCore.h, Line 18) 
Error 11 error C2614: 'CIceBaseLivestreamPlayerCore' : illegal member initialization: 'm_pControl' is not a base or member (CIceBaseLivestreamPlayerCore.h, Line 18) 
Error 3 error C2238: unexpected token(s) preceding ';' (CIceBaseLivestreamPlayerCore.h, Line 37) 
Error 6 error C2238: unexpected token(s) preceding ';' (CIceBaseLivestreamPlayerCore.h, Line 38) 
Error 15 error C2238: unexpected token(s) preceding ';' (CIcePlayAndSaveAXCore.h, Line 19) 
Error 18 error C2238: unexpected token(s) preceding ';' (CIcePlayAndSaveAXCore.h, Line 20) 
Error 21 error C2238: unexpected token(s) preceding ';' (CIcePlayAndSaveAXCore.h, Line 21) 
Error 24 error C2238: unexpected token(s) preceding ';' (CIcePlayAndSaveAXCore.h, Line 22) 
Error 1 error C2143: syntax error : missing ';' before '<' (CIceBaseLivestreamPlayerCore.h, Line 37) 
Error 4 error C2143: syntax error : missing ';' before '<' (CIceBaseLivestreamPlayerCore.h, Line 38) 
Error 13 error C2143: syntax error : missing ';' before '<' (CIcePlayAndSaveAXCore.h, Line 19) 
Error 16 error C2143: syntax error : missing ';' before '<' (CIcePlayAndSaveAXCore.h, Line 20) 
Error 19 error C2143: syntax error : missing ';' before '<' (CIcePlayAndSaveAXCore.h, Line 21) 
Error 22 error C2143: syntax error : missing ';' before '<' (CIcePlayAndSaveAXCore.h, Line 22) 
Error 7 error C2061: syntax error : identifier 'CComPtr' (CIceBaseLivestreamPlayerCore.h, Line 44) 
Error 8 error C2061: syntax error : identifier 'CComPtr' (CIceBaseLivestreamPlayerCore.h, Line 47) 
Error 9 error C2061: syntax error : identifier 'CComPtr' (CIceBaseLivestreamPlayerCore.h, Line 48) 
Error 10 error C2061: syntax error : identifier 'CComPtr' (CIceBaseLivestreamPlayerCore.h, Line 49) 

그리고 (나는 또한 줄 번호와 파일을 첨부했습니다)

는 지금까지 잘 작동하지만, 내가 CComPtr와 일부 DirectShow를 코드를 추가하려고 할 때, 컴파일러는 다음과 같은 오류를 표시 이 모든 오류는 CComPtr에 이상한 것이 있다고 명시하는 것 같습니다. 하지만 무엇이 잘못되었는지 알 수 없습니다.

나는 다음과 같은 내 STDAFX.H의 바닥에 두 개의 헤더 파일을 추가 한

:

#include <streams.h> 
#include <atlbase.h> 

을 그리고 난 다음과 같이 내 CIceBaseLivestreamPlayerCore.h 및 CIcePlayAndSaveAXCore.h의 일부를 나열 할 수 있습니다, 모든 참여 위 오류의 행이 모두 포함됩니다.

CIceBaseLivestreamPlayerCore.h :

#pragma once 
#include "stdafx.h" 

class CIceBaseLivestreamPlayerCore 
{ 
... 
15 CIceBaseLivestreamPlayerCore(): 
16 ..., m_pGraph(NULL), m_pControl(NULL), 
17 ... 
18 { ; } 
... 
37 CComPtr<IGraphBuilder>   m_pGraph; 
38 CComPtr<IMediaControl>   m_pControl; 
... 
44 HRESULT ConnectFilters(CComPtr<IBaseFilter> pIn, CComPtr<IBaseFilter> pOut, const AM_MEDIA_TYPE& mType); 
... 
47 HRESULT MatchPin(CComPtr<IPin>, PIN_DIRECTION, BOOL, BOOL*); 
48 HRESULT IsPinConnected(CComPtr<IPin>, BOOL*); 
49 HRESULT IsPinDirection(CComPtr<IPin>, PIN_DIRECTION, BOOL*); 
}; 

CIcePlayAndSaveAXCore.h : "; winmm.lib, strmbasd.lib uuid.lib;"내 프로젝트의

#pragma once 
#include "CIceBaseLivestreamPlayerCore.h" 

class CIcePlayAndSaveAXCore : public CIceBaseLivestreamPlayerCore 
{ 
... 
7 CIcePlayAndSaveAXCore() : 
8 m_AVIMux(NULL), m_fileWriter(NULL), m_aInfTee(NULL), m_vInfTee(NULL) 
9 { ; } 
... 
19 CComPtr<IBaseFilter> m_AVIMux; 
20 CComPtr<IBaseFilter> m_fileWriter; 
21 CComPtr<IBaseFilter> m_aInfTee; 
22 CComPtr<IBaseFilter> m_vInfTee; 
}; 

추가 종속성입니다.

그게 전부예요. 누군가가 내게 그 문제를 해결하는 방법에 대한 답을 줄 수 있기를 바랍니다. 또는 이나 내가해야 할 일의 방향으로 조언이나 제안을 주길 바랍니다.

도움을 주시면 감사하겠습니다.

그리고 이것은 처음으로 영어 질문을 게시하는 것입니다. (저는 원어민이 아니지만 .. ) 질문이있는대로 잃어 버렸거나 잘못된 것이 있으면 알려 주시기 바랍니다.

고마워요. :)

+0

'#include '? –

+0

그래, 왜 묻는다면 , 위에서 언급 한대로 을 포함했습니다 ... MSDN에서 CComPtr이 atlbase.h를 필요로한다는 것을 보았습니다. (http://msdn.microsoft.com/en-us/library/) ezzw7k98 % 28v = vs.100 % 29.aspx) 그래서 방금했습니다. 틀렸어? –

+0

미안하지만 당신이 그것을 포함 시켰습니까 :) –

답변

4

여러 번 시도한 후에 마침내 문제를 발견하고 해결했습니다.

여기에 결과를 넣어야한다고 생각합니다. 동일한 문제가있는 사람이있을 수도 있기 때문에 과 같이 해결하는 방법을 알지 못합니다. 나는 그것이 자신의 질문에 대답하기위한 stackoverflow의 에티켓 위반인지 모른다. 그래서 나는이 대답을 용인하지 않을 것이다.

내가 말했듯이 #define <atlbase.h>을 내 stdafx.h 하단에 넣었습니다. 그러나 MFC ActiveX 컨트롤 프로젝트를 만들고 있기 때문에 IDE (VS 2010) 자동은 # 012ine을 # stdafx.h에 생성합니다. 이것은 #define _ATL_NO_AUTOMATIC_NAMESPACE입니다.

그리고 우리가 평소에 #include <atlbase.h>를 사용하는 경우, 컴파일러는 수행 using namespace ATL 기본적으로하지만,이 #define _ATL_NO_AUTOMATIC_NAMESPACE 문은 내 컴파일러가 말했다했던 이름 충돌의 원인이 동작을 취소합니다.

따라서이 경우 선언에 ATL::CComPtr을 사용하거나 using ATL::CComPtr 문을 직접 사용하여 CComPtr 문이 나타나고이 컴파일 오류가 제거됩니다.

+1

계속 진행하십시오. 그것은 당신의 문제에 대한 모든 올바른 해결책을 찾은 것입니다. StackOverflow는 좋은 질문에 대한 좋은 대답을 수집하기 위해 존재하며, 아무도 실제로 그 대답을 쓴 사람을 정말로 신경 쓰지 않습니다. – MSalters

+0

네가 맞다고 생각해. 이제 나는 더 쉽게 볼 수 있도록 그것을 받아 들일 것이다. 제안 해 주셔서 감사합니다. :) –

관련 문제