Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Вниз
Как бороться с null-terminated строками Найти похожие ветки
← →
DeScriptor (2003-10-02 23:34) [0]Люди!
Пожалуйста, помогите разобраться с этой ерундой!
Ситуация такова: у меня есть WinExec, которому в качестве парамера (выполняемой команды) нужно давать PAnsiChar. А у меня есть только string - ну, не умею и не понимаю я, на фига мне еще какой-то изврат, кроме string"а, нужен! Как этот мой string переделать в то, что так от меня ждет WinExec?!
Очень жду Вашей помощи!...
← →
Endi (2003-10-02 23:49) [1]function StrPCopy(Dest: PChar; const Source: string): PChar;
Эта функция копирует обычную строку (Source) в null-terminated string (Dest).
А если наоборот понадобится, то используй -
function StrPas(const Str: PChar): string;
Надеюсь, тут объяснять ничего не надо. :)
← →
Palladin (2003-10-02 23:59) [2]ну и самый простой вариант
var
s:string;
WinExec(pchar(s),sw_show);
← →
Guerrillero (2003-10-03 00:01) [3]а простое приведение типов не помогает: PChar(StringVar)
← →
Ihor Osov'yak (2003-10-03 01:35) [4]2 [1] Endi © (02.10.03 23:49)
для целей, описанных в стартовом вопросе - это лишнее..
2 DeScripto - нуна, нуна.. Исторически так сложилось. А с привода сабжевой проблемы - см. [2], [3]. И PChar там не функция, а приведение типов..
есть еще вариант - WinExec(@s, sw_show); // :-)
Вообще-то почитайте о форматах AnsiString и нуль-терминайтет стринг - тогда варианты [2], [3], и мой - станут понятные..
Зы - и нету такого типа в делфи, как string - это вражеские измышления :-)
А если серьезно - см. String types по F1
← →
sniknik (2003-10-03 08:38) [5]Ihor Osov"yak © (03.10.03 01:35) [4]
> есть еще вариант - WinExec(@s, sw_show); // :-)
а так не правильнее?
WinExec(@s[1], sw_show); (а в случае с короткой строкой так единственно верное)
← →
sniknik (2003-10-03 08:41) [6]тфу ты, смысл потерялся (читается не так как то что хотел написать), единственно верное в данном случае, преобразование PChar() естественно правильнее (и не надо думать о подобных мелочах).
← →
Anatoly Podgoretsky (2003-10-03 09:02) [7]Ihor Osov"yak © (03.10.03 01:35) [4]
Вообще то несколько замечаний
1. все таки это функция а не приведение
Если S <> nil, то возвращается содержимое S, иначе возвращается указатель на строку, в которой только завершающий 0 и это область имет аттрибут RasdOnly
2. Есть и проблемы с VCL пустая строка может быть представлена двумя путями, как указатель nil и как указатель на вышеуказанную строку. Проблема состоит в том, что не все функции корректно написаны для второго случая.
3. S[1] в каких случаях, в зависимости от версии Дельфи может вызвать AV. nil[1] - была попытка читать системную часть строки по отрицательному смещению, для получения длины строки и проверки на диапазон - без анализа на nil, сейчас эта проблема вроде бы устранена.
4. Некоторые функции АПИ тоже себя ведут по разному, в зависимости от того, чыто им передано nil или пустая строка.
Вот все это нажо и учитывать при работе как с АПИ, так и VCL, пр том без разницы, что использовать чистый PChar или преобразование строки в PChar
← →
han_malign (2003-10-03 09:45) [8]> 4. Некоторые функции АПИ тоже себя ведут по разному, в зависимости от того, чыто им передано nil или пустая строка.
- опциональные PChar параметры в WinAPI практически всегда требуют nil, в случае, если строковой параметр должен быть опущен - в этом случае поможет - PChar( Pointer(Str)) - это преобразование не приводится к "compiler magic" функции _LStrToPChar...
З.Ы. Для образовательных целей (если кому в лом самостоятельно посмотреть, что творится в <Delphi>\Source\Rtl\Sys\System.pas)
function _LStrToPChar(const s: AnsiString): PChar;
{$IFDEF PUREPASCAL}
const
EmptyString = "";
begin
if Pointer(s) = nil then
Result := EmptyString
else
Result := Pointer(s);
end;
{$ELSE}
asm
{ -> EAX pointer to str }
{ <- EAX pointer to PChar }
TEST EAX,EAX
JE @@handle0
RET
{$IFDEF PIC}
@@handle0:
JMP PICEmptyString
{$ELSE}
@@zeroByte:
DB 0
@@handle0:
MOV EAX,offset @@zeroByte
{$ENDIF}
end;
{$ENDIF}
Кстати насчет " и эта область имет аттрибут ReadOnly" - как раз здесь явно видно, что возвращается адрес из ReadOnly сегмента кода (см. @@zeroByte: DB 0)
(и становится ясно где Delphi хранит нетипизированные константы)
← →
DeScriptor (2003-10-03 16:39) [9]Всем ОГРОМНОЕ СПАСИБО!!!!!!!!! Хотя в конце рассуждений я начал терять всякое понятие, о чем речь идет, но это не важно. =) Важно, что конструкция PChar(s) - РУЛИТ!!!! @s - не работает :(
Мне очень помогли ваши советы!
← →
Anatoly Podgoretsky (2003-10-03 16:43) [10]han_malign © (03.10.03 09:45) [8]
PChar(Pointer(Str))
Обычно достачно Pointer(Str)
← →
Ihor Osov'yak (2003-10-05 12:51) [11]2 [7] Anatoly Podgoretsky © (03.10.03 09:02)
Thanks
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c