Windows 字体文件提取字体名称

图片说明
不要下面这个函数 提取中文字体不行 有大神知道怎么提取吗

CString CVectorFontLib::GetFontNameFromFile(CString strFilePath)
{ 
    CString strFontName;
    HANDLE hFile  =  CreateFile(strFilePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return CString();
    }
    DWORD dwRead = 0;
    TT_OFFSET_TABLE ttOffsetTable;
    ReadFile(hFile,&ttOffsetTable, sizeof(TT_OFFSET_TABLE),&dwRead,NULL);
    ttOffsetTable.uNumOfTables = SWAPWORD(ttOffsetTable.uNumOfTables);
    ttOffsetTable.uMajorVersion = SWAPWORD(ttOffsetTable.uMajorVersion);
    ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion);
    //check is this is a true type font and the version is 1.0
//  if(ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0)
//  {
//      return CString();
//  }
    TT_TABLE_DIRECTORY tblDir;
    BOOL bFound = FALSE;
    std::vector<char> vtBuf;
    for(int i = 0; i < ttOffsetTable.uNumOfTables; i++)
    {
        ReadFile(hFile,&tblDir, sizeof(TT_TABLE_DIRECTORY),&dwRead,NULL);

        vtBuf.resize(5);
        memset(&vtBuf[0],0,vtBuf.size());
        strncpy(&vtBuf[0],tblDir.szTag, 4);
        if(strcmp(_strlwr(&vtBuf[0]),"name") == 0)
        {
            bFound = TRUE;
            tblDir.uLength = SWAPLONG(tblDir.uLength);
            tblDir.uOffset = SWAPLONG(tblDir.uOffset);
            break;
        }
    }
    if(bFound)
    { 
        SetFilePointer(hFile,tblDir.uOffset,NULL,FILE_BEGIN);
        TT_NAME_TABLE_HEADER ttNTHeader; 
        ReadFile(hFile,&ttNTHeader,sizeof(TT_NAME_TABLE_HEADER),&dwRead,NULL);
        ttNTHeader.uNRCount = SWAPWORD(ttNTHeader.uNRCount);
        ttNTHeader.uStorageOffset = SWAPWORD(ttNTHeader.uStorageOffset);

        TT_NAME_RECORD ttRecord;
        bFound = FALSE;

        for(int i = 0; i < ttNTHeader.uNRCount; i++)
        {
            ReadFile(hFile,&ttRecord,sizeof(TT_NAME_RECORD),&dwRead,NULL);
            ttRecord.uNameID = SWAPWORD(ttRecord.uNameID);
            if(ttRecord.uNameID == 1)
            {
                ttRecord.uStringLength = SWAPWORD(ttRecord.uStringLength);
                ttRecord.uStringOffset = SWAPWORD(ttRecord.uStringOffset);

                //Get current pointer position
                DWORD dwPos = SetFilePointer(hFile,0,NULL,FILE_CURRENT);  
                SetFilePointer(hFile,tblDir.uOffset + ttRecord.uStringOffset + ttNTHeader.uStorageOffset,NULL,FILE_BEGIN);  
                vtBuf.resize(ttRecord.uStringLength + 1);
                memset(&vtBuf[0],0,vtBuf.size());
                ReadFile(hFile,&vtBuf[0],ttRecord.uStringLength,&dwRead,NULL);   
                if(strlen(&vtBuf[0]) > 0)
                {
                    strFontName = &vtBuf[0];
                    break;
                }
                SetFilePointer(hFile,dwPos,NULL,FILE_BEGIN);
            }
        }   
    }
    CloseHandle(hFile);

    return strFontName;
}


https://blog.csdn.net/ytfgff/article/details/86887726