Some DirectShow Samples Break in Visual Studio 2005
[Note: This post applies to the Platform SDK for Windows Server 2003 SP1 and Server 2003 R2. These issues were fixed in the Windows SDK for Vista.]
Some of the DirectShow samples break if you install Visual Studio 2005 Beta 2. Most of the errors that I found fall into three categories:
- C4430: Missing type specifier. To conform with C++, undeclared types do not default to int. All types must be declared. Fix: Declare the type, or suppress the warning with the "/wd4430" flag.
- C4996: ' xxxx' was declared deprecated. You may be including an older version of strsafe.h from the DirectX SDK or the Platform SDK. You should include the version installed with Visual Studio. (But it's probably harmless to ignore this warning.)
- C2065: 'xxx': undeclared identifier. To conform with C++, the scope of a variable declared inside a "for" loop is restricted to the loop. Fixes: (a) Move the declaration outside the for loop. (b) Redeclare the variable in multiple scopes, if you don't need it to persist outside the loop. (c) Set the /Zc:forScope flag. (You can find this under Project, Properties, Configuration Properties, C/C++, Language, Force Conformance In For Loop Scope. Set to "No".)
Here are the specific fixes that I made. Warning: I have not thoroughly tested these, and I only tried them under the "Windows XP 32-bit Debug" environment in Platform SDK. You should use your own judgment before making any of these fixes.
- BaseClasses\ctlutil.h (278)
(LONG) operator=(LONG); - BaseClasses\wxdebug.cpp (564)
static DWORD g_dwLastRefresh = 0; - BaseClasses\winutil.cpp (2092)
UINT Count;
for (Count = 0;Count < Result;Count++) { - BaseClasses\outputq.cpp (635)
long iDone = 0;
for (iDone = 0; - Capture\AmCap\amcap.cpp (691)
for(int i = 0; i < NUMELMS(gcap.rgpmAudioMenu); i++) - Capture\AmCap\amcap (2795)
for(int i = 0; i < NUMELMS(gcap.rgpmAudioMenu); i++) - DMODemo\dsutil.cpp (686)
DWORD i = 0;
for( i=0; i<m_dwNumBuffers; i++ ) - dmoimpl.h (622) [In the Platform SDK headers]
for (DWORD dw = 0; dw < NUMBEROFOUTPUTS; dw++) { - DMO\GargleDMO\MedParamBase\param.cpp (91)
for (DWORD dwIndex = 0; dwIndex < cParams; dwIndex++) - DMO\GargleDMO\MedParamBase\param.cpp (309)
CCurveItem *pCurve = NULL;
for (pCurve = pCurveHead; - DMO\GargleDMO\gargle.cpp (145)
for (DWORD i = 0; i < cOutputStreams && SUCCEEDED(hr); ++i) - Filters\Dump\dump.cpp (426)
for (int Loop = 0;Loop < (DataLength % BYTES_PER_LINE);Loop++) - Filters\Gargle\gargle.cpp (212)
static int m_nInstanceCount; // total instances - Filters\RGBFilters\RateSource\ratesource.cpp (382)
for( int y = 0 ; y < DEFAULT_HEIGHT ; y++ ) - Filters\RGBFilters\RateSource\ratesource.cpp (387)
for( int y = 0 ; y < DEFAULT_WIDTH ; y++ ) - VMR\VMRXclBasic and VMR\Ticker: LNK1181: cannot open input file 'dxguid.lib'. This was an error in the makefile. Change to read:
DXLIB="$(DXSDK_DIR)\Lib\x86" (currently says "x32") - VMR\VMRXcl and VMR\VMRMulti: C1083: Cannot open include file: 'd3dxmath.h': No such file or directory. This is an old DX header that is no longer included in DX or in Visual Studio. Unfortunately the only fix is to download an older version of the DirectX SDK.
- VMR9\MultiVMR9\GamePlayer\character.cpp (383)
DWORD i = 0;
for (i = 0; i < pMeshContainer->NumInfl; ++i) - VMR9\MultiVMR9\DLL\MixerControl.h (28)
static const DWORD MultiVMR9Mixer_DefaultFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1; - VMR9\VMRAllocator: error LNK2019: unresolved external symbol "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)" (etc). Add this to the makefile:
LINK32_LIBS = \
comsuppw.lib \
shell32.lib \
安装Dx9SDK
由于2005Feburary以后的SDK是dx9.0c,都去掉了DirectShow了,我下的dx9.0b的SDK。
编译其下的例子 \Samples\C++\DirectShow\BaseClasses 分别获得debug版和Release 版的库的strmbasd.lib ( release 版 STRMBASE.lib )。
这一步在vs2005以前版本都能过,但2005编译比以前版本更严格了。从microsoft论坛上摘抄一些相关讨论:
The VC2005 compiler is stricter about enforcing some things in the C++ standard.
You can set the compiler to be less strict. (I don't know the setting off the top of my header), or modify the base classes. See:
http://blogs.msdn.com/mikewasson/archive/2005/05/23/421116.aspx
Try this:
If you have a VS2005 Solution with the Direct Show Base classes:
Open Configuration Properties, Open C/C++, Open Language
Set the property "Force Conformance In For Loop Scope" to "No"
If you are going to use the PSDK+nmake, copy the win32.mak file to the BaseClasses folder. (best to copy it to your own folder)
Use the Win2000 environment, I had problems with XP.
Edit your local win32.mak "-GS" (turn off security checks) as part of the common flags macro and also find the flag to turn off the loop conformance. I modified the code so it was not needed for my build. I think the flag is "-Zc:forScope-".
Yes or what I did and kept documented a while ago:
1. CtlUtil.h:
class
2. OutputQ.cpp:
HRESULT COutputQueue::ReceiveMultiple (
3. WinUtil.cpp:
HRESULT CImagePalette::MakeIdentityPalette(PALETTEENTRY *pEntry,INT iColours, LPSTR szDevice) {
...
UINT Count ;
for ( Count = 0;Count < Result;Count++) {
4. wxdebug.cpp:
BOOL WINAPI DbgCheckModuleLevel(DWORD Type,DWORD Level)
...
static DWORD g_dwLastRefresh = 0;
DWORD dwTime = timeGetTime();
按照以上修改baseclasses源码后编译通过。
编译DirectShow应用程序,全局设置如下:
选择菜单项tool、options、directories,在弹出的对话框中的show directories for中选择include files,添加配置如下(假设directx sdk安装在D:\dxsdk目录下):
D:\dxsdk\include
D:\dxsdk\samples\c++\directshow\baseclasses
D:\dxsdk\samples\c++\common\include
再在show directories for中选择 library files,添加配置如下:
D:\dxsdk\lib
D:\dxsdk\samples\c++\directshow\baseclasses\debug
D:\dxsdk\samples\c++\directshow\baseclassed\release
...LONG iDone ;
for (iDone = 0 ; COARefTime : public CRefTime {
...
private:
COARefTime & operator=(LONG); // YD: added COARefTime &
} ;
浙公网安备 33010602011771号