Добрый день, спецы асма. Столкнулся с проблемой и не могу решить. Есть освобождение памяти: push edi call GlobalFree call GetLastError Если после этого опять выделить память, то вываливается все в ошибку. В edi хэндл памяти, проверял. GetLastError показывает ошибку 1309 "Предпринята попытка использования элемента олицетворения потоком команд, который в данное время не олицетворяет клиента." Не могу понять смысла ошибки. Что они хотели этим сказать? Может кто сталкивался? Подскажите, пожалуйста? Спасибо
1) GetLastError IMHO выдает не ошибку в последнем вызове, а в последнем вызове, где была ошибка. 2) По приведенному исходнику ничего непонятно. На какой вызов выдается 1309? А экстрасенсы из гугла мне подсказали : возможно ты пытаешься освободить залоченный или чужой "элемент".
Я выделяю память, с ней работаю, потом пытаюсь освободить. В edi дескриптор памяти. Создаю память вот так push 32 push GMEM_FIXED or GMEM_ZEROINIT call GlobalAlloc потом пытаюсь освободить push edi ; дескриптор памяти call GlobalFree и вот если после этого опять выделяю память, то система уходит в ошибку, при чем ту, которую сама не может обработать. Т.е. вызываю очередной GlobalAlloc и обратно управление не передается. Методом научного тыка я нашел, что убрав последнее освобождение исчезает ошибка. Поэтому вставил после освобождения GetLastError Может как-то по другому искать? Дело в том, что у меня много мест, где идет освобождение, но именно это не правильное. В edi дескриптор, сам проверил несколько раз. Уже не знаю куда копать. Может знаете как можно залочить дескриптор?
Нет. Оно в памяти сохраняется. Скажите, а такое возможно, если подменено? Правда? Если да, тогда полез анализировать свой код
Нашел. Спасибо всем. Что было: После освобождения памяти, я обнулял ячейку памяти способом mov dword ptr [edi], 0 Т.е. присваивал 0000 в не мою память. Вот же какая засада то...
Я отладчиками пользуюсь. Честно. Оля и софтайс для разных случаев. Другой вопрос подобный баг трудно найти, у меня сложная иерархия дескрипторов в виде деревьев и списков. Отладчик показал, что не может выйти из системного вызова. А где он и почему не смог выйти я не знаю, это для меня пока темный лес
valterg ИМХО, любой успешный вызов ф-ии, которая использует GetLastError устанавливает код ошибки ERROR_SUCCES
Спасибо всем, я нашел причину. Запутался в алгоритме (плохо разрисовал его на схемах) и писал ноль в освобожденную память, а надо было просто обнулить мою переменную