![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Offset на строковую константу [D7, ME]
Ллирик © (2010-10-22 00:57:00)У меня не хочет компилироваться такой код:
const
Keymouse = 'Keymouse.sys';
............
asm
.......
push offset Keymouse
..........
end;
Будьте добры, подскажите, что мне сделать.
Anatoly Podgoretsky (2010-10-23 07:18:00) [81]
> про первый про первый) да и то шутя)
Я уже спрашивал, но вопрос был проигнорировал - какой string?
Германн (2010-10-23 02:18:00) [82]
> Давайте конкретно - какую именно функцию Вы хотите вызвать?
Присоединяюсь к вопросу. Любую процедуру/функцию WinAPI можно вызвать из программы на Дельфи без всяких ассемблеров.
Но вот ".sys" и "offset" меня смущают. Не пытается ли автор лезть в функции драйвера "по старинке"?
Фокус_Ник (2010-10-23 01:54:00) [83]
> Ллирик © (23.10.10 01:51) [14]
Давайте конкретно - какую именно функцию Вы хотите вызвать?
Ллирик (2010-10-23 01:51:00) [84]
> sniknik © (22.10.10 22:46) [7]
> не нужен.
> push offset Keymouse[1];
> аналог PChar будет, и даже #0 в конце будет. дельфи магия
> работы со строками...
const
Keymouse: String = 'Keymouse.sys';
push offset Keymouse[1] не работает( Смещение получается совсем другим
> sniknik © (23.10.10 01:28) [12]
>
> и кстати ты про какой байт? про первый или про "даже #0
> в конце будет". если второе то это показатель как ты знаешь
> ассемблер.
>
про первый про первый) да и то шутя)
Фокус_Ник (2010-10-23 01:46:00) [85]> PChar пробовал. Компилируется
Значит, должно работать. Конечно, если все сделано правильно.
> но потом глянул в OllyDebugger`е, по этому адресу находится не строка,
> а какая-то ерунда.
Значит, что-то сделано неправильно.
> Если вызывать api, не на ассемблере, то Делфи ругается не на строки,
> а на 0 или nil, да на 1.
Если ругается - значит, вызов неправильный.
================
Не могу понять - зачем Вам ассемблер, если даже такая элементарщина уже вызывает проблемы?
Ругается тут, ругается там... каждое такое "ругательство" как раз и говорят о причине ошибки, поэтому их надо читать, переводить, думать, въезжать и устранять. А не думать, что, мол, вызову из Ассемблера - и сразу все заработает. Потому что никакой Ассемблер неверный код верным не сделает.
sniknik (2010-10-23 01:28:00) [86]и кстати ты про какой байт? про первый или про "даже #0 в конце будет". если второе то это показатель как ты знаешь ассемблер.
sniknik (2010-10-23 01:25:00) [87]ну, если для тебя один лишний байт неэффективно, то дельфи не для тебя...
он там будет, и не один, "лишний", причем сделаешь ты так или как-то по другому, или вообще не будешь ничего с этим делать, просто по самиму факту наличия строки. (а также динамических массивов/обьектов/rtti/vcl/модулей с их разделами инициализации/выравнивания/... везде есть свои "лишние" байты, и даже килобайты...)
Ллирик (2010-10-23 01:00:00) [88]
> Фокус_Ник (22.10.10 21:26) [6]
>
> Наверное, там нужен PChar? И не нужны никакие ассемблеры.
PChar пробовал. Компилируется, но потом глянул в OllyDebugger`е, по этому адресу находится не строка, а какая-то ерунда.
>
> Вместо того, чтобы почитать справку по стоковым типам, или
> посмотреть примеры в Инете...
>
Если вызывать api, не на ассемблере, то Делфи ругается не на строки, а на 0 или nil, да на 1.
> sniknik © (22.10.10 22:46) [7]
> не нужен.
> push offset Keymouse[1];
> аналог PChar будет, и даже #0 в конце будет. дельфи магия
> работы со строками...
>
Наверно можно и так, но не эффективно, лишний байт в коде))
sniknik (2010-10-23 00:29:00) [89]> если при вызове функции API можно взять длинную строку и просто привести тип?
а тут что? -> Плохиш © (22.10.10 01:42) [1]
и что думаешь делается при приведении типа со строки в PChar? результаты равнозначны.
> А в случае константы даже и тип приводить не надо, все и так вызовется.
а в случае константы
> не хочет компилироваться такой код:
> Сначала ассемблерный код,
автор хочет, говорит ассемблер ему понятнее
> а потом "ассемблер не нужен".
правда жизни... ради вызовов апишных функций, ассемблер не нужен.
Фокус_Ник (2010-10-22 23:21:00) [90]> sniknik © (22.10.10 22:46) [7]
1. Зачем делать аналог PChar, если при вызове функции API можно взять длинную строку и просто привести тип? А в случае константы даже и тип приводить не надо, все и так вызовется.
2. Сначала ассемблерный код, а потом "ассемблер не нужен". Как понять тебя, Саид?
sniknik (2010-10-22 22:46:00) [91]> Наверное, там нужен PChar?
не нужен.
push offset Keymouse[1];
аналог PChar будет, и даже #0 в конце будет. дельфи магия работы со строками...
> И не нужны никакие ассемблеры.
а вот тут согласен.
Фокус_Ник (2010-10-22 21:26:00) [92]> Ллирик © (22.10.10 20:21) [5]
> Я некоторые api вызвать не могу с теми аргументами, которые
> мне нужны, при компиляции Делфи на них ругается)
Наверное, там нужен PChar? И не нужны никакие ассемблеры.
> Вот и решил вызывать функции постаринке
Вместо того, чтобы почитать справку по стоковым типам, или посмотреть примеры в Инете...
> Делфи начал изучать всего лишь две недели назад
В Делфи несколько строковых типов (ShortString, AnsiString, WideString) и соответствующие им указатели (PShortString, PChar, PWideChar).
См. справку по типам данных (и особенно обратите внимание на строки с управляемым временем жизни).
Ллирик (2010-10-22 20:21:00) [93]Я некоторые api вызвать не могу с теми аргументами, которые мне нужны, при компиляции Делфи на них ругается) Вот и решил вызывать функции постаринке, тем более что я знаю хорошо. Это я Делфи начал изучать всего лишь две недели назад
sniknik (2010-10-22 19:02:00) [94]чего ты там оптимизировать на ассемблере собрался с такими знаниями?
Anatoly Podgoretsky (2010-10-22 18:58:00) [95]Какой String?
Ллирик (2010-10-22 18:21:00) [96]Так String добавляет в первый байт размер строки, а мне этого не надо
Плохиш (2010-10-22 01:42:00) [97]
const
Keymouse: String = 'Keymouse.sys';