zoukankan      html  css  js  c++  java
  • DirectShow 使用时个人整理的一些常见问题和解决方案

    SDK中Sample编译错误及其解决方案 
    SDK中Sample的编译环境 
    如果使用Microsoft Visual Studio 2005,在工具->选项->项目和解决方案->vc++目录中进行如下设置。 
    可执行文件: 
    D:\Program Files\Microsoft Visual Studio 8\VC 
    D:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86 
    \Microsoft.VC80.DebugMFC 
    D:\Program Files\Microsoft Visual Studio 8\VC\lib 
    D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib 
    D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include 
    D:\Program Files\Microsoft Visual Studio 8\VC\include 
    D:\DXSDK\Lib 
    D:\DXSDK\Bin 
    D:\DXSDK\Samples\C++\DirectShow\BaseClasses 
    D:\DXSDK\Samples\C++\Common\Include 
    D:\DXSDK\Include 
    包含文件: 
    D:\Program Files\Microsoft Visual Studio 8\VC\include 
    D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include 
    D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include 
    D:\DXSDK\Include 
    D:\DXSDK\Samples\C++\DirectShow\BaseClasses 
    D:\DXSDK\Samples\C++\Common\Include 
    库文件: 
    D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib 
    D:\Program Files\Microsoft Visual Studio 8\VC\lib 
    D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib 
    D:\Program Files\Microsoft Visual Studio 8\VC 
    D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\i386 
    D:\DXSDK\Lib 
    D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug 
    D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Release 
    D:\DXSDK\Samples\C++\DirectShow\BaseClasses 

    1针对编译DXSDK\Samples\c++\Direct3D时出现的错误,进行解析。 
    错误例子: 
    CVTRES : fatal error CVT1100: 重复的资源。type:MANIFEST, name:1, language:0×0409 
    LINK : fatal error LNK1123: 转换到COFF 期间失败: 文件无效或损坏 
    解决方案: 
    我的编译环境是Microsoft Visual Studio 2005 
    将所有工程的属性(工程全选->右击->属性)->配置属性->清单工具->输入输出->嵌入清单,选择“否”,然后编译,就OK了。 
    2针对出现未声明标识符的错误进行解析。 
    错误例子:for( m=0; m<pDevice->dwNumModes; m++ ) 

    if( pDevice->modes[m].Width==640 && pDevice->modes[m].Height==480 ) 

    error C2065: “m”: 未声明的标识符 
    像这种错误,你可以查找它的定义,在将它的定义复制到错误行的前面。如上述例子中,你可以在for的上一行添加long m;。就可以了。 
    3针对出现无法初始化问题的错误进行解析。 
    错误例子: 
    TCHAR* strLastSlash = _tcsrchr( str, TEXT(‘\\’) ) 
    错误:error C2440: “初始化”: 无法从“const wchar_t *”转换为“TCHAR *” 
    像这样的错误,你可以在=的右边进行强制转换。如下: 
    TCHAR* strLastSlash = (TCHAR*)_tcsrchr( str, TEXT(‘\\’) ); 
    4针对警告被视为错误的问题进行解析。 
    错误例子: 
    c:\dxsdk\samples\c++\misc\dxdiagreport\dxdiaginfo.cpp(322) : error C2220: 警告被视为错误- 没有生成“object”文件。 
    这种错误的原因是:原因是该文件的代码页为英文,而我们系统中的代码页为中文。 
    解决方案:启动Microsoft Visual Studio 2005,文件->打开->选择c:\dxsdk\samples\c++\misc\dxdiagreport\dxdiaginfo.cpp,然后保存。从新打开程序文件运行,此错误不再出现。 
    如果上述不能去掉错误,还可以点击项目,右击选择属性->配置属性->c/c++->常规,将“警告视为错误”的选项改为“否”。就可以! 
    5编译BaseClasses 
    正在编译… 
    dllentry.cpp 
    D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(222) : error C2146: 语法错误: 缺少“;”(在标识符“PVOID64”的前面) 
    D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(222) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int 
    D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(5940) : error C2146: 语法错误: 缺少“;”(在标识符“Buffer”的前面) 
    D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(5940) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int 
    D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(5940) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int 
    D:\DXSDK\Include\uuids.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode 格式以防止数据丢失 
    生成日志保存在“file://d:\BaseClasses\Debug_Unicode\BuildLog.htm” 
    BaseClasses - 5 个错误,个警告 
    出现错误的地方: 
    typedef void *PVOID; 
    typedef void * POINTER_64 PVOID64; 
    更改: 
    #define POINTER_64 __ptr64///////gai 
    typedef void *PVOID; 
    typedef void * POINTER_64 PVOID64;//// 
    错误:.\wxdebug.cpp(567) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int 
    错误地方:static g_dwLastRefresh = 0; 
    修改:static int g_dwLastRefresh = 0; 
    6编译Capture,无法打开libci.lib 
    出现错误:LINK : fatal error LNK1104: 无法打开文件“libci.lib” 
    生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Capture\CaptureTex\Debug\BuildLog.htm” 
    CaptureTex - 1 个错误,个警告 
    错误原因:缺少数据库LIBCI.LIB在2003和2005中已经不存在了 
    解决方案:将库文件指向VC6中的库文件。 

    编译Capture 
    出现错误:LINK : fatal error LNK1104: 无法打开文件“libci.lib” 
    生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Capture\CaptureTex\Debug\BuildLog.htm” 
    CaptureTex - 1 个错误,个警告 
    错误原因:缺少数据库LIBCI.LIB在2003和2005中已经不存在了 
    编译DMODEMO 
    错误: 
    ..\..\..\Common\Src\dsutil.cpp(686) : error C2065: “i”: 未声明的标识符 
    错误的地方: 
    if( i != m_dwNumBuffers ) 
    return m_apDSBuffer[ i ]; 
    else 
    return m_apDSBuffer[ rand() % m_dwNumBuffers ]; 
    更改:在前面添加 unsigned char i; 
    编译DMOSAMPLE 
    d:\DXSDK\include\dmoimpl.h(622) : error C2065: “dw”: 未声明的标识符 
    d:\DXSDK\include\dmoimpl.h(588): 编译类模板成员函数“HRESULT IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>::ProcessOutput(DWORD,DWORD,DMO_OUTPUT_DATA_BUFFER *,DWORD *)”时 
    with 

    _DERIVED_=CSample, 
    NUMBEROFINPUTS=1, 
    NUMBEROFOUTPUTS=2 

    d:\dxsdk\samples\c++\directshow\dmo\dmosample\Sample.h(21): 参见对正在编译的类模板实例化“IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>”的引用 
    with 

    _DERIVED_=CSample, 
    NUMBEROFINPUTS=1, 
    NUMBEROFOUTPUTS=2 

    d:\DXSDK\include\dmoimpl.h(623) : error C2228: “.dwStatus”的左边必须有类/结构/联合 
    d:\DXSDK\include\dmoimpl.h(624) : error C2228: “.fIncomplete”的左边必须有类/结构/联合 
    d:\DXSDK\include\dmoimpl.h(626) : error C2228: “.fIncomplete”的左边必须有类/结构/联合 
    sample.cpp 
    d:\DXSDK\include\uuids.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode 格式以防止数据丢失 
    d:\DXSDK\include\dmoimpl.h(622) : error C2065: “dw”: 未声明的标识符 
    d:\DXSDK\include\dmoimpl.h(588): 编译类模板成员函数“HRESULT IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>::ProcessOutput(DWORD,DWORD,DMO_OUTPUT_DATA_BUFFER *,DWORD *)”时 
    with 

    _DERIVED_=CSample, 
    NUMBEROFINPUTS=1, 
    NUMBEROFOUTPUTS=2 

    d:\dxsdk\samples\c++\directshow\dmo\dmosample\Sample.h(21): 参见对正在编译的类模板实例化“IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>”的引用 
    with 

    _DERIVED_=CSample, 
    NUMBEROFINPUTS=1, 
    NUMBEROFOUTPUTS=2 

    d:\DXSDK\include\dmoimpl.h(623) : error C2228: “.dwStatus”的左边必须有类/结构/联合 
    d:\DXSDK\include\dmoimpl.h(624) : error C2228: “.fIncomplete”的左边必须有类/结构/联合 
    d:\DXSDK\include\dmoimpl.h(626) : error C2228: “.fIncomplete”的左边必须有类/结构/联合 
    state.cpp 
    StdAfx.cpp 
    util.cpp 
    正在生成代码… 
    生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\DMO\DMOSample\Debug_Unicode\BuildLog.htm” 
    dmosample - 8 个错误,个警告 
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过========== 
    更改:在出错的语句前加上DWORD_PTR dw; 
    编译PlayDVD 
    正在链接… 
    PlayDVD.obj : error LNK2001: 无法解析的外部符号“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA) 
    .\Debug_Unicode/PlayDVD.exe : fatal error LNK1120: 1 个无法解析的外部命令 
    生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\DVD\PlayDVD\Debug_Unicode\BuildLog.htm” 
    PlayDVD - 2 个错误,个警告 
    ========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过========== 
    编译DVD 
    错误: 
    PlayDVD.obj : error LNK2001: 无法解析的外部符号“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA) 
    .\Debug/PlayDVD.exe : fatal error LNK1120: 1 个无法解析的外部命令 
    生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\DVD\PlayDVD\Debug\BuildLog.htm” 
    PlayDVD - 2 个错误,个警告 
    ========== 生成: 1 已成功, 1 已失败, 0 最新, 0 已跳过========== 
    无法解决 
    编译Editing 
    错误:xmltltst.cpp 
    d:\DXSDK\include\uuids.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode 格式以防止数据丢失 
    .\xmltltst.cpp(291) : error C2065: “k”: 未声明的标识符 
    .\xmltltst.cpp(304) : error C2065: “j”: 未声明的标识符 
    生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Editing\XTLTest\Debug_Unicode\BuildLog.htm” 
    XTLTest - 2 个错误,个警告 
    ========== 生成: 6 已成功, 1 已失败, 1 最新, 0 已跳过========== 
    更改:添加unsigned long k = 0 ; 
    unsigned long j = 0 ; 



    编译PlayWndASF 
    错误: 
    playwndasf.obj : error LNK2001: 无法解析的外部符号“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA) 
    urllaunch.obj : error LNK2001: 无法解析的外部符号“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA) 
    .\Debug_Unicode/PlayWndASF.exe : fatal error LNK1120: 1 个无法解析的外部命令 
    生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Players\PlayWndASF\Debug_Unicode\BuildLog.htm” 
    PlayWndASF - 3 个错误,个警告 
    ========== 全部重新生成: 1 已成功, 1 已失败, 0 已跳过========== 
    更改: 
    向数据库依赖项中添加atlsd.lib 
    编译demos(D:\DXSDK\Samples\C++\Demos) 
    错误: 
    StdAfx.cpp 
    d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode 格式以防止数据丢失 
    d:\DXSDK\Samples\C++\common\include\D3DFile.h(56) : error C2061: 语法错误: 标识符“LPDIRECTXFILEDATA” 
    d:\DXSDK\Samples\C++\common\include\D3DFile.h(111) : error C2061: 语法错误: 标识符“LPDIRECTXFILEDATA” 
    d:\DXSDK\Samples\C++\common\include\D3DFile.h(113) : error C2061: 语法错误: 标识符“LPDIRECTXFILEDATA” 
    生成日志保存在“file://d:\DXSDK\Samples\C++\Demos\Donuts4\Debug\BuildLog.htm” 
    Donuts4 - 3 个错误,个警告 
    ========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过========== 
    更改:在dsdfile.h的顶部加入#include <dxfile.h>就可以 
    再次编译出现错误: 
    .\..\Common\Src\d3dfile.cpp(151) : error C2664: “D3DXLoadMeshFromXof”: 不能将参数1 从“LPDIRECTXFILEDATA”转换为“LPD3DXFILEDATA” 
    与指向的类型无关;转换要求reinterpret_cast、C 样式转换或函数样式转换 
    错误出处: 
    if( FAILED( hr = D3DXLoadMeshFromXof( pFileData, D3DXMESH_SYSTEMMEM, pd3dDevice, 
    &pAdjacencyBuffer, &pMtrlBuffer, NULL, 
    &m_dwNumMaterials, &m_pSysMemMesh ) ) ) 
    更改: 
    if( FAILED( hr = D3DXLoadMeshFromXof((LPD3DXFILEDATA)pFileData, D3DXMESH_SYSTEMMEM, pd3dDevice, 
    &pAdjacencyBuffer, &pMtrlBuffer, NULL, 
    &m_dwNumMaterials, &m_pSysMemMesh ) ) ) 
    编译d3d 
    编译dxtex 
    错误: 
    .\dxtexdoc.cpp(694) : error C2440: “初始化”: 无法从“const char *”转换为“TCHAR *” 
    转换丢失限定符 
    .\dxtexdoc.cpp(6 : error C2440: “初始化”: 无法从“const char *”转换为“TCHAR *” 
    转换丢失限定符 
    dxtexview.cpp 
    WINVER not defined. Defaulting to 0×0502 (Windows Server 2003) 
    d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode 格式以防止数据丢失 
    MainFrm.cpp 
    WINVER not defined. Defaulting to 0×0502 (Windows Server 2003) 
    d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode 格式以防止数据丢失 
    StdAfx.cpp 
    WINVER not defined. Defaulting to 0×0502 (Windows Server 2003) 
    d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode 格式以防止数据丢失 
    正在生成代码… 
    正在创建浏览信息文件… 
    Microsoft ?????????? Version 8.00.50727 
    Copyright (C) Microsoft Corporation. All rights reserved. 
    生成日志保存在“file://d:\DXSDK\Samples\C++\Direct3D\DXTex\Debug\BuildLog.htm” 
    dxtex - 2 个错误,个警告 
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过========== 
    错误地方: TCHAR* pszLeaf = strrchr(lpszPathName, ‘\\’); 
    更改:TCHAR* pszLeaf = (TCHAR*)strrchr(lpszPathName, ‘\\’); 
    编译后出现错误: 
    正在链接… 
    CVTRES : fatal error CVT1100: 重复的资源。type:MANIFEST, name:1, language:0×0409 
    LINK : fatal error LNK1123: 转换到COFF 期间失败: 文件无效或损坏 
    更改: 
    将在Debug模式下编译改为Release模式下编译。 
    编译Water(water.cpp)错误: 
    .\Water.cpp(7 : error C2039: “Pass”: 不是“ID3DXEffect”的成员 
    更改: 直接去掉这句// m_pEffect->Pass(uPass) 
    \fur.cpp(424) : error C2039: “Pass”: 不是“ID3DXEffect”的成员 
    d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 参见“ID3DXEffect”的声明 
    .\fur.cpp(550) : error C2039: “Pass”: 不是“ID3DXEffect”的成员 
    d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 参见“ID3DXEffect”的声明 
    .\fur.cpp(567) : error C2039: “Pass”: 不是“ID3DXEffect”的成员 
    d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 参见“ID3DXEffect”的声明 
    .\fur.cpp(585) : error C2039: “Pass”: 不是“ID3DXEffect”的成员 
    d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 参见“ID3DXEffect”的声明 
    dxutil.cpp 
    更改:将Pass改成小写pass。在Water编译中也是错误的!!! 

    编译VertexBlend(vertexblend.cpp) 
    错误:\vertexblend.cpp(312) : error C2065: “i”: 未声明的标识符 
    .\vertexblend.cpp(315) : error C2228: “.v”的左边必须有类/结构/联合 
    .\vertexblend.cpp(315) : error C2228: “.x”的左边必须有类/结构/联合 
    .\vertexblend.cpp(316) : error C2228: “.blend”的左边必须有类/结构/联合 
    改正:for( INT i=0; i<dwNumVertices; i++ ) 

    // Set the blend factors for the vertices 
    FLOAT a = ( pVertices[i].v.x - fMinX ) / ( fMaxX - fMinX ); 
    pVertices[i].blend = 1.0f-sinf(a*D3DX_PI*1.0f); 
    }///INT 

    问题② 
    c:\Program Files\DXSDK\Extras\DirectShow\Samples\C++\DirectShow\BaseClasses\ctlutil.h(278) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int 

    COARefTime(LONG); 
    operator=(LONG); 

    解决方案:改为 
    COARefTime(LONG); 
    int operator=(LONG); 



    Activex 使用DirectShow的问题解决方案 

    下面的编译问题: 

    strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A) 

    strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA) 
    解决方法: 
    在xxxctrl.h中加入下面的代码 
    ///////////////////////////////////////////////////////////////////////////// 
    // DllGetClassObject 

    extern "C" 
    STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) 

    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    return AfxDllGetClassObject(rclsid, riid, ppv); 


    ///////////////////////////////////////////////////////////////////////////// 
    // DllCanUnloadNow 

    extern "C" 
    STDAPI DllCanUnloadNow(void) 

    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    return AfxDllCanUnloadNow(); 

    //////////////////////////////////////// 
  • 相关阅读:
    再谈 Devstack(Rocky)
    记一次性能测试与优化经历
    Nova rebuild for boot from volume issue
    OpenStack RPM Sample 解析
    [Cinder] 存储 Qos
    Octavia Rocky UDP 负载均衡功能试验
    Keepalived + LVS-NAT 实现高可用四层 TCP/UDP 负载均衡器
    LVS 四层 TCP/UDP 负载均衡器
    集群的定义以及类别定义
    对程序员又了解了一些
  • 原文地址:https://www.cnblogs.com/whisht/p/3112678.html
Copyright © 2011-2022 走看看