Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 131
#586: 2021-07-14 19:33:25 ЛС | профиль | цитата
Netspirit писал(а):
В частности, KOL заменяет собой модули SysUtils, StrUtils, Classes (и оконный интерфейс Forms, Controls и др.), поэтому таких модулей нет с компилятором Delphi.
Вот это класс! А то я вставлял эти модули, для себя, в пакет Delphi, не всё можно было KOLом заменить.
Спасибо за ответ!
Буду пробовать.
P.S.
Из описания в начале топика я понял, что надо ставить отдельной программой, как HiAsm.NET, и заменять пакет Delphi на файлы из твоего пакета, а встроить в стандартный Hiasm никак не получится. Чтобы был и Delphi и FPC?
Был же давно какой то пакет FPC и он уживался с Delphi. Только компилятор нужно было переключить.

Редактировалось 2 раз(а), последний 2021-07-15 08:51:38
карма: 6

0
Ответов: 4621
Рейтинг: 746
#587: 2021-07-15 10:36:26 ЛС | профиль | цитата
flint2 писал(а):
а встроить в стандартный Hiasm никак не получится. Чтобы был и Delphi и FPC?

Это и есть "стандартный HiAsm", то-есть, мой инсталлятор не содержит самого HiAsm. Просто копируешь тот HiAsm, что есть у тебя (в т. ч. с компилятором Delphi) в отдельную папку, дополнительно устанавливаешь туда новый FPC моим инсталлятором и подменяешь папку пакета.

"Стандартный HiAsm" в том смысле чтобы распространялся "официально" с этого сайта и не требовал от пользователей дополнительных движений - разработчики это не посчитали нужным.
карма: 26

0
Ответов: 2059
Рейтинг: 131
#588: 2021-07-15 10:54:02 ЛС | профиль | цитата
Netspirit, спасибо!
Вот теперь всё стало кристально прозрачно и понятно!
карма: 6

0
Ответов: 4621
Рейтинг: 746
#589: 2021-08-02 11:39:03 ЛС | профиль | цитата
Joiner писал(а):
К сожалению на FPC-64/FPC-64U без изменений 49744124.9999999
В общем, это особенность компилятора. В 32-битных приложениях промежуточные результаты вычислений хранятся в типе Extended (10 байт), в конце преобразуются к требуемому (например, Double). В 64-битных приложениях промежуточные результаты хранятся в Double (8 байт), что приводит к меньшей точности результата.

Редактировалось 1 раз(а), последний 2021-08-04 12:30:53
карма: 26

0
Ответов: 537
Рейтинг: 14
#590: 2021-08-13 21:17:34 ЛС | профиль | цитата
Делаю программу для поиска текста в таблицах, она построчно читает строки и если встречается нужное слово, копирует строку, язык Иврит, виндовс на русском. Компилирую в FPC-64U. Слова на иврите хорошо работают в Memo, для поиска текста использую StrMask, но не вставляется иврит в поле для маски, вместо букв появляются вопросительные знаки, можно это как то исправить?
карма: 4

0
Ответов: 4621
Рейтинг: 746
#591: 2021-08-16 11:49:19 ЛС | профиль | цитата
"Не вставляет в поле" - в смысле когда редактируешь схему и задаёшь свойство Mask компонента?
Если да, то причина в том что сама среда HiAsm является ANSI - работает только с "языком для программ не поддерживающих Юникод" в Панели управления. Скорее всего у тебя там стоит "русский". Поставь "иврит" и перезагрузись - будет работать. Но сам HiAsm и прочие русскоязычные программы, не поддерживающие Юникод, будут показывать крякозябры.

Выход: сделай программку, которая будет переводить юникодный текст в HEX. Добавь в свою схему компонент DoData или Memory, запиши в него сконвертированный текст в этом HEX представлении. На выходе из компонента ставь конвертор HEX->String и результат подавай на свойство Mask (включить точку для свойства). Прицепи DoData к событию onCreate формы.
карма: 26

