Передача параметра в CreateThread

Тема в разделе "WASM.WIN32", создана пользователем ZeroMemory, 8 июл 2005.

  1. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Приветствую господа.



    в общем так, имеется char* buff1 необходимо его передать в кач-ве параметра ф-ции CreateThread, что я собсно и делаю:
    Код (Text):
    1. CreateThread(NULL, 0, &LogSend, buff1, 0, &lsid);




    далее из потоковой ф-ции, хочу его получить обратно :) и делаю:
    Код (Text):
    1. char *pIn = (char*)param;
    2. MessageBox(NULL, pIn, "", MB_OK);
    3.  




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



    Спасибо
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Интересно что делает первый поток после вызова CreateThread()? Если он не висит в бесконечном цикле и буффер был на стэке, то все логично - стэк будет испорчен :)
     
  3. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Да нет :))

    CreateThread() вызывается единожды :). А после его вызова, программа продолжает свои зловредные действия ;)
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Во-первых, прежде чем передавать параметры функции CreateThread нужно выделить под них память с помощью Virtual/HeapAlloc, а освобождать в треде, когда не будет нужна.



    Во-вторых - надо выпрямлять руки :)
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В приведенном куске кода ошибки нет. MessageBox исправно показывает неискаженное сообщение, если buff1 глобальный.



    Если buff1 на стеке, то я пробовал из WndProc вызывать поток с локальным buff1 - тоже нормально передаётся. Видимо не обязательно должен перетираться буфер.



    А другие куски кода не имеют доступа к памяти, где находится buff1? Может (несанкционированно) какой-то участок кода переписывает твой буфер, пока он не дошёл до потока?
     
  6. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    cresta

    факты о том, что с глобальным буфером все нормально, а с локальным - нет, наводят на следующее...

    твой поток реально может получить управление [намного] позже CreateThread.

    то есть идет вызов CreateThread, потом какая-то работа со стеков (буфер портится), потом время получает твой поток, и усе...

    по нормальному делают как сказал Ms Rem, это классика.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Ms Rem



    Зачем же так радикально? Можно объявить буффер глобальным. Можно и на стеке, если есть уверенность в том, что стек не перетрётся пока буффер используется в треде.



    ZeroMemory

    Берём OllyDbg, ставим бряк на запись в первый байт беффера, жмём F9 и ждём :)
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Max

    Невнимательно читаешь. Нормально работает и с локальным и с глобальным буфером.

    А VirtualAlloc - это уж слишком. Может ещё и отдельный ехе запустить вместо потока?