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

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

  1. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Приветствую господа.



    в общем так, имеется 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
    Интересно что делает первый поток после вызова CreateThread()? Если он не висит в бесконечном цикле и буффер был на стэке, то все логично - стэк будет испорчен :)
     
  3. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Да нет :))

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

    Ms Rem New Member

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



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

    cresta Active Member

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



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



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

    Max Member

    Публикаций:
    0
    cresta

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

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

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

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

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

    Публикаций:
    0
    Ms Rem



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



    ZeroMemory

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

    cresta Active Member

    Публикаций:
    0
    Max

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

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