Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-51277
asteriks
2003-10-06 20:16
2003.10.16
SIM-карты


7-51536
pro100max
2003-07-30 08:19
2003.10.16
Как затормозить Винду?


9-51050
Knight
2003-04-14 22:22
2003.10.16
Тетрис - слабое звено...


1-51274
p0tia
2003-10-06 19:16
2003.10.16
Существует ли декомпилятор


1-51316
Serguar
2003-10-06 08:49
2003.10.16
При минимизации главной формы дочернее должно оставаться на экран





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский