Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 1688 1689 1690 1691 1692 1693 [1694] 1695 1696 1697   вперед  Ctrl
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
ъъъъъ
Короче, для VirtualBox - никаких руфусов не нужно, вообще.
При запуске установки, прямо в первом окне (где выбор языка) жмём Shift + F10, чтобы открываем командную строку, и выполняем команду regedit. Открываем Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup. Создаем раздел LabConfig. Внутри раздела создаем DWORD32 параметры с именами BypassTPMCheck, BypassRAMCheck и BypassSecureBootCheck. Значения параметров = 1. И всё.


Однако, выполнить регистрацию Windows11 Insider Program не получается: "Ваш компьютер не соответствует минимальным требованиям". Ну и фиг с ними, буду не зарегистрированную тестить.
Возможно, с выходом новой версии VirtualBox ситуация изменится.

Сообщение было отредактировано: 16 окт 21, 22:54
16 окт 21, 23:05    [22384654]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2654
ъъъъъ,
А ты в настройках вируальной машины правильные параметры указал? Мне вначале тоже отлуп был пока не поставил 4 ядра и видеопамять на максимум не выкрутил в настройках
17 окт 21, 00:22    [22384668]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
white_nigger

...Мне вначале тоже отлуп был пока не поставил 4 ядра и видеопамять на максимум не выкрутил в настройках

Ты сейчас об инсталляции или регистрации?
17 окт 21, 05:04    [22384678]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2654
ъъъъъ,
Об инсталляции в VirtualBox-e
17 окт 21, 09:36    [22384685]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
white_nigger
ъъъъъ,
Об инсталляции в VirtualBox-e

Я ж написал, что для инсталляции требуется лишь реестр поправить: 22384645
Отказывает выполнить регистрацию (ввод серийника и т.п.) дитрибутив Win11 Insider Program.
17 окт 21, 10:43    [22384689]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
GunSmoker
Member

Откуда:
Сообщений: 3294
Официальный образ серийник спросил, но поставился без него (видимо, в триальном режиме). Ставил на VirtualBox через Rufus, железо не соответствует (нет TPM, не тот проц). Пока работает нормально.
17 окт 21, 13:33    [22384729]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27313
Встречал-ли кто-нибудь готовое решение для передачи строки параметров от вновь запущенного экземпляра запущенному ранее?
19 окт 21, 14:57    [22385499]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67457
Блог
wadman, а чем это отличается просто от передачи любой информации от одного экземпляра другому? Вариантов воз и маленькая тележка. Лично я, наверное, сделал бы через RegisterWindowsMessage/HWND_BROADCAST.
19 окт 21, 15:02    [22385502]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
wadman
Встречал-ли кто-нибудь готовое решение для передачи строки параметров от вновь запущенного экземпляра запущенному ранее?

Ага, я такое сделал.
Через мэилслот. Подробности можень посмотреть в книжке Григорьева "О чем не пишут в книгах по Delphi"
19 окт 21, 15:05    [22385503]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
ъъъъъ
wadman
Встречал-ли кто-нибудь готовое решение для передачи строки параметров от вновь запущенного экземпляра запущенному ранее?

Ага, я такое сделал.
Через мэилслот. Подробности можень посмотреть в книжке Григорьева "О чем не пишут в книгах по Delphi"

При запуске приложение создаёт мэилслот с именем АБВГД, если получилось - значит, этот экземпляр приложения первый, приложение становится сервером мэилслота.
Если создать мэилслот не удалось с кодом завершения "Такой уже существует", приложение коннектится к существующему мэилслоту, отправляет командную строку, и завершается.
19 окт 21, 15:09    [22385505]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
ъъъъъ
ъъъъъ
пропущено...

Ага, я такое сделал.
Через мэилслот. Подробности можень посмотреть в книжке Григорьева "О чем не пишут в книгах по Delphi"

При запуске приложение создаёт мэилслот с именем АБВГД, если получилось - значит, этот экземпляр приложения первый, приложение становится сервером мэилслота.
Если создать мэилслот не удалось с кодом завершения "Такой уже существует", приложение коннектится к существующему мэилслоту, отправляет командную строку, и завершается.