0
Ответов: 537
Рейтинг: 14
#592: 2021-08-16 17:00:32 ЛС | профиль | цитата
Можно и так. Сделал по другому, слова на иврите хранятся в txt документе, при загрузке программы, она считывает строки и подает на точки Mask. Крайне не удобно, но работает.
Если поставить иврит для программ, то в место русских букв будет иврит в самой среде хайясм. Сложно так работать
карма: 4

0
Ответов: 537
Рейтинг: 14
#593: 2021-09-05 09:05:49 ЛС | профиль | цитата
При создании программ обнаружил пару ошибок в компиляторе.
1) Не правильно записывается путь в реестр, вместо C:\Windows\Media\Characters\Windows Ding.wav записывается C:\Windows\Media\Chara и это только если компилировать FPC-64U и FPC-64U, в остальных правильно записывается.
2) С компилятором FPC-64U и FPC-64U нельзя открыть какой нибудь файл кроме .exe, например картинку, текст и т.д. С помощью WinExec можно открыть только программу и ничего более, точка doShellExec не работает с этими компиляторами. Смотрите пример
Add(MainForm,2953706,189,56)
{
}
Add(Registry,11471578,245,112)
{
HKey=1
Key="AppEvents\Schemes\Apps\.Default\.Default\.Current"
Data="C:\\Windows\\Media\\Characters\\Windows Ding.wav"
}
Add(Button,7276580,189,119)
{
Left=15
Top=15
Caption="Reg"
link(onClick,11471578:doWrite,[])
}
Add(ODialog,5270751,245,168)
{
link(onExecute,13184427:doShellExec,[])
}
Add(WinExec,13184427,301,161)
{
}
Add(Button,5533530,189,168)
{
Left=15
Top=50
Caption="Open"
link(onClick,5270751:doExecute,[])
}


Редактировалось 1 раз(а), последний 2021-09-05 09:06:11
карма: 4

0
Ответов: 4621
Рейтинг: 746
#594: 2021-09-06 11:38:02 ЛС | профиль | цитата
Для исправления реестра строка 480 файла hiRegistry.pas должна выглядеть так:
PutData(Name, PChar(Value), (Length(Value)+1)*SizeOf(Char), rdString);


Для исправления WinExec строка 198 в файле hiWinExec:
if ShellExecute(0, Pointer(Action), PChar(Fn), Pointer(Params), Pointer(WD), _prop_Mode) > 32 then


Редактировалось 1 раз(а), последний 2021-09-06 11:43:35
карма: 26

0
Ответов: 537
Рейтинг: 14
#595: 2021-09-06 20:46:38 ЛС | профиль | цитата
Спасибо, теперь работает
карма: 4

0
Ответов: 2059
Рейтинг: 131
#596: 2021-09-07 13:16:41 ЛС | профиль | цитата
И у метя тоже заработало!
карма: 6

0
Ответов: 1342
Рейтинг: 31
#597: 2021-09-27 20:20:36 ЛС | профиль | цитата
Roun после округления да и не только, double2str так же вёл себя, оставляет максимально много ноликов, при округлении 0.12312312312 до 0.01 оставит 0.1200000001

Редактировалось 1 раз(а), последний 2021-09-27 20:21:24
карма: 2

0
Ответов: 233
Рейтинг: 12
#598: 2021-10-11 15:54:36 ЛС | профиль | цитата
Netspirit, Подскажи пожалуйста, нестандартный компонент по получению прав Админа при компиляции x64 ругается на

hiAdminAppEx.pas(48,66) Error: Call by var for arg no. 3 has to match exactly: Got "LongWord" expected "QWord"
hiAdminAppEx.pas(136) Fatal: There were 1 errors compiling module, stopping

Как это исправить?

unit hiAdminAppEx;

// version: 1.6
// Date: 25.03.2017

interface

uses Kol,Share,Debug,Windows,ShellAPI;

type
THIAdminAppEx = class(TDebug)
private
public
_prop_AppletClose:boolean;

