2013-08-12 19 views
0

我想在我的系統中安裝一種新的字體,但是在我的代碼中出現錯誤,我找不到我犯的錯誤。在我調用CopyFile之後,該文件不存在於C:\ Windows \ Fonts中。可以給我一些建議嗎?謝謝。 這裏是我的代碼:爲什麼我不能將字體文件複製到c: Windows Fonts中CopyFile

`//the source file 
string sSourceDir = "F:\\my_job\\font\\"; 
//the file name 
string sFontFileName = "jdqw.TTF"; 
string sFontName = "jdqw"; 
TCHAR sWinDir[MAX_PATH]; 

GetWindowsDirectory(sWinDir, MAX_PATH); 

string sFontDir(sWinDir); 
//make the path like C:\\Windows\\Fonts 
sFontDir += "\\Fonts\\"; 
string sFOTFile = sFontDir; 
sFOTFile += sFontFileName.substr(0, sFontFileName.length() - 4); 
sFOTFile += ".FOT"; 
string source = sSourceDir; 
string dest = sFontDir; 
source += sFontFileName; 
dest += sFontFileName; 

//copy file 
cout << source.c_str() << " " << dest.c_str() << endl; 
cout << CopyFile(source.c_str(), dest.c_str(), FALSE) << endl; 
cout << GetLastError() << endl;` 
+2

'CopyFile'(和'GetLastError')返回什麼? (另外,我猜這是缺少權限) – Hasturkun

+0

CopyFile返回1,GetLaseError值爲0,我的權限是manager.the文件存在於C:\ Windows \ Fonts中,但它沒有使用。沒有名稱,沒有屬性,一旦閃光,它不見了 –

+0

我不認爲它可能複製字體到字體文件夾沒有安裝字體第一。需要'CreateScalableFontResource'和'AddFontResource' APIs – SSpoke

回答

1

有一個pretty good description by Michael Kaplan。總之,你不能也不應該複製文件,因爲它是一個虛擬視圖。相反,請使用適當的方法:撥打AddFontResourceEx,傳遞適當的標誌。如果字體是系統可用的,則廣播WM_FONTCHANGE。要永久安裝字體,您需要管理員權限(即UAC提升),因爲您需要列出HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts下的字體文件名。

您可能想考慮從您的安裝程序執行這些步驟,因爲它通常以必要的權限運行。

+0

謝謝所有。我已經解決了這個問題。它似乎將文件複製到像C:\ Windows \ Fonts這樣的虛擬視圖是不允許的。所以我不復制它,我在函數中使用字體文件的絕對路徑(AddFontResource ),在機器重新啓動後,字體必須再次安裝一次,這有點不好。 –

相關問題