я у себя тоже самое сделал, только трубами. работает великолепно
19 окт 21, 22:50    [22385646]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
makhaon,

да, пайпы прикольны и тем, что можно двустороннюю связь, а мэилслоты - в один конец.
Принцип простой и понятный, я даже в инсталлятор/обновлятор воткнул команды управления через мэилслоты. Вот такой ipc... :)
19 окт 21, 23:01    [22385648]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27313
Спасибо. Эти варианты мне знакомы.
Старею видимо.
Готовенького хотелось, чтоб бросил на форму и только обработчик командной строки прикрутил. :)
20 окт 21, 07:11    [22385682]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5302
VirtualBox релизнулся. В ченджлоге есть:
автор
Windows Guest: Introduced Windows 11 guest support, including unattended installation
20 окт 21, 10:01    [22385715]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
Kazantsev Alexey
VirtualBox релизнулся. В ченджлоге есть:
автор
Windows Guest: Introduced Windows 11 guest support, including unattended installation

А где скачать? Версия 6.1.26 так и висит.

Сообщение было отредактировано: 20 окт 21, 10:08
20 окт 21, 10:09    [22385718]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5302
ъъъъъ
А где скачать? Версия 6.1.26 так и висит.

https://www.virtualbox.org/wiki/Downloads
https://download.virtualbox.org/virtualbox/6.1.28/VirtualBox-6.1.28-147628-Win.exe
https://download.virtualbox.org/virtualbox/6.1.28/Oracle_VM_VirtualBox_Extension_Pack-6.1.28.vbox-extpack
https://www.virtualbox.org/download/hashes/6.1.28/SHA256SUMS

Сообщение было отредактировано: 20 окт 21, 10:14
20 окт 21, 10:14    [22385724]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5302
Попробовал 6.1.28 - без дополнительных Win11 приседаний не ставится.

Сообщение было отредактировано: 20 окт 21, 15:35
20 окт 21, 10:46    [22385743]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2654
wadman
Встречал-ли кто-нибудь готовое решение для передачи строки параметров от вновь запущенного экземпляра запущенному ранее?
Я когда-то давно через File Mapping делал, запущенный экземпляр создавал его с необходимыми данными (собсно хэндлами нужных объектов и параметрами), а второй экземпляр через него уже получал и отправлял данные
20 окт 21, 17:11    [22385976]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
GunSmoker
Member

Откуда:
Сообщений: 3294
wadman, код в интернете - говно.
+

unit IPC;

interface

// Called from DPR, all instances
procedure IPCInit;
procedure IPCDone;

// Called from main form, only active instance
procedure IPCStart(const AMainForm: HWND);
procedure IPCStop;

implementation

type
  PIPCSharedData = ^TIPCSharedData;
  TIPCSharedData = packed record
    MainProcessReady: Bool;
    MainProcessPID: DWord;
    MainProcessWND: HWND;
  end;

const
  IPCName = 'вставить свой';

var
  SharedMemHandle: THandle;
  Initialized: Boolean;

{*------------------------------------------------------------------------------
  Transfer file names from command line to previous instance.
  Waits for prev. instance for WaitForFirstInstance msec. In case of timeout -
  returns False.
  Usually passing files also switches focus to prev. instance. Works fine with
  empty files list (i.e. just activate/bring to front first instance without
  opening new files).

  @return True if operation was completed successfully
  @see    IPCInit
-------------------------------------------------------------------------------}
function PassFilesToPrimaryInstance: Boolean;
const
  WaitForFirstInstance = 5000;
var
  P: PIPCSharedData;
  T, D: DWord;
  MPWnd: HWND;
  MPPID: DWord;
  CDP: TCopyDataStruct;
  Files: TStringList;
  S: UnicodeString;
  X: Integer;
  AllowSetForegroundWindow: function(dwProcessId: DWORD): BOOL; stdcall;
  R: Cardinal;
