Собственно, при загрузке следующей дллки, мне ольга пишет: ERROR_NOT_ENOUGH_MEMORY (00000008) Код (Text): 00770000 > $ 68 D7FF7600 PUSH GameServ.0076FFD7 ; /FileName = "UCD90" 00770005 . E8 169EEBFF CALL <JMP.&KERNEL32.LoadLibraryA> ; \LoadLibraryA 0077000A . 68 DDFF7600 PUSH GameServ.0076FFDD ; /ProcNameOrOrdinal = "Init" 0077000F . 50 PUSH EAX ; |hModule 00770010 . E8 059EEBFF CALL <JMP.&KERNEL32.GetProcAddress> ; \GetProcAddress 00770015 . FFD0 CALL EAX 00770017 . EB 10 JMP SHORT GameServ.00770029 00770019 00 DB 00 0077001A 00 DB 00 0077001B 00 DB 00 0077001C 00 DB 00 0077001D 00 DB 00 0077001E 00 DB 00 0077001F 00 DB 00 00770020 00 DB 00 00770021 00 DB 00 00770022 00 DB 00 00770023 00 DB 00 00770024 00 DB 00 00770025 00 DB 00 00770026 00 DB 00 00770027 00 DB 00 00770028 00 DB 00 00770029 > 60 PUSHAD 0077002A . 68 E5FF7600 PUSH GameServ.0076FFE5 ; /FileName = "Inso_GS" 0077002F . E8 EC9DEBFF CALL <JMP.&KERNEL32.LoadLibraryA> ; \LoadLibraryA 00770034 . 68 F6FF7600 PUSH GameServ.0076FFF6 ; /ProcNameOrOrdinal = "InitGS" 00770039 . 50 PUSH EAX ; |hModule 0077003A . E8 DB9DEBFF CALL <JMP.&KERNEL32.GetProcAddress> ; \GetProcAddress 0077003F . FFD0 CALL EAX 00770041 . 61 POPAD 00770042 .^E9 2E96EAFF JMP GameServ.00619675 Первая дллка загружается нормально, написана не мной. Вторая дллка не загружается, вылетает на 0077003F . FFD0 CALL EAX, ну и пишет ошибку ERROR_NOT_ENOUGH_MEMORY (00000008) Что делать?
gEnIuS_99 Что тут непонятного? Что тут комментировать? Нужно всего-лишь запустить отладчик и посмотреть что находится в еах после второго ГетПрокАдреса. какую?
Код (Text): 0077002A . 68 E5FF7600 PUSH GameServ.0076FFE5 ; /FileName = "Inso_GS" 0077002F . E8 EC9DEBFF CALL <JMP.&KERNEL32.LoadLibraryA> ; \LoadLibraryA Перед Call LoadLibraryA EAX = 00000178 После EAX = 00000000 И LastErr = ERROR_NOT_ENOUGH_MEMORY (00000008)
Почему не загружается. С таким же успехом и более вероятно, что функции InitGS не хватает памяти. А что на самом деле - смотрите предыдущее сообщение
Да. Но памяти могло не хватить в MainDLL, вот она и не загрузилась. Вариант номер 2 : анализировать DLL или MainDLL - может автор ее криво написал и/или она не любит промежуточных подгрузок "чужого".
valterg Ошибка до InitGS.. Точнее, вылетает на InitGS, потому что не находит хендл либы которая в EAX и равна 00000000, вот и вылетает. А в свою очередь, хендл либы не создается, потому что нехватает памяти, чему-то, непонятно. 4гб Ram
4Гб RAM тут ни при чем. При NOT_ENOUGH_MEMORY не удается найти свободный диапазон адресов нужного размера в виртуальном адресном пространстве (АП) процесса. Это м.б. свзязано с фрагментацией АП. Утрированный пример: если загрузить пару десятков длл по адресам через каждые 100Мб, то АП окажется сильно фрагментрованным и несмотря на большой суммарный объем свободных адресов, выделить непрерывный блок памяти размером 100 и более Мб не удасться. PS: Кстати, интересно, что возвращает GetLastError при загрузке длл без релоков, когда ее базовый адрес уже занят ?
Проблема решена, а вопрос остался - откуда NOT_ENOUGH_MEMORY при загрузке пары микроскопических длл-ек