Как я могу временно загрузить шрифт?

Проблема с интерпретируемыми языками заключается в том, что вы отправляете источник, чтобы заставить их работать (если у вас нет компилятора для байт-кода, но опять же, это довольно тривиально для декомпиляции).

Итак, если вы не хотите жертвовать производительностью, вы можете действовать только на имена переменных и функций, например. заменяя их a, b ... aa, ab ... или a101, a102 и т. д. И, конечно же, удалите столько пространства / новых строк, сколько сможете (это так называемые компрессоры JS). Обфускация строк будет иметь успех, если вы должны зашифровать их и расшифровать их в режиме реального времени. Кроме того, отладчик JS может показывать окончательные значения ...

10
задан Tom 20 September 2008 в 21:19
поделиться

3 ответа

И здесь версия Delphi:

procedure LoadFontFromDll(const DllName, FontName: PWideChar);
var
  DllHandle: HMODULE;
  ResHandle: HRSRC;
  ResSize, NbFontAdded: Cardinal;
  ResAddr: HGLOBAL;
begin
  DllHandle := LoadLibrary(DllName);
  if DllHandle = 0 then
    RaiseLastOSError;
  ResHandle := FindResource(DllHandle, FontName, RT_FONT);
  if ResHandle = 0 then
    RaiseLastOSError;
  ResAddr := LoadResource(DllHandle, ResHandle);
  if ResAddr = 0 then
    RaiseLastOSError;
  ResSize := SizeOfResource(DllHandle, ResHandle);
  if ResSize = 0 then
    RaiseLastOSError;
  if 0 = AddFontMemResourceEx(Pointer(ResAddr), ResSize, nil, @NbFontAdded) then
    RaiseLastOSError;
end;

использоваться как:

var
  FontName: PChar;
  FontHandle: THandle;
...
  FontName := 'DEJAVUSANS';
  LoadFontFromDll('Project1.dll' , FontName);
  FontHandle := CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH,
    FontName);
  if FontHandle = 0 then
    RaiseLastOSError;
10
ответ дан 3 December 2019 в 23:52
поделиться

Я нашел это с Google. Я сократил и вставил соответствующие нормы ниже.

Необходимо добавить шрифт к файлу ресурсов:


34 FONT "myfont.ttf"

Следующий код C загрузит шрифт из ресурса DLL и выпустит его из памяти, когда Вы будете закончены с помощью него.

DWORD   Count;
HMODULE Module   = LoadLibrary("mylib.dll");
HRSRC   Resource = FindResource(Module,MAKEINTRESOURCE(34),RT_FONT);
DWORD   Length   = SizeofResource(Module,Resource);
HGLOBAL Address  = LoadResource(Module,Resource);
HANDLE  Handle   = AddFontMemResourceEx(Address,Length,0,&Count);

/* Use the font here... */

RemoveFontMemResourceEx(Handle);
FreeLibrary(Module);
2
ответ дан 3 December 2019 в 23:52
поделиться

Вот некоторый код, который будет загружать/делать доступный шрифт из Вашего исполняемого файла (т.е., шрифт был встроен как ресурс, а не что-то, что необходимо было обычно устанавливать в Windows).

Обратите внимание, что шрифт доступен любому приложению, пока Ваша программа не избавляется от него. Я не знаю, как полезный Вы найдете это, но я использовал его несколько раз. Я никогда не помещал шрифт в dll (я предпочитаю, чтобы это 'встроило в exe' подход), но не предполагайте, что он изменяет вещи слишком много.

procedure TForm1.FormCreate(Sender: TObject);
var
    ResStream : TResourceStream;
    sFileName : string;
begin
    sFileName:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF';

    ResStream:=nil;
    try
        ResStream:=TResourceStream.Create(hInstance, 'Swisfont', RT_RCDATA);
        try
            ResStream.SaveToFile(sFileName);
        except
            on E:EFCreateError Do ShowMessage(E.Message);
        end;
    finally
        ResStream.Free;
    end;

    AddFontResource(PChar(sFileName));
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
end;


procedure TForm1.FormDestroy(Sender: TObject);
var
    sFile:string;
begin
    sFile:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF';
    if FileExists(sFile) then
    begin
        RemoveFontResource(PChar(sFile));
        SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
        DeleteFile(sFile);
    end;
end;
1
ответ дан 3 December 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: