![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректна ли запись PAnsiChar := @string ?
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 вообще ничего не знает о специфике твоей среды разработки. для нее строка - массив символов, оканчивающийся нулем