_event_onError:THI_Event;
_event_onNoAdmin:THI_Event;
_event_onYesAdmin:THI_Event;

procedure _work_doCheckPrivilege(var _Data:TData; Index:word);
procedure _work_doElevatePrivilege(var _Data:TData; Index:word);
procedure _var_IsElevated(var _Data:TData; Index:Word);
end;

implementation

function GetWinVer: Integer;
var OsVer: OSVERSIONINFO;
begin
OsVer.dwOSVersionInfoSize:= SizeOf(OSVERSIONINFO);
GetVersionEx(OsVer);
Result:= OsVer.dwMajorVersion;
end;

function isAdmin: Boolean;
const
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
siaNtAuthority: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
var
hAccessToken: Cardinal;
ptgGroups: PTokenGroups;
dwInfoBufferSize: DWORD;
psidAdmins: PSID;
i: Integer;
begin
Result:= false;
if OpenProcessToken(GetCurrentProcess, TOKEN_READ, hAccessToken) then begin
ptgGroups:= GetMemory(1024);
try
if GetTokenInformation(hAccessToken,
TokenGroups,
ptgGroups,
1024,
dwInfoBufferSize) then begin

if AllocateAndInitializeSid(siaNtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
psidAdmins) then
try
for i:= 0 to ptgGroups^.GroupCount - 1 do
if EqualSid(psidAdmins, ptgGroups^.Groups[i].Sid) then begin
Result:= True;
Break;
end;
finally
FreeSid(psidAdmins);
end;
end;
finally
FreeMemory(ptgGroups);
end;
end;
end;

function IsElevated: Boolean;
const
TokenElevation = TTokenInformationClass(20);
type
TOKEN_ELEVATION = record
TokenIsElevated: DWORD;
end;
var
TokenHandle: THandle;
ResultLength: Cardinal;
ATokenElevation: TOKEN_ELEVATION;
begin
if GetWinVer >= 6 then
begin
TokenHandle := 0;
if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then
begin
try
ResultLength := 0;
if GetTokenInformation(TokenHandle, TokenElevation, @ATokenElevation, SizeOf(ATokenElevation), ResultLength) then
Result := ATokenElevation.TokenIsElevated <> 0
else
Result := False;
finally
CloseHandle(TokenHandle);
end;
end
else
Result := False;
end
else
Result := isAdmin;
end;

procedure THIAdminAppEx._work_doCheckPrivilege;
begin
if IsElevated then _hi_onEvent(_event_onYesAdmin) else _hi_onEvent(_event_onNoAdmin);
end;

procedure THIAdminAppEx._work_doElevatePrivilege;
begin
if not IsElevated then
begin
if ShellExecute(0,'runas',PChar(ParamStr(0)),nil,nil,SW_SHOWNORMAL) <= 32 then
if GetLastError <> 1223 then
_hi_onEvent(_event_onError, 'Error: # ' + Int2Str(GetLastError) + #13 +
SysErrorMessage(GetLastError));
if _prop_AppletClose then Applet.Close;
end;
end;

procedure THIAdminAppEx._var_IsElevated;
begin
dtInteger(_Data,Integer(IsElevated));
end;

end.

UPD Разобрался! Если кому пригодится:


hAccessToken: Cardinal;

заменить на

hAccessToken: {$ifdef FPC64} QWord; {$else} Cardinal; {$endif}

Редактировалось 3 раз(а), последний 2021-10-11 17:35:45
карма: 2

0
Ответов: 4621
Рейтинг: 746
#599: 2021-10-11 17:59:56 ЛС | профиль | цитата
В строке 41:
var
hAccessToken: THandle;

карма: 26

1
Голосовали:Iliya
Ответов: 15
Рейтинг: 0
#600: 2021-10-21 22:52:43 ЛС | профиль | цитата
Проблема с компонентом VBJScript как только появляется на форме программа перестаёт компилироваться. Ругается что нет ActiveKOL. Может кто знает как это обойти?
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)