업데이트 프로세스 중에 프로그래밍 방식으로 글꼴 패키지를 배포하고 싶습니다. 따라서 \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);
}
실제로 배포 및 글꼴의 전체 시스템을 대체 할 수있는 깨끗한 방법이 있나요?
사실 OS 이미지의 일부가 아닌 사용자 정의 글꼴입니다. 백그라운드 서비스가 글꼴을 대체하려고 시도하는 동안 문제는 글꼴을 사용하여 포 그라운드에서 실행되는 응용 프로그램이라고 생각합니다. XIP 파일에 대한 귀하의 힌트를 보내 주셔서 감사합니다. 웹상의 syscache 디렉토리에 자원이 있습니까? 나는 아무 것도 찾을 수 없었다. – Gene
"windows ce syscache"에 대한 웹을 esarch하면 많은 자원을 찾을 수 있습니다 (나만이 아니라 :-)). – josef
VMWare, NHibernate, Windows 7 및 Spring에 대해 많이 알지만 공식 MSDN 기사 나 블로그 항목은 없습니다. 그러나, 나는 그것을 시도 줄 것이다 :) – Gene