Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Корректна ли запись PAnsiChar := @string ?


Страницы:   1 2 3

Kolan ©   (2007-10-15 10:45:00) 

Можно ли так делать?
ShellExecute(0,'open', @FlexCelReport1.filename[1],nil,nil,sw_show);


Kolan   (2007-10-15 13:19:00) [1]

Благодарю за разъяснения…


Ins   (2007-10-15 12:39:00) [2]


> clickmaker ©   (15.10.07 12:36) [40]

Судя по названию, она усекает строку до первого #0, если вдруг этот символ содержится в середине. А если это так, то ShellExecute-у все равно.


clickmaker   (2007-10-15 12:36:00) [3]


> [36] Kolan ©   (15.10.07 12:30)

я чегой-то не могу найти эту функцию в delphi\source...


Ins   (2007-10-15 12:34:00) [4]


> Leonid Troyanovsky ©   (15.10.07 12:31) [38]

Ну это уже следствие из [34]. Все ясно, спасибо за ликбез.


Leonid Troyanovsky   (2007-10-15 12:31:00) [5]


> Однокамушкин   (15.10.07 12:23) [34]

+
Например, если FindWindow передать пустую строку s,
а приведение будет типа PChar(s), то искаться будет
не любой (как для nil), скажем, заголовок, а пустой.

--
Regards, LVT.


Ins   (2007-10-15 12:30:00) [6]


> В случае пустой строки Pointer(Str) = nil, и Str[1] приводит
> к исключению, а PChar(Str) работает нормально, правда, возвращает
> не nil, а указатель на специально выделенный символ #0,
> потому что PChar(string) - это не приведение типа, а неявный
> вызов функции _LStrToPChar

Проверил - так есть. Вопрос "какая" исчерпан.


Kolan   (2007-10-15 12:30:00) [7]

А надо ли использовать RealizeLength после приведения к PChar?
> а это еще что за зверь?

Вычитал у текстры, страница 72,(Delphi 5 Руководство разработчика, том 1).

Там написано, что надо вызывать…


clickmaker   (2007-10-15 12:27:00) [8]


> [33] Kolan ©   (15.10.07 12:22)

а это еще что за зверь?


Однокамушкин   (2007-10-15 12:23:00) [9]


> Ins ©   (15.10.07 12:15) [32]
>
> > Есть, конечно.
>
> Какая? :)

В случае пустой строки Pointer(Str) = nil, и Str[1] приводит к исключению, а PChar(Str) работает нормально, правда, возвращает не nil, а указатель на специально выделенный символ #0, потому что PChar(string) - это не приведение типа, а неявный вызов функции _LStrToPChar


Kolan   (2007-10-15 12:22:00) [10]

А надо ли использовать RealizeLength после приведения к PChar?


Ins   (2007-10-15 12:15:00) [11]


> Есть, конечно.

Какая? :)


Ins   (2007-10-15 12:14:00) [12]


> :)так оно и понятно, что передать можно что угодно, хоть
> Pointer($0000FFF1), я имел ввиду AV в последствии передачи,
>  а не в последствии приведения типов

Ну вот это не очевидно из вашего сообщения [13]. Несколько раз перечитал - явно следует такой смысл: @str делать нельзя, так как в этом случае получаем указатель на указатель (с этим не спорю), чуть более верно сделать такое приведение @str[1], но чуть- из-за того, что при пустой строке даст AV (так как первого символа не существует и следовательно у него нет адреса). Утверждаю, что не чуть, а в равной степени верно, как и PChar(Str).


Leonid Troyanovsky   (2007-10-15 12:12:00) [13]


> Ins ©   (15.10.07 12:07) [28]

> Я это понимаю, но просто в случае пустой строки нет никакой
> принципиальной разницы, просто nil передать, или PChar[Str],

Есть, конечно.

--
Regards, LVT.


Palladin   (2007-10-15 12:09:00) [14]


> Ins ©   (15.10.07 12:07) [28]

:)так оно и понятно, что передать можно что угодно, хоть Pointer($0000FFF1), я имел ввиду AV в последствии передачи, а не в последствии приведения типов


Ins   (2007-10-15 12:07:00) [15]


> Palladin ©   (15.10.07 12:04) [27]

Я это понимаю, но просто в случае пустой строки нет никакой принципиальной разницы, просто nil передать, или PChar[Str], или @Str[1]. Я пост [13] комментирую. Не знаю, как в D6, но в D7 точно все в порядке с этой точки зрения.


Palladin   (2007-10-15 12:04:00) [16]


> Ins ©   (15.10.07 11:59) [26]

само @str[i] - конечно не вызовет AV, это будет всего лишь адрес со смещением i от str, AV вызовет функция которая к этому адресу обратится, а может и не вызовет, чего то возьмет по этому адресу до первого попавшегося #0, однако к каким последствиям это приведет?


Ins   (2007-10-15 11:59:00) [17]


> Такой подход превратить строку неверно, и может стать причной
> АВ если строка = ''

Это вряд ли. Компилятор при записи @str[i] в данном случае не пытается обратиться к i-му символу. Он просто берет значение str и инкрементирует его на i-1. Так что опасности передачи параметра таким образом я не вижу.


Kolan   (2007-10-15 11:41:00) [18]

> а какие сомнения?

Ну вы этого не сказали в начале…

Итак вердикт какой?
Такой подход превратить строку неверно, и может стать причной АВ если строка = ''


Leonid Troyanovsky   (2007-10-15 11:40:00) [19]


> Kolan ©   (15.10.07 11:25) [19]

Для ShellExecute требуется Pointer(FileName/Dir)

--
Regards, LVT.


clickmaker   (2007-10-15 11:38:00) [20]


> ShellExecute не знает, что по смещению —4 хранится длина
> строки. Он определит длину по нулевому символу.
> Так ли это…

а какие сомнения?
WinAPI вообще ничего не знает о специфике твоей среды разработки. для нее строка - массив символов, оканчивающийся нулем


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо