2013-10-08 83 views
1

當我試圖編寫一個基於directshow的直播播放器作爲ActiveX控件時遇到了問題。VS2010智能感知說:CComPtr不是模板

我首先用VS2010(VC++類別)創建了一個MFC ActiveX控件項目, 並在控件上附加了一個對話框,然後用一個簡單的html頁面對其進行了測試。

到目前爲止,它工作得很好,但是當我試圖用但是CComPtr添加一些代碼的DirectShow, 編譯器顯示以下錯誤(我還附上了行號和文件):

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有些奇怪,但我無法弄清楚什麼是錯誤的。

我在我的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:

#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; 
}; 

我的項目的附加依賴是 「strmbasd.lib; WINMM.LIB; UUID.LIB;」。

這就是全部......希望有人能給我如何解決它的答案,或者只是給我任何建議或建議作爲我應該做的方向。

任何幫助表示讚賞。

這是我第一次發佈英文問題(雖然我不是母語的人), 因此,請讓我知道是否有任何問題丟失或做錯了問題。

非常感謝。 :)

+0

'#include '? –

+0

是的,我已經包括如上所述, 如果你問爲什麼?我見過的MSDN寫道,但是CComPtr需要atlbase.h(http://msdn.microsoft.com/en-us/library/ ezzw7k98%28v = vs.100%29.aspx) 所以我就這麼做了。那是錯的嗎? –

+0

沒有對不起,我的意思是你包括它:) –

回答

4

經過多次嘗試,我終於找到了問題,並得到它解決。

我想我應該把結果放在這裏,因爲可能有人有同樣的問題, ,並不知道如何解決它,就像我是。我不知道這是否是一種用於解答我自己的問題的禮儀策略,因此我將不接受這個答案。

正如我所說,我已將#define <atlbase.h>放入我的stdafx.h的底部。 但是因爲我正在製作一個MFC ActiveX控件項目,所以IDE(VS 2010)會自動在我的stdafx.h中生成一個#define語句,即#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

是的,我認爲你是對的。現在我接受它讓它更加明顯。 謝謝你的建議! :) –