У меня есть блок кода на C ++, который выглядит примерно так: psuedocode:
LPBYTE FindBits(const BITMAPINFOHEADER *pbi)
{
return (LPBYTE)pbi + pbi->biSize + FindColorTableBytes(pbi);
}
Получает указатель на фактические данные DIB (растровые изображения).
Теперь у меня есть многопоточное приложение на c #, которое загружает растровые изображения из всех разных файлов (теооретически), никогда не повторяя одно и то же время. Он использует мою C ++ dll для обработки чтения и декодирования растровых изображений из документов.
Проблема в том, что я пытаюсь сделать эту библиотеку безопасной для нескольких потоков, но я получаю AccessViolationError в строке в функции выше. При попытке отладить эту проблему, при возникновении ошибки происходит сбой отладчика, и я смотрю на членов pbi. Они выглядят так:
{biSize=??? biWidth=??? biHeight=??? ...}
pbi - это битовая память, которая была заблокирована с помощью GlobalLock (handleToDib) и даже для того, чтобы получить указанную выше функцию для получения нарушения доступа, GlobalLock должен возвращать ненулевой указатель.
когда я смотрю на область памяти, возвращенную GlobalLock в окне памяти, это выглядит так:
?? ?? ?? ?? ?? ??
Если бы отладчик давал мне магическое число, я мог бы понять, если память была плохой ... но это сбивает меня с толку ... и, очевидно, отладчик. Кто-нибудь знает, почему отладчик показывает это?