Приветствую господа. в общем так, имеется char* buff1 необходимо его передать в кач-ве параметра ф-ции CreateThread, что я собсно и делаю: Код (Text): CreateThread(NULL, 0, &LogSend, buff1, 0, &lsid); далее из потоковой ф-ции, хочу его получить обратно и делаю: Код (Text): char *pIn = (char*)param; MessageBox(NULL, pIn, "", MB_OK); но месседжбокс показывает ерунду. видимо я переработал... но чтото никак не получается.. помогите плз. Спасибо
Интересно что делает первый поток после вызова CreateThread()? Если он не висит в бесконечном цикле и буффер был на стэке, то все логично - стэк будет испорчен
Да нет ) CreateThread() вызывается единожды . А после его вызова, программа продолжает свои зловредные действия
Во-первых, прежде чем передавать параметры функции CreateThread нужно выделить под них память с помощью Virtual/HeapAlloc, а освобождать в треде, когда не будет нужна. Во-вторых - надо выпрямлять руки
В приведенном куске кода ошибки нет. MessageBox исправно показывает неискаженное сообщение, если buff1 глобальный. Если buff1 на стеке, то я пробовал из WndProc вызывать поток с локальным buff1 - тоже нормально передаётся. Видимо не обязательно должен перетираться буфер. А другие куски кода не имеют доступа к памяти, где находится buff1? Может (несанкционированно) какой-то участок кода переписывает твой буфер, пока он не дошёл до потока?
cresta факты о том, что с глобальным буфером все нормально, а с локальным - нет, наводят на следующее... твой поток реально может получить управление [намного] позже CreateThread. то есть идет вызов CreateThread, потом какая-то работа со стеков (буфер портится), потом время получает твой поток, и усе... по нормальному делают как сказал Ms Rem, это классика.
Ms Rem Зачем же так радикально? Можно объявить буффер глобальным. Можно и на стеке, если есть уверенность в том, что стек не перетрётся пока буффер используется в треде. ZeroMemory Берём OllyDbg, ставим бряк на запись в первый байт беффера, жмём F9 и ждём
Max Невнимательно читаешь. Нормально работает и с локальным и с глобальным буфером. А VirtualAlloc - это уж слишком. Может ещё и отдельный ехе запустить вместо потока?