Форум программистов, компьютерный форум, киберфорум
SuvAlexander
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Delphi RIDL editor fix

Запись от SuvAlexander размещена 13.04.2017 в 15:41
Показов 2800 Комментарии 0
Метки bug, delphi, ridl

В Delphi XE2 - Delphi XE 10.1 RIDL редактор портит DateTime defaultvalue. Например, строка
C#
1
HRESULT _stdcall Load([in, optional, defaultvalue("12:00:00 AM"] DATE aDateFrom)
заменяется на:
C#
1
HRESULT _stdcall Load([in, optional, defaultvalue(0:00:00)] DATE aDateFrom)
После чего файл перестаёт открываться. Проблема известна с 2009 года:
http://qc.embarcadero.com/wc/qcmain.aspx?d=75300

Для решения этой проблемы в Delphi XE2 (если нужен фикс для другой версии Delphi - пишите), из меню "Component\Install Packages" происталлируйте package, содержащий модуль:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
unit URidlFix;
 
interface
 
implementation
 
uses
  Windows, SysUtils, Math;
 
function GetWinProcAddr(const aLib, aProcName: PChar): Pointer;
var
  hLib: HMODULE;
begin
  hLib := LoadLibrary(aLib);
  if hLib = 0 then
    Result := nil
  else
  begin
    Result := GetProcAddress(hLib, aProcName);
    FreeLibrary(hLib);
  end;
end;
 
const
  RidlFormatSettings: TFormatSettings = (
    CurrencyString: '¤';
    CurrencyFormat: 0; // '$1'
    CurrencyDecimals: 2;
    DateSeparator: '/';
    TimeSeparator: ':';
    ListSeparator: ',';
    ShortDateFormat: 'MM/DD/YYYY';
    LongDateFormat: 'dddd, d MMMM yyyy';
    TimeAMString: 'AM';
    TimePMString: 'PM';
    ShortTimeFormat: 'hh:mm';
    LongTimeFormat: 'h:mm:ss ampm';
    ShortMonthNames: ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
    LongMonthNames: ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
    ShortDayNames: ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
    LongDayNames: ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
    ThousandSeparator: ',';
    DecimalSeparator: '.';
    TwoDigitYearCenturyWindow: 80;
    NegCurrFormat: 0;  // '(¤1)'
 );
 
function RidlDateToStr(const aDateTime: TDateTime): String;
begin
  if Floor(aDateTime) = 0 then
    Result := TimeToStr(aDateTime, RidlFormatSettings)
  else
    Result := DateTimeToStr(aDateTime, RidlFormatSettings);
  Result := '"' + Result + '"';
end;
 
procedure RidlVarToUStr(var S: UnicodeString; const V: TVarData);
begin
  if V.VType = varDate then
    S := RidlDateToStr(V.VDate)
  else
    S := Variant(V);
end;
 
procedure x86CodeGen_SetRelativeOffset(var aRelativeAddress: Integer; aTo: PAnsiChar);
begin
  aRelativeAddress := aTo - @aRelativeAddress - SizeOf(aRelativeAddress);
end;
 
function BeginWrite(const aCode: Pointer; aSize: Integer): Cardinal;
begin
  if not VirtualProtect(aCode, aSize, PAGE_EXECUTE_READWRITE, @Result) then
    RaiseLastOSError;
end;
 
procedure EndWrite(const aCode: Pointer; aSize: Integer; aOldProtect: Cardinal);
begin
  if not VirtualProtect(aCode, aSize, aOldProtect, @aOldProtect) then
    RaiseLastOSError;
  if ((aOldProtect or PAGE_EXECUTE) <> 0) and  not FlushInstructionCache(GetCurrentProcess, aCode, aSize) then
    RaiseLastOSError;
end;
 
procedure x86CodeGen_RelativeOffset(var aCode: Integer; aJmpTo: Pointer);
var
  aOldProtect: Cardinal;
begin
  aOldProtect := BeginWrite(@aCode, SizeOf(aCode));
  x86CodeGen_SetRelativeOffset(aCode, aJmpTo);
  EndWrite(@aCode, SizeOf(aCode), aOldProtect);
end;
 
procedure Install;
var
  aAddr: PAnsiChar;
begin
  aAddr := GetWinProcAddr('tlib160.bpl', '@Idlwrite@VarArgToString$qqrrx10tagVARIANT');
  if aAddr = nil then
    exit;
  inc(aAddr, 38);
  if aAddr^ <> #$E8 then
    exit;
  x86CodeGen_RelativeOffset(PInteger(aAddr+1)^, @RidlVarToUStr);
end;
 
initialization
  Install;
end.
Метки bug, delphi, ridl
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru