FontInstaller.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:2k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include ".fontinstaller.h"
  3. CFontInstaller::CFontInstaller()
  4. {
  5. if(HMODULE hGdi = GetModuleHandle(_T("gdi32.dll")))
  6. {
  7. pAddFontMemResourceEx = (HANDLE (WINAPI *)(PVOID,DWORD,PVOID,DWORD*))GetProcAddress(hGdi, "AddFontMemResourceEx");
  8. pAddFontResourceEx = (int (WINAPI *)(LPCTSTR,DWORD,PVOID))GetProcAddress(hGdi, "AddFontResourceExA");
  9. pRemoveFontMemResourceEx = (BOOL (WINAPI *)(HANDLE))GetProcAddress(hGdi, "RemoveFontMemResourceEx");
  10. pRemoveFontResourceEx = (BOOL (WINAPI *)(LPCTSTR,DWORD,PVOID))GetProcAddress(hGdi, "RemoveFontResourceExA");
  11. }
  12. if(HMODULE hGdi = GetModuleHandle(_T("kernel32.dll")))
  13. {
  14. pMoveFileEx = (BOOL (WINAPI *)(LPCTSTR, LPCTSTR, DWORD))GetProcAddress(hGdi, "MoveFileExA");
  15. }
  16. }
  17. CFontInstaller::~CFontInstaller()
  18. {
  19. UninstallFonts();
  20. }
  21. bool CFontInstaller::InstallFont(const CArray<BYTE>& data)
  22. {
  23. return InstallFont(data.GetData(), data.GetSize());
  24. }
  25. bool CFontInstaller::InstallFont(const void* pData, UINT len)
  26. {
  27. return InstallFontFile(pData, len) || InstallFontMemory(pData, len);
  28. }
  29. void CFontInstaller::UninstallFonts()
  30. {
  31. if(pRemoveFontMemResourceEx)
  32. {
  33. POSITION pos = m_fonts.GetHeadPosition();
  34. while(pos) pRemoveFontMemResourceEx(m_fonts.GetNext(pos));
  35. m_fonts.RemoveAll();
  36. }
  37. if(pRemoveFontResourceEx)
  38. {
  39. POSITION pos = m_files.GetHeadPosition();
  40. while(pos)
  41. {
  42. CString fn = m_files.GetNext(pos);
  43. pRemoveFontResourceEx(fn, FR_PRIVATE, 0);
  44. if(!DeleteFile(fn) && pMoveFileEx)
  45. pMoveFileEx(fn, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
  46. }
  47. m_files.RemoveAll();
  48. }
  49. }
  50. bool CFontInstaller::InstallFontMemory(const void* pData, UINT len)
  51. {
  52. if(!pAddFontMemResourceEx)
  53. return false;
  54. DWORD nFonts = 0;
  55. HANDLE hFont = pAddFontMemResourceEx((PVOID)pData, len, NULL, &nFonts);
  56. if(hFont && nFonts > 0) m_fonts.AddTail(hFont);
  57. return hFont && nFonts > 0;
  58. }
  59. bool CFontInstaller::InstallFontFile(const void* pData, UINT len)
  60. {
  61. if(!pAddFontResourceEx) 
  62. return false;
  63. CFile f;
  64. TCHAR path[MAX_PATH], fn[MAX_PATH];
  65. if(!GetTempPath(MAX_PATH, path) || !GetTempFileName(path, _T("g_font"), 0, fn))
  66. return false;
  67. if(f.Open(fn, CFile::modeWrite))
  68. {
  69. f.Write(pData, len);
  70. f.Close();
  71. if(pAddFontResourceEx(fn, FR_PRIVATE, 0) > 0)
  72. {
  73. m_files.AddTail(fn);
  74. return true;
  75. }
  76. }
  77. DeleteFile(fn);
  78. return false;
  79. }