wma tag 批量修改[原代码-从wmfsdk中修改]
2007-03-18 00:00
676 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <stdio.h>
#include <string.h>
#include <wmsdk.h>
#pragma comment( lib, "wmvcore.lib" )
#pragma comment( lib, "Rpcrt4.lib" )
#define FIELD_NUM 9
#define FIELD_LEN 1024
char __sFileName[ MAX_PATH ];
#ifndef SAFE_RELEASE
#define SAFE_RELEASE( x ) \
if( NULL != x ) \
{ \
x->Release( ); \
x = NULL; \
}
#endif // SAFE_RELEASE
#ifndef SAFE_DELETE
#define SAFE_DELETE( x ) \
if( NULL != x ) \
{ \
delete x; \
x = NULL; \
}
#endif // SAFE_DELETE
#ifndef SAFE_ARRAYDELETE
#define SAFE_ARRAYDELETE( x ) \
if( NULL != x ) \
{ \
delete [] x; \
x = NULL; \
}
#endif // SAFE_ARRAYDELETE
#ifndef UNICODE
HRESULT ConvertMBtoWC( LPCTSTR ptszInString, LPWSTR *ppwszOutString )
{
if( ptszInString == NULL || ppwszOutString == NULL ){
return( E_INVALIDARG );
}
HRESULT hr = S_OK;
int nSizeCount = 0;
*ppwszOutString = NULL;
do
{
//
// Get the memory reqd for this string
//
nSizeCount = MultiByteToWideChar( CP_ACP, 0, ptszInString, -1, NULL, 0 );
if( 0 == nSizeCount )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
break;
}
*ppwszOutString = new WCHAR[ nSizeCount ];
if( NULL == *ppwszOutString )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
break;
}
if( 0 == MultiByteToWideChar( CP_ACP, 0, ptszInString, -1, *ppwszOutString, nSizeCount ) )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
break;
}
}
while( FALSE );
if( FAILED( hr ) )
{
SAFE_ARRAYDELETE( *ppwszOutString );
_tprintf( _T( "Internal error ( hr=0x%08x )\n" ), hr );
}
return( hr );
}
#endif // UNICODE
HRESULT editorOpen( WCHAR* _wma_file, IWMMetadataEditor ** ppEditor, IWMHeaderInfo ** ppHeaderInfo )
{
if( ( NULL == _wma_file ) || ( NULL == ppEditor ) ){
return( E_INVALIDARG );
}
HRESULT hr = S_OK;
do
{
hr = WMCreateEditor( ppEditor );
if( FAILED( hr ) ){
_tprintf( _T( "Could not create Metadata Editor ( hr=0x%08x ).\n" ), hr );
break;
}
hr = ( *ppEditor )->Open( _wma_file );
if( FAILED ( hr ) ){
_tprintf( _T( "Could not open the file %ws ( hr=0x%08x ).\n" ),
_wma_file, hr );
break;
}
if( NULL != ppHeaderInfo ){
hr = ( *ppEditor )->QueryInterface( IID_IWMHeaderInfo,
(void **)ppHeaderInfo );
if( FAILED( hr ) ){
_tprintf( _T( "Could not QI for IWMHeaderInfo ( hr=0x%08x ).\n" ), hr );
break;
}
}
}
while( FALSE );
return( hr );
}
HRESULT SetAttrib( WCHAR * _wma_file, WCHAR * pName, WCHAR * pValue )
{
WORD wStreamNum = 0;
WORD wAttribType = WMT_TYPE_STRING;
if( ( NULL == _wma_file ) || ( NULL == pName ) || ( NULL == pValue ) ){
return( E_INVALIDARG );
}
HRESULT hr = S_OK;
IWMMetadataEditor * pEditor = NULL;
IWMHeaderInfo * pHeaderInfo = NULL;
BYTE* pbAttribValue = NULL;
WORD wAttribValueLen = 0;
WMT_ATTR_DATATYPE AttribDataType = ( WMT_ATTR_DATATYPE ) wAttribType;
DWORD dwAttribValue = 0;
WORD wAttribValue = 0;
QWORD qwAttribValue = 0;
BOOL fAttribValue = 0;
do
{
hr = editorOpen( _wma_file, &pEditor, &pHeaderInfo );
if(FAILED( hr ) ){
break;
}
/*
Attrib type = string...
*/
wAttribValueLen = ( wcslen( pValue ) + 1 )* sizeof( WCHAR );
pbAttribValue = (BYTE *)pValue;
hr = pHeaderInfo->SetAttribute( wStreamNum,
pName,
AttribDataType,
pbAttribValue,
wAttribValueLen );
if( FAILED( hr ) ){
_tprintf( _T( "SetAttribute failed for Attribute name %ws ( hr=0x%08x ).\n" ),
pName, hr );
break;
}
hr = pEditor->Flush();
if( FAILED( hr ) ){
_tprintf( _T( "Could not flush the file %ws ( hr=0x%08x ).\n" ),
_wma_file, hr );
break;
}
hr = pEditor->Close();
if( FAILED( hr ) ){
_tprintf( _T( "Could not close the file %ws ( hr=0x%08x ).\n" ),
_wma_file, hr );
break;
}
}
while( FALSE );
SAFE_RELEASE( pHeaderInfo );
SAFE_RELEASE( pEditor );
return( hr );
}
HRESULT __SetAttrib( WCHAR * _wma_file, WCHAR ** pName, WCHAR ** pValue )
{
WORD wStreamNum = 0;
WORD wAttribType = WMT_TYPE_STRING;
int i;
if( ( NULL == _wma_file ) || ( NULL == pName ) || ( NULL == pValue ) ){
return( E_INVALIDARG );
}
HRESULT hr = S_OK;
IWMMetadataEditor * pEditor = NULL;
IWMHeaderInfo * pHeaderInfo = NULL;
BYTE* pbAttribValue = NULL;
WORD wAttribValueLen = 0;
WMT_ATTR_DATATYPE AttribDataType = ( WMT_ATTR_DATATYPE ) wAttribType;
DWORD dwAttribValue = 0;
WORD wAttribValue = 0;
QWORD qwAttribValue = 0;
BOOL fAttribValue = 0;
do
{
hr = editorOpen( _wma_file, &pEditor, &pHeaderInfo );
if(FAILED( hr ) ){
break;
}
for( i = 1; i < FIELD_NUM; i ++ ){
//SetAttrib( _wma_file, attribNames[ i ], fields[ i ] );
//printf( "%d: %s\n", i, fields[ i ] );
/*
Attrib type = string...
*/
wAttribValueLen = ( wcslen( pValue[ i ] ) + 1 )* sizeof( WCHAR );
pbAttribValue = (BYTE *)pValue[ i ];
hr = pHeaderInfo->SetAttribute( wStreamNum,
pName[ i ],
AttribDataType,
pbAttribValue,
wAttribValueLen );
if( FAILED( hr ) ){
_tprintf( _T( "SetAttribute failed for Attribute name %ws ( hr=0x%08x ).\n" ), pName[ i ], hr );
break;
}
}
hr = pEditor->Flush();
if( FAILED( hr ) ){
_tprintf( _T( "Could not flush the file %ws ( hr=0x%08x ).\n" ),
_wma_file, hr );
break;
}
hr = pEditor->Close();
if( FAILED( hr ) ){
_tprintf( _T( "Could not close the file %ws ( hr=0x%08x ).\n" ),
_wma_file, hr );
break;
}
}
while( FALSE );
SAFE_RELEASE( pHeaderInfo );
SAFE_RELEASE( pEditor );
return( hr );
}
bool get_info( WCHAR **fields, int num , char *input ){
int seg = 0;
char *s = input;
char buffer[ 1024 * 4 ] = { 0x00 };
__sFileName[ 0 ] = 0x00;
for( char *p = input; *p != 0x00 ; p ++ ){
if( *p == '|' ){
*p = 0x00;
strcpy( buffer, s );
if( __sFileName[ 0 ] == 0x00 )
strcpy( __sFileName, s );
HRESULT hr = ConvertMBtoWC( buffer, &fields[ seg ] );
if( FAILED( hr ) ){
break;
}
buffer[ 0 ] = 0x00;
//strcpy( fields[ seg ], s );
s = p + 1;
seg ++;
if( seg == num - 1 ){
if( *s != 0x00 ){
strcpy( buffer, s );
hr = ConvertMBtoWC( buffer, &fields[ seg ] );
//strcpy( fields[ seg ], s );
}
break;
}
}
}
if( seg == num - 1 )
return true;
else
return false;
}
int loadConfig( WCHAR **attribNames ){
char buffer[ 1024 ];
FILE *fp;
int i = 0;
HRESULT hr = S_OK;
fp = fopen( "config.txt", "rb" );
if( !fp ){
perror( "fopen( config.txt )" );
return -1;
}
while( !feof( fp )){
if( fgets( buffer, sizeof( buffer ), fp ) ){
if( strlen( buffer ) < 3 )
continue;
for( int j = 0; j < (int)strlen( buffer ); j ++ ){
if( buffer[ j ] == 0x0a || buffer[ j ] == 0x0d )
buffer[ j ] = 0x00;
}
hr = ConvertMBtoWC( buffer, &attribNames[ i ] );
if( FAILED( hr ) )
break;
else
i ++;
}
}
fclose( fp );
if( FAILED( hr ) )
return -1;
else
return i;
}
相关文章推荐
- 黄聪:C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(转载)
- 用asp实现的代码批量修改程序,fso相关
- c++代码批量修改图片名称(重命名)实例及运行结果
- c++代码批量修改图片名称(重命名)实例及运行结果
- Mybatis批量修改的操作代码
- java实现批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码
- c++代码批量修改图片名称(重命名)实例及运行结果
- c++代码批量修改图片名称(重命名)实例及运行结果
- 批量修改RAR文件注释的php代码
- java批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码
- Excel VBA 代码笔记之批量创建修改删除工作表(worksheet)
- Shell脚本批量修改文件后缀名代码分享
- php中批量修改文件后缀名的函数代码
- asp批量修改记录的代码
- java实现批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码
- c++代码批量修改图片名称(重命名)实例及运行结果
- python批量修改文件后缀示例代码分享
- 批量修改物料的产品层次,ABAP代码
- c++代码批量修改图片名称(重命名)实例及运行结果