-
Хм... Мне Embarcadero вспоминаются исключительно, как производитель какой-то маловнятной глючной тулзовины для работы с БД... :(
-
А мне ничем оно не вспоминается. У меня есть ТР7.0, Д4, Д6. Все меня полностью устраивают. А мафия и кумовство пусть идут лесом. :)
-
Если бы в Delphi сделали прямой вызов функций WinAPI (call без jmp), naked функции, {$CODEALIGN x} и поддержку COFF .obj, было бы здорово.
-
> Тыщ © (08.05.08 01:09) [22] > > Если бы в Delphi сделали прямой вызов функций WinAPI (call > без jmp), naked функции, {$CODEALIGN x} и поддержку COFF > .obj, было бы здорово. >
Ты о своём, личном?
-
Германн © (08.05.08 1:47) [23]
> Ты о своём, личном?
Я думаю, оное не только мне полезно было бы.
-
> Если бы в Delphi сделали прямой вызов функций WinAPI (call > без jmp),
Это как ?
-
> Тыщ © (08.05.08 01:09) [22] > Если бы в Delphi сделали прямой вызов функций WinAPI (call > без jmp)
Var
szDlgTitle,szMsg: PChar;
begin
szDlgTitle := ' --- Assembler Pure and Simple --- ';
szMsg := 'halo world!';
asm
push MB_OK
push szDlgTitle
push szMsg
push 0
call MessageBox
push 0
call ExitProcess
end;
end; а так не канает?
-
> koha © (08.05.08 10:14) [26]
А теперь посмотри в CPU что получилось Вот так это делается =) program Project1;
uses
windows;
var
MessageBox : function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
begin
MessageBox := GetProcAddress(LoadLibrary(User32), 'MessageBoxA');
MessageBox(0, 'Hi', '', 0);
end.
-
> Тыщ © (08.05.08 01:09) [22]
У детей свои проблемы. Delphi для офисных преложений предназначено, а не для 3D маньяков.
-
> Если бы в Delphi сделали прямой вызов функций WinAPI (call > без jmp)
Ты про jmp который из секции импорта делается? ;)
> naked функции
Пиши на асме, чем тебе пролог с эпилогом помешал? Да и inline уже давно появились :)
> {$CODEALIGN x} и поддержку COFF .obj
Зачем?
-
Кистате о naked-функциях: Когда мне потребовалось сымитировать их поведение, был написан такой код:
function HSNtUserCreateWindowEx (p1,p2,p3,p4,p5, X, Y, Width, Height : Integer; hWndParent : HWND; p11, p12,p13,p14,p15 : Integer) : HWND; stdcall; asm pop ebp mov eax,00001157h mov edx,7FFE0300h call edx ret 60 end;
-
> Delphi для офисных преложений предназначено, а не для 3D > маньяков.
Это вы решили?
-
Rouse_ © (08.05.08 11:08) [29]
> Ты про jmp который из секции импорта делается?
Ага. Сейчас call -> jmp [API], а надо бы call [API].
> Пиши на асме, чем тебе пролог с эпилогом помешал?
Иногда хочется, чтоб ret не вставлялся. Можно было бы произвольные данные asm..end генерировать, ret зачастую все портит. Конечно, можно и костылями обходиться, но из-за какой мелкой отсутствующей фичи...
>> {$CODEALIGN x} и поддержку COFF .obj > Зачем?
Первое - для оптимизации, второе - для совместимости с большинством объектников, в OMF сейчас мало что может компилировать. А конвертеры глючные, для больших вещей не годятся. Либо Delphi очень привередлив (то invalid format, то просто не видит символы).
-
> Ага. Сейчас call -> jmp [API], а надо бы call [API].
Предложи другую схему?
Адрес функции из библиотеки DLL неизвестен на этапе компиляции/линковки. Получается, чтобы реализовать твою схему, необходимо будет при загрузке EXE-файла иметь дополнительно специальную таблицу, в которой бы хранились все обращения к этой функции и их подправить. Это может быть как вызов этой функции, так и взятие адреса. Это приводит к тому, что страницы кода с памяти и на диске будут отличаться друг от друга. Возникнут проблемы с тем, чтобы организовать для нескольких приложений использование одних и тех же кодовых страниц. В общем никому не нужный геморрой. Если для какой-то функции тебе так важно не терять на промежуточный JMP, правь адрес руками :)
-
> Ага. Сейчас call -> jmp [API], а надо бы call [API].
Так это не только в Delphi, не переживай
-
Mystic © (08.05.08 13:41) [33]
Ты меня не понял. Я не хочу вызывать функции API настолько напрямую и тем самым терять всю совместимость (это годится разве что для демосценок). Я хочу вызывать через импорт напрямую, как это делают многие другие компиляторы.
-
> Так это не только в Delphi, не переживай
Нет, тут все-же различается. Специально проверял сторонним отладчиком, чтоб не грешить на то как отображает внутренний дизасм у обоих сред. У Delphi E8 B4FFFFFF CALL <JMP.&user32.CreateWindowExA> ; \CreateWindowExA У VC++ FF15 94514400 CALL DWORD PTR DS:[<&USER32.CreateWindowExA>] ; \CreateWindowExA
-
Тыщ © (08.05.08 14:04) [35]
> Я не хочу вызывать функции API настолько напрямую и тем > самым терять всю совместимость (это годится разве что для > демосценок).
пардон, какая совместимость и кого с кем имеется в виду.
Rouse_ © (08.05.08 14:06) [36]
> Специально проверял сторонним отладчиком
убедился что в каких-то конкретных версиях конретных компиляторов это так. И что с того ? Тут экстраполяция неуместна.
-
Игорь Шевченко © (08.05.08 14:17) [37]
> пардон, какая совместимость и кого с кем имеется в виду.
Я так понял, Mystic говорил о вызове функций из dll напрямую, без таблицы импорта вообще. Это уже экстрим.
-
Тыщ © (08.05.08 14:21) [38]
Да, это экстрим.
Но все-таки я не совсем понимаю, чем тебе так jmp помешал :)
|