Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как сложить две строки, в отделном Thread потоке 
:(
    Опции темы
xxxSleshxxx
Дата 29.12.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Всем привет.
Помогите с проблемкой, у меня создан поток в чужом процессе, как в этом потоке можно сложить две переменных типа String?

вариант: 
Код

var
  c: PChar;
  a, b: String;
begin
  a:='Что за';
  MessageBox(0, PChar(a), 'PPC', 0);
  
  b:='дела?';
  MessageBox(0, PChar(b), 'PPC', 0);
  
  c:=PChar(a+b);
  MessageBox(0, c, 'PPC', 0);
end.


Приводит к падению приложения в котором я запускаю свой поток.

Хотя если сложить так:
Код

c:='Что за' + 'дела?';
MessageBox(0, c, 'PPC', 0);

то все ок! Я так понимаю тут что то напутано с типами?

Это сообщение отредактировал(а) xxxSleshxxx - 29.12.2009, 12:54
PM MAIL   Вверх
Frees
Дата 29.12.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(xxxSleshxxx @  29.12.2009,  15:40 Найти цитируемый пост)
 к падению

где и какому


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
xxxSleshxxx
Дата 29.12.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Цитата(Frees @  29.12.2009,  12:52 Найти цитируемый пост)
где и какому

К вот такому 
Инструкция по адресу "xxxx" обратилась к памяти по адресу "aaaaa"  Память не может быть "read".
PM MAIL   Вверх
RomanEEP
Дата 29.12.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



как создается поток?
PM MAIL   Вверх
xxxSleshxxx
Дата 29.12.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Цитата(RomanEEP @ 29.12.2009,  13:03)
как создается поток?

Поток создается черз функцию в advApiHook от Ms-Rem'a
Да и как это может быть связано? все работает отлично пока не делаю сложение 
PM MAIL   Вверх
artsb
Дата 29.12.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 6
Всего: 64



PChar это указатель на строку. Вы не выделяете память. На сколько мне известно, делается это с помощью SetLength.

Добавлено через 1 минуту и 34 секунды
как-то так:
Код

var
  c: PChar;
  a, b: String;
begin
  a:='Что за';
  MessageBox(0, PChar(a), 'PPC', 0);
  
  b:='дела?';
  MessageBox(0, PChar(b), 'PPC', 0);

  SetLength(c, Length(a+b));
  c:=PChar(a+b);
  MessageBox(0, c, 'PPC', 0);
end.



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Frees
Дата 29.12.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(artsb @  29.12.2009,  16:24 Найти цитируемый пост)
SetLength(c, Length(a+b));  
c:=PChar(a+b);


выделил память и затер указатель на нее

чет тут нето или ....



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
xxxSleshxxx
Дата 29.12.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Цитата(artsb @  29.12.2009,  13:24 Найти цитируемый пост)
делается это с помощью SetLength.


Что самое странное, так ето то что при вызове SetLength(c, 11); даже без дальнейшего сложения приложение сразу падает.

Хм.... а почему тогда 
вот так  c:='Что за' + 'дела?';    работает, а если только укажу что строка String то все приехали?

 smile 
ладно терять время с этой проблемкой не стал перенес подсчет в свое приложение и запись результата в реестр, а в потоке считываю значение переменной из реестра.
Но вопрос оставлю открытым интересно с чем это связанно.

Это сообщение отредактировал(а) xxxSleshxxx - 29.12.2009, 14:08
PM MAIL   Вверх
Snowy
Дата 29.12.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Попробуй обойтись без менеджера памяти.
Код
var
  a, b, c: PChar;
begin
  a := 'Что за ';
  MessageBox(0, PChar(a), 'PPC', 0);

  b := 'дела?';
  MessageBox(0, PChar(b), 'PPC', 0);

  GetMem(c, StrLen(a) + StrLen(b) + 2);
  lstrcpy(c, a); lstrcat(c, b);
  MessageBox(0, c, 'PPC', 0);
  FreeMem(c);
end;


Добавлено через 2 минуты и 54 секунды
Цитата(xxxSleshxxx @  29.12.2009,  14:00 Найти цитируемый пост)
вот так  c:='Что за' + 'дела?';    работает
Эта конструкция ещё на уровне компиляции превращается в c:='Что задела?';

Цитата(xxxSleshxxx @  29.12.2009,  14:00 Найти цитируемый пост)
а если только укажу что строка String то все приехали
А стринги управляются менеджером памяти, который у тебя неизвестно где.
Юзай тока PChar, без использования стрингов.
PM MAIL   Вверх
CodeMonkey
Дата 29.12.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(xxxSleshxxx @  29.12.2009,  12:40 Найти цитируемый пост)
как в этом потоке можно сложить две переменных типа String?

А откуда у вас в чужом процессе переменные String? 

Вариант а: от своего менеджера памяти.
Ответ: ну так и складывайте их как обычно, как строки: a := a + b;

Вариант б: это чужой кусок памяти.
Ответ: скопируйте к себе и складывайте как хотите. Теоретически, должно сработать: StrVar := a + b; (память для StrVar уйдёт на наш менеджер памяти, а не чужой). Правда, тогда непонятно, зачем вы засунули чужую память в переменные a и b.

PChar и String.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
xxxSleshxxx
Дата 29.12.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Вот кусок кода, чтобы не было лишних вопросов.

Код

uses
  Windows, Dialogs, Classes, SysUtils, advApiHook;

var
  hk:hkey;
  p,d:DWORD;
  StartInf: TStartupInfo;
  ProcInf: TProcessInformation;
  rData: array[0..254] of char;

//-------------------------- Наш поток в апдейтере. ----------------------------
function ThreadUpdate(dwEntryPoint: Pointer; name: string): THandle; stdcall;
var
  hwUpdate: HWND;
  PathProg: String;
  begin
    LoadLibrary('kernel32.dll');
    LoadLibrary('user32.dll');

    p:=REG_SZ;
    d:=254;
    RegOpenKey(HKEY_CURRENT_USER, 'Software\MixLine', hk);
    RegQueryValueEx(hk, 'Path', nil, @p, @rData, @d);
    RegCloseKey(hk);

    //Ждем пока апдейтер закончит проверку
    hwUpdate := 0;
    While hwUpdate = 0 do
      begin
        hwUpdate:=FindWindowEx(FindWindow('LAUNCHER', nil), 0, 'Static', 'Отсутствует подключение к сети');
        Sleep(200);
      end;

    //Скрываем апдейтер
    ShowWindow(FindWindow('LAUNCHER', nil), SW_HIDE);

    //Запускаем программу
    PathProg := rData + '\MixLine.exe';     //Вот тут все и падает!!! а если заместо сложения написать полный путь 'C:\Program Files (x86)\MixLine\MixLine.exe' то все гуд.

    ZeroMemory(@StartInf, SizeOf(TStartupInfo));
    CreateProcess(nil, rData, nil, nil, false, 0, nil, nil, StartInf, ProcInf);
  end;
//---------------------------------- Конец. ------------------------------------
//------------------------------------------------------------------------------
//---------------------------- Запуск апдейтера. -------------------------------
procedure StartUpdate;
var
  PathUpdate: String;
  begin
    p:=REG_SZ;
    d:=254;
    RegOpenKey(HKEY_CURRENT_USER, 'Software\MixLine', hk);
    RegQueryValueEx(hk, 'Path', nil, @p, @rData, @d);
    RegCloseKey(hk);

    //запускаем апдейтер
    PathUpdate := rData + '\Patcher\Updater.exe';
    ZeroMemory(@StartInf, SizeOf(TStartupInfo));
    CreateProcess(nil, PChar(PathUpdate), nil, nil, false, 0, nil, nil, StartInf, ProcInf);
    Sleep(200);

    //внедряем в апдейтер наш поток
    InjectThisExe(ProcInf.hProcess, @ThreadUpdate)
  end;
//---------------------------------- Конец. ------------------------------------
//------------------------------------------------------------------------------
begin
  StartUpdate;
end.


Есть программа которую запускает лаунчер после проверки целосности и обновления программы
суть в том что лаунчер не стартует прогу без инета, а есть потребность в использовании там где его нет!!! и на примую прогу нельзя запускать без лаунчера. Ну суть собственно не в том зачем я это пишу
а почему в потоке не складываются переменные типа String и как говорил Snowy без менеджера памяти тоже пробовал результат один ошибка чтения памяти.


Это сообщение отредактировал(а) xxxSleshxxx - 29.12.2009, 19:49
PM MAIL   Вверх
CodeMonkey
Дата 29.12.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



PathProg заменяете на array[0..MAX_PATH] of Char и копируйте в него сначала rData, потом константу.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.