Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

Как бороться с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
14-51450
Viktor Kushnir
2003-09-29 18:27
2003.10.16
Зубы мудрости


1-51297
Seldon
2003-10-05 22:00
2003.10.16
TPropertyEditor


14-51399
Nickola2
2003-09-26 14:38
2003.10.16
урааа, сегодня пятница


3-51140
BorisSV
2003-09-24 18:55
2003.10.16
Advanced DataBase Server (Advanced Local Server)


3-51144
T{}r(l-l
2003-09-24 14:48
2003.10.16
Как копировать таблицы из одной базы в другую?