| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > как сложить две строки |
| Автор: xxxSleshxxx 29.12.2009, 12:40 | ||||
| Всем привет. Помогите с проблемкой, у меня создан поток в чужом процессе, как в этом потоке можно сложить две переменных типа String? вариант:
Приводит к падению приложения в котором я запускаю свой поток. Хотя если сложить так:
то все ок! Я так понимаю тут что то напутано с типами? |
| Автор: Frees 29.12.2009, 12:52 |
где и какому |
| Автор: xxxSleshxxx 29.12.2009, 12:58 |
К вот такому Инструкция по адресу "xxxx" обратилась к памяти по адресу "aaaaa" Память не может быть "read". |
| Автор: RomanEEP 29.12.2009, 13:03 |
| как создается поток? |
| Автор: xxxSleshxxx 29.12.2009, 13:13 | ||
Поток создается черз функцию в advApiHook от Ms-Rem'a Да и как это может быть связано? все работает отлично пока не делаю сложение |
| Автор: artsb 29.12.2009, 13:24 | ||
| PChar это указатель на строку. Вы не выделяете память. На сколько мне известно, делается это с помощью SetLength. Добавлено через 1 минуту и 34 секунды как-то так:
|
| Автор: Frees 29.12.2009, 13:35 |
выделил память и затер указатель на нее чет тут нето или .... |
| Автор: xxxSleshxxx 29.12.2009, 14:00 |
Что самое странное, так ето то что при вызове SetLength(c, 11); даже без дальнейшего сложения приложение сразу падает. Хм.... а почему тогда вот так c:='Что за' + 'дела?'; работает, а если только укажу что строка String то все приехали? ладно терять время с этой проблемкой не стал перенес подсчет в свое приложение и запись результата в реестр, а в потоке считываю значение переменной из реестра. Но вопрос оставлю открытым интересно с чем это связанно. |
| Автор: Snowy 29.12.2009, 14:09 | ||
Попробуй обойтись без менеджера памяти.
Добавлено через 2 минуты и 54 секунды Эта конструкция ещё на уровне компиляции превращается в c:='Что задела?'; А стринги управляются менеджером памяти, который у тебя неизвестно где. Юзай тока PChar, без использования стрингов. |
| Автор: CodeMonkey 29.12.2009, 14:56 |
А откуда у вас в чужом процессе переменные String? Вариант а: от своего менеджера памяти. Ответ: ну так и складывайте их как обычно, как строки: a := a + b; Вариант б: это чужой кусок памяти. Ответ: скопируйте к себе и складывайте как хотите. Теоретически, должно сработать: StrVar := a + b; (память для StrVar уйдёт на наш менеджер памяти, а не чужой). Правда, тогда непонятно, зачем вы засунули чужую память в переменные a и b. http://transl-gunsmoker.blogspot.com/2009/09/pchars.html. |
| Автор: xxxSleshxxx 29.12.2009, 19:09 | ||
Вот кусок кода, чтобы не было лишних вопросов.
Есть программа которую запускает лаунчер после проверки целосности и обновления программы суть в том что лаунчер не стартует прогу без инета, а есть потребность в использовании там где его нет!!! и на примую прогу нельзя запускать без лаунчера. Ну суть собственно не в том зачем я это пишу а почему в потоке не складываются переменные типа String и как говорил Snowy без менеджера памяти тоже пробовал результат один ошибка чтения памяти. |
| Автор: CodeMonkey 29.12.2009, 22:12 |
| PathProg заменяете на array[0..MAX_PATH] of Char и копируйте в него сначала rData, потом константу. |