你可以放到temp文件夹里。然后用锁定的方法。Q:我有一些特殊语言的字体来用,它们存储在我的EXE文件里,但是两点。 * 我不想放到font文件夹里 * 我不想从EXE文件里面提取出来如果可能,请告诉我。因为,我的字体是自己做的不是windows自带的,我想保护自己的东西。A:不太可能,必须提取出来。你可以使用这个保护过程来保护你的文件不被修改和删除。在EXE执行的时候把字体放到临时文件夹里,结束的时候删除它。function ProtectFile(sFilename : string) : hFile; var hf: hFile; lwHFileSize, lwFilesize: longword; ofs : TOFStruct; begin if FileExists(sFilename) then begin hf := OpenFile(pchar(sFilename), ofs, OF_READ or OF_WRITE or OF_SHARE_EXCLUSIVE); if hf <> 0 then begin lwFilesize := GetFileSize(hf, @lwHFileSize); if LockFile(hf, 0, 0, lwFilesize, lwHFilesize) then Result := hf else Result := 0; end else Result := 0; end else Result := 0; end;//.. var ResS: TResourceStream; TempPath: array [0..MAX_PATH] of Char; TempDir: string; begin GetTempPath(Sizeof(TempPath), TempPath); TempDir := StrPas(Path); ResS := TResourceStream.Create(hInstance, 'SOME_FONT', 'RT_FONT'); ResS.SavetoFile(TempDir+'some_font.ttf'); ResS.Free; AddFontResource(TempDir+'some_font.ttf'); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); ProtectFile(TempDir+'some_font.ttf'); end; 仅仅是提取保护字体文件的方法。DLL文件一样可行。你可以尝试这么做。文件流是一定不行,dll必须已文件形式加载到内存。
function ProtectFile就是保护文件的一个函数。可以用它来锁定你的文件。等你的application terminated之后,再删除你的dll文件就是了。其实我给出的代码关键还是在第一个函数上。第二个实际应用自己写吧。我没有时间了,今天中午就要奔赴上海工作了。字体文件其实和dll一个性质,如果不提取出来,那是不能加载到内存的。请记住。
搬凳子来了
* 我不想从EXE文件里面提取出来如果可能,请告诉我。因为,我的字体是自己做的不是windows自带的,我想保护自己的东西。A:不太可能,必须提取出来。你可以使用这个保护过程来保护你的文件不被修改和删除。在EXE执行的时候把字体放到临时文件夹里,结束的时候删除它。function ProtectFile(sFilename : string) : hFile;
var
hf: hFile;
lwHFileSize, lwFilesize: longword;
ofs : TOFStruct;
begin
if FileExists(sFilename) then
begin
hf := OpenFile(pchar(sFilename), ofs, OF_READ or OF_WRITE or OF_SHARE_EXCLUSIVE);
if hf <> 0 then
begin
lwFilesize := GetFileSize(hf, @lwHFileSize);
if LockFile(hf, 0, 0, lwFilesize, lwHFilesize) then
Result := hf else Result := 0;
end
else Result := 0;
end
else Result := 0;
end;//..
var
ResS: TResourceStream;
TempPath: array [0..MAX_PATH] of Char;
TempDir: string;
begin
GetTempPath(Sizeof(TempPath), TempPath);
TempDir := StrPas(Path);
ResS := TResourceStream.Create(hInstance, 'SOME_FONT', 'RT_FONT');
ResS.SavetoFile(TempDir+'some_font.ttf');
ResS.Free;
AddFontResource(TempDir+'some_font.ttf');
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
ProtectFile(TempDir+'some_font.ttf');
end;
仅仅是提取保护字体文件的方法。DLL文件一样可行。你可以尝试这么做。文件流是一定不行,dll必须已文件形式加载到内存。