不要下面这个函数 提取中文字体不行 有大神知道怎么提取吗
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;
}