begin
  if SharedMemHandle = 0 then
  begin
    Result := False;
    Exit;
  end;
  P := MapViewOfFile(SharedMemHandle, FILE_SHARE_READ, 0, 0, 0);
  if P = nil then
  begin
    Result := False;
    Exit;
  end;
  try
      // Wait for first instance to complete its initialization
      T := GetTickCount;
      if not P^.MainProcessReady then
      repeat
        Sleep(200);
        D := GetTickCount;
      until P^.MainProcessReady or (D < T) or (D - T > WaitForFirstInstance);

      // Main app is busy and not responding
      MPWnd := P^.MainProcessWND;
      MPPID := P^.MainProcessPID;
      if not P^.MainProcessReady then
      begin
        Result := False;
        Exit;
      end;

      // Prepare data to send
      if MPWnd <> 0 then
      begin
        if Length(CLP.Files) > 0 then
        begin
          Files := TStringList.Create;
          try
            for X := 0 to Length(CLP.Files) - 1 do
              Files.Add(CLP.Files[X]);
            S := Files.Text;
          finally
            FreeAndNil(Files);
          end;
        end
        else
          S := '*';

      // Foreground activation permission is like love: You can't steal it, it has to be given to you
        AllowSetForegroundWindow := GetProcAddress(GetModuleHandle('user32.dll'), 'AllowSetForegroundWindow');
        if Assigned(AllowSetForegroundWindow) then
          AllowSetForegroundWindow(MPPID);

      // Send data
        FillChar(CDP, SizeOf(CDP), 0);
        CDP.dwData := 1;
        CDP.lpData := Pointer(S);
        CDP.cbData := Length(S) * SizeOf(S[1]);
        R := 0;
        if SendMessageTimeout(MPWnd, WM_COPYDATA, 0, NativeInt(@CDP), SMTO_ABORTIFHUNG, WaitForFirstInstance, @R) <> 0 then
          Result := (R > 0)
        else
          Result := False;
        Finalize(S); // this is just to indicate that S is used in prev line
      end
      else
        Result := False;
  finally
    UnmapViewOfFile(P);
  end;
end;

