2013-07-03 2 views
2

업데이트 프로세스 중에 프로그래밍 방식으로 글꼴 패키지를 배포하고 싶습니다. 따라서 \Windows\Fonts의 이전 글꼴 파일을 ZIP 보관 파일에서 추출한 새로운 글꼴 파일로 대체해야합니다. 기존 글꼴 파일을 삭제하면 파일에 액세스하는 다른 프로세스로 인해 IOException이됩니다.현재 사용중인 글꼴을 제거/대체하는 방법

RemoveFontResource을 호출하고 변경 내용을 WM_FONTCHANGE 메시지로 전파하지만 행운을 보지 않으려 고 시도했습니다. RemoveFontResource은 기본 오류 2 (파일을 찾을 수 없습니까?) 및 HRESULT -2147467259 인 false을 반환합니다. 파일이 실제로 존재합니다.

샘플 코드 :

[DllImport("coredll.dll", SetLastError = true)] 
private static extern int RemoveFontResource(string lpName); 

[DllImport("coredll.dll", SetLastError = true)] 
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 

private const int WM_FONTCHANGE = 0x001D; 
private const int HWND_BROADCAST = 0xffff; 

public const string SAMPLE_FILE = @"\Windows\Fonts\MyFont.ttf"; 

public void RemoveFont() 
{ 
    if (!RemoveFontResource(SAMPLE_FILE)) 
    { 
    throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    SendMessage(new IntPtr(HWND_BROADCAST), WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero); 

    File.Delete(SAMPLE_FILE); 
} 

실제로 배포 및 글꼴의 전체 시스템을 대체 할 수있는 깨끗한 방법이 있나요?

답변

2

글꼴 파일이 OS 이미지의 일부인 경우 XIP (eXecute-In-Place) 속성 세트 (읽기 전용, 시스템, ROM)가 있으며 단순히 바꿀 수 없습니다. 원본 파일을 숨기는 동일한 이름의 파일을 맨 위에 복사 할 수 있지만. 맨 위에 복사 된 파일이 삭제되면 원래 파일이 복원됩니다. 모든 XIP 파일의 경우입니다.

파일을 바꾸려면 SysCache 디렉토리를 사용하는 것이 좋습니다. XIP, 드라이버, DLL, 사용 중이거나 교체 용으로 잠겨 있어도 상관없이 모든 파일 교체에서 작동합니다.

원본 파일과 동일한 이름의 파일을 syscache 디렉토리에두면 원본 파일 대신이 파일이 사용됩니다. 그러나 syscache 디렉토리에 파일을 배치 한 후 장치를 warmboot해야합니다. Windows CE/Mobile은 OS 시작시에만 syscache 파일을 인식하고 '사용'합니다.

syscache 디렉토리의 위치는 OS 버전 및 OEM 결정에 따라 다를 수 있습니다. WM 6 장치에서는 \ Windows \ System \ syscache가되어야합니다. 장치의 파일 시스템에서 기존 syscache 디렉토리를 확인하십시오.

BTW : \ Windows \ Fonts에 글꼴 파일을 넣을 필요가 없으므로 \ Windows에 둘 수 있습니다.

+0

사실 OS 이미지의 일부가 아닌 사용자 정의 글꼴입니다. 백그라운드 서비스가 글꼴을 대체하려고 시도하는 동안 문제는 글꼴을 사용하여 포 그라운드에서 실행되는 응용 프로그램이라고 생각합니다. XIP 파일에 대한 귀하의 힌트를 보내 주셔서 감사합니다. 웹상의 syscache 디렉토리에 자원이 있습니까? 나는 아무 것도 찾을 수 없었다. – Gene

+0

"windows ce syscache"에 대한 웹을 esarch하면 많은 자원을 찾을 수 있습니다 (나만이 아니라 :-)). – josef

+0

VMWare, NHibernate, Windows 7 및 Spring에 대해 많이 알지만 공식 MSDN 기사 나 블로그 항목은 없습니다. 그러나, 나는 그것을 시도 줄 것이다 :) – Gene