int CKTVSaver::WriteConfig( CString strConfigFilePath, KTV_SONG_EX* lpSongRecord  )
{
    DWORD dwIndexAddress = 0;
    SongConfigData *lpSCD = NULL;    int nFileType = 0;
    int HasEncodeFile = 0;    
        BOOL  isNewFormat = TRUE;
    BOOL bCreatingNew = FALSE;
    UINT nOpenFlag = CFile::modeReadWrite;
    DWORD dwAttr = -1;// GetFileAttributes(strConfigFilePath);
    if( strConfigFilePath.IsEmpty() || ( dwAttr = GetFileAttributes(strConfigFilePath) ) == -1 ) {
        bCreatingNew = TRUE;
        isNewFormat = TRUE;
        nOpenFlag = CFile::modeCreate | CFile::modeReadWrite;
    }
    else {
        bCreatingNew = FALSE;
        nOpenFlag = CFile::modeReadWrite;
    }    if( !strConfigFilePath.IsEmpty() && dwAttr != -1 && dwAttr & FILE_ATTRIBUTE_READONLY )
    {
      SetFileAttributes( strConfigFilePath, FILE_ATTRIBUTE_NORMAL );
    }
    CFile cf;
    HANDLE hFile = NULL;
    BOOL bOpenSCD = FALSE;     
    if( !strConfigFilePath.IsEmpty() )
        bOpenSCD =  cf.Open( strConfigFilePath, nOpenFlag );    //if( cf.Open( strConfigFilePath, nOpenFlag ) )
    {
        if( bOpenSCD )
        {
            hFile = cf.m_hFile;
            DWORD dwSize = (DWORD)cf.GetLength();
            if( bCreatingNew )
            {                    
                dwSize = (DWORD)sizeof(SongConfigData);
            }
            else 
            {       
                if ( dwSize == 512 )            
                {
                    dwSize = (DWORD)sizeof(SongConfigData);
                    isNewFormat = FALSE;            
                }
                else             
                {
                    isNewFormat = TRUE;
                }
            }        } // bOpenSCD
                SongConfigData scd = {0};        if( bOpenSCD )
            cf.Read( &scd, sizeof(scd) );        memset( scd.copyright.szCopyRight, 0, 8 );
        strcat( scd.copyright.szCopyRight, "SYSDKTV" );
        scd.copyright.dwCreatedDate = (DWORD)time(NULL);
        scd.copyright.dwFileSize = (DWORD)sizeof(SongConfigData);
        scd.copyright.dwRecordCount = 1;
        scd.copyright.dwVersion = DB_SONG_CONFIG;
        if ( !isNewFormat)
        {
            memset( &scd.songEx, 0,  sizeof(KTV_SONG_EX) );
        }        if ( lpSongRecord )
            //memcpy( &scd.song, &lpSongRecord->song, sizeof(KTV_SONG_S) );
            wmemcpy( scd.Singer_name, lpSongRecord->Singer_name, 100 );            memcpy( &scd.songEx, lpSongRecord,  sizeof(KTV_SONG_EX) );
            ChangeSongDataFormat( &scd.song, lpSongRecord, FALSE );        }
        else {
                // 新数据格式            UINT nLength = m_strSongName.GetLength();
            if( nLength > 0 )
            {
                nLength = nLength < 19 ? nLength : 19 ;
                wmemset( scd.song.song_name, 0, 20 );
                wmemcpy( scd.song.song_name, m_strSongName.GetBuffer(), nLength );                
            }            // pinyin  
            nLength = m_strPinyin.GetLength();
            if( nLength > 0 )
            {
                nLength = nLength < 9 ? nLength : 9 ;
                wmemset( scd.song.song_py, 0, 10 );
                wmemcpy( scd.song.song_py, m_strPinyin.GetBuffer(), nLength );
            }            // song number
            scd.song.song_Num = m_dwNumber;            nLength = m_strSingerName.GetLength();
            if( nLength > 0 )
            {
                nLength = nLength < 99 ? nLength : 99 ;
                wmemset( scd.Singer_name, 0, 100 );
                wmemcpy( scd.Singer_name, m_strSingerName.GetBuffer(), nLength );                
            }            //    scd.song.Singer_Num[0] = m_dwSingerNo;            memcpy( &scd.song.song_mtv,  &m_nIsMTV, 1 );            memcpy( &scd.song.song_Lang,  &m_nLang, 1 );            memcpy( &scd.song.song_Category,  &m_nType, 1 );            memcpy( &scd.song.song_Volume,  &m_nVolume, 1 );            memcpy( &scd.song.song_click,  &m_nClick, 2 );            memcpy( &scd.song.song_Accompaniment,  &m_nTrack, 1 );        } //         if ( m_nIsMidi )
        {
            scd.song.filetype = IPTV_FILE_TYPE_MIDI;    
            scd.songEx.song.filetype = IPTV_FILE_TYPE_MIDI;
            scd.song.song_Index = 0;
        }
        else if( !m_strFilePath.IsEmpty() )
        {
  
            //if( nFileType == 0 )
            //    nFileType = GetFileType( m_strFilePath );            //memcpy( &scd.song.filetype , &nFileType,  1 );    
            //memcpy( &scd.songEx.song.filetype , &nFileType,  1 );        
        }        //////////////////////////////////////////////////////////////////////////
        // 新格式        if ( !isNewFormat )
        {   
                        
            UINT nLength = m_strSongName.GetLength();
            if( nLength > 0 )
            {
                nLength = nLength < SONG_NAME_MAX_LENGTH-1 ? nLength : SONG_NAME_MAX_LENGTH-1 ;
                wmemset( scd.songEx.song_name, 0, SONG_NAME_MAX_LENGTH );
                wmemcpy( scd.songEx.song_name, m_strSongName.GetBuffer(), nLength );
            }
            else
            {
                wmemcpy( scd.songEx.song_name, scd.song.song_name, 20 );
            }                    nLength = m_strSingerName.GetLength();
            if( nLength > 0 )
            {
                nLength = nLength < SINGER_NAME_MAX_LENGTH-1 ? nLength : SINGER_NAME_MAX_LENGTH-1 ;
                wmemset( scd.Singer_name, 0, 100 );
                wmemcpy( scd.Singer_name, m_strSingerName.GetBuffer(), nLength );
            }
            else
            {
                wmemset( scd.songEx.Singer_name, 0, SINGER_NAME_MAX_LENGTH );
                wmemcpy( scd.songEx.Singer_name, scd.Singer_name, 100 );
            }    
                        
        }
        else 
        {       // 已经是新格式
            UINT nLength = m_strSongName.GetLength();
            if( nLength > 0 )
            {
                nLength = nLength < SONG_NAME_MAX_LENGTH-1 ? nLength : SONG_NAME_MAX_LENGTH-1 ;
                wmemset( scd.songEx.song_name, 0, SONG_NAME_MAX_LENGTH );
                wmemcpy( scd.songEx.song_name, m_strSongName.GetBuffer(), nLength );
            }            nLength = m_strSingerName.GetLength();
            if( nLength > 0 )
            {
                nLength = nLength < SINGER_NAME_MAX_LENGTH-1 ? nLength : SINGER_NAME_MAX_LENGTH-1 ;
                wmemset( scd.songEx.Singer_name, 0, SINGER_NAME_MAX_LENGTH );
                wmemcpy( scd.songEx.Singer_name, m_strSingerName.GetBuffer(), nLength );
            }            
            
        } // !isNewFormat
        //    scd.song.Singer_Num[0] = m_dwSingerNo;        if( m_nSongNameLength == 0 ) // 没有设置长度的情况下自动求长度
            m_nSongNameLength = GetTitleLength( scd.songEx.song_name );        memcpy( &scd.songEx.song.song_name_Length, &m_nSongNameLength, 1 );
        memcpy( &scd.song.song_name_Length, &m_nSongNameLength, 1 );        wmemcpy( scd.songEx.song.song_py, scd.song.song_py, 10 );        scd.songEx.song.song_Num = m_dwNumber;        scd.songEx.song.song_mtv = scd.song.song_mtv;        scd.songEx.song.song_Lang = scd.song.song_Lang;                scd.songEx.song.song_Category = scd.song.song_Category;        scd.songEx.song.song_Volume = scd.song.song_Volume;        scd.songEx.song.song_click = scd.song.song_click;        scd.songEx.song.song_Accompaniment = scd.song.song_Accompaniment;        scd.songEx.song.song_Index = scd.song.song_Index;
        //////////////////////////////////////////////////////////////////////////
        if( IsAllEnglish( scd.Singer_name ) )
            wcsupr( scd.Singer_name ); 
        TrimMidSpace( scd.Singer_name );        if( IsAllEnglish( scd.song.song_name ) )
            wcsupr( scd.song.song_name );
        TrimMidSpace( scd.song.song_name );        if( IsAllEnglish( scd.songEx.Singer_name  ) )
            wcsupr( scd.songEx.Singer_name );
        TrimMidSpace( scd.songEx.Singer_name );        if( IsAllEnglish( scd.songEx.song_name  ) )
            wcsupr( scd.songEx.song_name );
        TrimMidSpace( scd.songEx.song_name );
        if( bOpenSCD )
        {       // 写数据到磁盘
            cf.SeekToBegin();
            cf.Write( &scd, sizeof(scd) );
        }        // 存储一份副本在内存
        memcpy( &m_scdPublic, &scd, sizeof(scd) );
                // 设置文件的大小
        if ( !isNewFormat ||  bCreatingNew )
        {
            if ( hFile ) 
            {
                DWORD dwSize = (DWORD)sizeof(SongConfigData);
                ::SetFilePointer(hFile, dwSize, NULL, FILE_BEGIN); 
                ::SetEndOfFile(hFile); 
            }
            
        } // 
        
        if( bOpenSCD )
           cf.Close();        return TRUE; // 保存成功返回TRUE
    }    return FALSE;
}
请将上面的C函数转换为delphi,谢谢