{*------------------------------------------------------------------------------
  Initializes IPC. Perform checks and transfer files (with giving activation) to
  prev. (active) instance, if needed.
  Called at the very beginning of the program. But the Viewer instance is not
  considered "active" until it calls IPCStart.
  There can be few Viewer instances that called IPCInit, but only one active
  instance that called IPCStart.

  @see    IPCStart
  @see    IPCDone
  @see    PassFilesToPrimaryInstance
-------------------------------------------------------------------------------}
procedure IPCInit;
begin
  Initialized := False;
  try
    if not CLP.ForceOpenSecondInstance then
    begin
      SharedMemHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TIPCSharedData), IPCName);
      if SharedMemHandle = 0 then
        RaiseLastOSError;
    end
    else
      SharedMemHandle := 0;
    if ((SharedMemHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
    begin
      if PassFilesToPrimaryInstance then
        Abort;
      CLP.ForceOpenSecondInstance := True;
      CloseHandle(SharedMemHandle);
      SharedMemHandle := 0;
    end;
  except
    IPCDone;
    raise;
  end;
end;

{*------------------------------------------------------------------------------
  Finalizes IPC. Closes all objects, etc.
  To deactivate instance you must call IPCStop first.

  @see    IPCStop
-------------------------------------------------------------------------------}
procedure IPCDone;
begin
  IPCStop;
  if SharedMemHandle <> 0 then
    CloseHandle(SharedMemHandle);
end;

{*------------------------------------------------------------------------------
  Activates instance in IPC. Usually called, when instance finished
  initialization and ready to work.
  Should be called only after IPCInit and before IPCDone.

  @param  AMainForm Handle of main form.
  @see    IPCInit
  @see    IPCStop
  @see    IPCUpdate
-------------------------------------------------------------------------------}
procedure IPCStart(const AMainForm: HWND);
var
  P: PIPCSharedData;
begin
  if SharedMemHandle <> 0 then
  begin
    P := MapViewOfFile(SharedMemHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if P = nil then
      RaiseLastOSError;
    try
      P^.MainProcessPID := GetCurrentProcessId;
      P^.MainProcessWND := AMainForm;
      P^.MainProcessReady := True;
    finally
      UnmapViewOfFile(P);
    end;
    Initialized := True;
  end;
end;

{*------------------------------------------------------------------------------
  Deactivate instance in IPC.
  You still need to call IPCDone to free resources.
  Should be called only after IPCStart and before IPCDone.

  @see    IPCStart
  @see    IPCDone
-------------------------------------------------------------------------------}
procedure IPCStop;
var
  P: PIPCSharedData;
begin
  if Initialized and (SharedMemHandle <> 0) then
  begin
    Initialized := False;
    P := MapViewOfFile(SharedMemHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if P = nil then
      RaiseLastOSError;
    try
      P^.MainProcessReady := False;
      P^.MainProcessPID := 0;
      P^.MainProcessWND := 0;
    finally
      UnmapViewOfFile(P);
    end;
  end;
end;

end.

    IPCInit;
    try
      Application.Initialize;
      Application.CreateForm(TMainForm, MainForm);
      Application.Run;
    finally
      IPCDone;
    end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  try
    ...
  finally
    IPCStart(Handle);
  end;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  IPCStop;

  ...
end;

procedure TMainForm.CopyData(var Msg: TWMCopyData);
var
  S: UnicodeString;
  Str: TStringList;
  A: TFilesArray;
  X: Integer;
begin
  if Msg.CopyDataStruct^.dwData = 1 then
  begin
    SetLength(S, Msg.CopyDataStruct^.cbData div SizeOf(WideChar));
    Move(Msg.CopyDataStruct^.lpData^, Pointer(S)^, Msg.CopyDataStruct^.cbData);
    if (S <> '') and (S <> '*') then
    begin
      Str := TStringList.Create;
      try
        Str.Text := S;
        SetLength(A, Str.Count);
        try
          for X := 0 to Str.Count - 1 do
            A[X] := Str[X];
          ...
        finally
          Finalize(A);
        end;
      finally
        FreeAndNil(Str);
      end;
    end;
    SwitchTo;
    Msg.Result := 1;
  end
  else
    inherited;
end;

20 окт 21, 17:30    [22385985]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1457
Лайфхак: как тестировать приложение с разными DPI, если в наличии обычный монитор с DPI 96.
Работает на Windows 10.
1. Меняем масштаб экрана на 150%
2. Запускаем программу (нужно убедиться, что всё выглядит чётко)
3. Меняем масштаб экрана на 100%
В результате винда будет автоматически масштабировать окна запущенной программы в меньшую сторону. Выглядеть программа будет также, как на HiDPI мониторе с масштабом 150%, но более размыто. Можно спокойно открывать различные окна и смотреть, как они выглядят.
21 окт 21, 16:23    [22386478]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
asviridenkov
Member

Откуда:
Сообщений: 4054
DmSer,

Разве программа не должна отреагировать на DPI change? Плюс с чего Windows будет сама масштабировать HDPI-aware приложение?
21 окт 21, 16:32    [22386486]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1457
asviridenkov
DmSer,

Разве программа не должна отреагировать на DPI change? Плюс с чего Windows будет сама масштабировать HDPI-aware приложение?


Я D2007 использую. Никак не реагирует (к счастью) :)
Хотя некоторые программы, как я смотрю, на это реагируют, например браузеры. Но у них с поддержкой HiDPI всё замечательно.
21 окт 21, 16:44    [22386494]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
asviridenkov
Member

Откуда:
Сообщений: 4054
DmSer

Я D2007 использую. Никак не реагирует (к счастью) :)


А что тогда вообще проверять, если в любом случае на HDPI без манифеста будет муть.
21 окт 21, 16:47    [22386495]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1457
Манифест разумеется подключен.
21 окт 21, 18:55    [22386587]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
DmSer,

может, у тебя монитор не hdpi? ;)
21 окт 21, 19:03    [22386595]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 1688 1689 1690 1691 1692 1693 [1694] 1695 1696 1697   вперед  Ctrl
Все форумы / Delphi Ответить