![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Аналог сишного sscanf? [D7, XP]
Alex_C © (2006-03-06 10:34:00)Есть ли в дельфи аналог sscanf?
MBo (2006-03-07 13:04:00) [1]>стек Delphi корректно сформирует
Ну наверно, да (только указатели на переменные нужны)
Для моего примера в стек толкается 4 аргумента, и после sscanf делается восстановление стека add esp,$10
В хелпе только это:
When importing a C function that takes a variable number of parameters, use the varargs directive. For example,
function printf(Format: PChar): Integer; cdecl; varargs;
The varargs directive works only with external routines and only with the cdecl calling convention.
Игорь Шевченко (2006-03-07 12:44:00) [2]MBo © (07.03.06 12:38) [6]
Спасибо. Не думал, что в 6-ке работает. То есть, количество аргументов в вызове может быть сколь угодно длинным, я правильно понимаю ?
И никто не мешает, при соотвествующих объявлениях, написать такой вызов
DbgPrintEx (1, 3,
'NtCreateFile (%wZ, %I64X, %I64X) failed with %X \n',
FileName, MinimumSize.QuadPart, MaximumSize.QuadPart, Result);
где, соответственно, первый параметр имеет тип PUNICODE_STRING, а два следующих Int64, стек Delphi корректно сформирует
?
(6-ки нету под рукой проверить)
MBo (2006-03-07 12:40:00) [3]еще здесь есть дельфийские варианты:
http://rsdn.ru/Forum/Message.aspx?mid=804528#804528
Leonid Troyanovsky (2006-03-07 12:40:00) [4]
> Alex_C © (07.03.06 11:46) [4]
> Move(s1, Pointers[i]^, Length(s1) + 1);
> И из-за этого ф-ция не работает!
Это не работает исключительно из-за кривости.
Видимо, имелось ввиду что-то вроде: PString(Pointers[i])^ := s1;
И, вообще, sscanf - место на свалке истории.
--
Regards, LVT.
MBo (2006-03-07 12:38:00) [5]>а синтаксис вызова какой?
Вещественное число ввести навскидку не получилось - не знаю, какой формат использовать
var
i: Integer;
d: Double;
pc: PChar;
s: string;
Readed: Integer;
begin
s := 'asdfg 5';
GetMem(pc, 100);
Readed := Sscanf(PChar(s), PChar('%s %d'), pc, @i);
Caption := Format('%s %d', [pc, i]);
FreeMem(pc);
>и для какой версии delphi это применимо?)
В 6 работает.
Игорь Шевченко (2006-03-07 12:10:00) [6]MBo © (06.03.06 12:54) [1]
а синтаксис вызова какой ?
(и для какой версии delphi это применимо?)
Alex_C (2006-03-07 11:46:00) [7]Ну дык нифига себе оптимизация!!! )))
С оптимизировал называется!
А переменная используется дальше
Move(s1, Pointers[i]^, Length(s1) + 1);
И из-за этого ф-ция не работает!
API (2006-03-07 10:20:00) [8]Не погу понять - из-за чего такое может произойти?
Из-за оптимизации. Скорее всего, эта переменная является просто счетчиком, и больше нигде не используется.
Alex_C (2006-03-07 10:17:00) [9]Ок! Спасибо!
Еще вопрос - нашел в инете реализацию данной ф-ции. Но она не работает. Стал разбираться - какая то мистика! Проблема здесь:
for i := 0 to High(Pointers) do
- запускаю - смотрю при первом проходе переменную i , а она вместо нуля становится равной 1234048 !!!!
Не погу понять - из-за чего такое может произойти?
MBo (2006-03-06 12:54:00) [10]Нет. Можно так:
function Sscanf(Buf, Fmt:PChar):Integer; cdecl varargs; external 'msvcrt.dll' name 'sscanf';