Здравствуйте, cupuyc., Вы писали:
C>Собственно вопрос в теме. C>Не могу подключить дллку через LoadLibrary. C>GetLastError выдает номер ошибки "-529697949". В инете облазил не могу найти ни одного упоминания. Мот кто знает что за ошибка?
Собственно вопрос в теме.
Не могу подключить дллку через LoadLibrary.
GetLastError выдает номер ошибки "-529697949". В инете облазил не могу найти ни одного упоминания. Мот кто знает что за ошибка?
Здравствуйте, cupuyc., Вы писали:
C>Собственно вопрос в теме. C>Не могу подключить дллку через LoadLibrary. C>GetLastError выдает номер ошибки "-529697949". В инете облазил не могу найти ни одного упоминания. Мот кто знает что за ошибка?
Выведи код ошибки в шестнадцатеричном виде.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, cupuyc., Вы писали:
C>Собственно вопрос в теме. C>Не могу подключить дллку через LoadLibrary. C>GetLastError выдает номер ошибки "-529697949". В инете облазил не могу найти ни одного упоминания. Мот кто знает что за ошибка?
Здравствуйте, cupuyc., Вы писали:
C>Собственно вопрос в теме. C>Не могу подключить дллку через LoadLibrary. C>GetLastError выдает номер ошибки "-529697949". В инете облазил не могу найти ни одного упоминания. Мот кто знает что за ошибка?
Скорее всего dll бросила исключение во время загрузки. И это исключение никто не поймал.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, cupuyc., Вы писали:
C>>Собственно вопрос в теме. C>>Не могу подключить дллку через LoadLibrary. C>>GetLastError выдает номер ошибки "-529697949". В инете облазил не могу найти ни одного упоминания. Мот кто знает что за ошибка?
PD>Не бывает ИМХО такой ошибки. Покажи код.
бывает)
собственно программа написана только для проверки загружаемости библиотек большого проекта. В проекте есть схожая функция, она отрабатывает нормально без ошибок, а отдельная программа (код ниже) загружает только одну треть, остальные две трети выкидывают одну и ту же ошибку: -529697949 или в 16-тиричной E06D7363(спасибо breee breee).
вот код:
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, cupuyc., Вы писали:
C>>Собственно вопрос в теме. C>>Не могу подключить дллку через LoadLibrary. C>>GetLastError выдает номер ошибки "-529697949". В инете облазил не могу найти ни одного упоминания. Мот кто знает что за ошибка?
BFE>Скорее всего dll бросила исключение во время загрузки. И это исключение никто не поймал.
Сделал как написано в решении http://support.microsoft.com/kb/185294.
Теперь при отладке вылетает сообщение:
Frst-chance exeption in TestingDll.exe (kernel32.dll): 0xE06D7363: Microsoft C++ Exception.
... и останавливается на дизассемблере в коде.
Вот только что мне теперь делать, я так и не знаю как исправить ошибку.
Здравствуйте, cupuyc., Вы писали:
C>Сделал как написано в решении http://support.microsoft.com/kb/185294. C> Теперь при отладке вылетает сообщение: C> Frst-chance exeption in TestingDll.exe (kernel32.dll): 0xE06D7363: Microsoft C++ Exception. C> ... и останавливается на дизассемблере в коде. C> Вот только что мне теперь делать, я так и не знаю как исправить ошибку.
Что именно сделал? Выставил "Stop always"? Это не нужно.
Исключение скорее всего вылетает в функции DllMain той dll-ки, которую ты загружаешь. Тебе нужно посмотреть ее код, чтобы разобраться почему это происходит и пофиксить это.
Здравствуйте, cupuyc., Вы писали:
BFE>>Скорее всего dll бросила исключение во время загрузки. И это исключение никто не поймал.
C>а как перехватить это исключение ?
Можно начать с try-catch блока в функции DllMain. Что-то вроде:
Здравствуйте, breee breee, Вы писали:
BB>Здравствуйте, cupuyc., Вы писали:
BFE>>>Скорее всего dll бросила исключение во время загрузки. И это исключение никто не поймал.
C>>а как перехватить это исключение ?
BB>Можно начать с try-catch блока в функции DllMain. Что-то вроде:
BB>
BB>Если что-то поймается, разбираться почему это происходит.
спасибо, попробую. но если я не имею доступа к исходникам дллки?
как я писал раньше вопрос в том что в проекте есть функция которая идентична написаной мной в отдельной программе(код выше), я тупо копипастил, причем эта функция вызывается из отдельной дллки, НО в проекте эта функция отрабатывает на все 100% дллок, а в отдельной программе одна треть не загружает и выкидывает эту ошибку. Меня вот это сбивает с толку.
Здравствуйте, cupuyc., Вы писали:
C>спасибо, попробую. но если я не имею доступа к исходникам дллки? C>как я писал раньше вопрос в том что в проекте есть функция которая идентична написаной мной в отдельной программе(код выше), я тупо копипастил, причем эта функция вызывается из отдельной дллки, НО в проекте эта функция отрабатывает на все 100% дллок, а в отдельной программе одна треть не загружает и выкидывает эту ошибку. Меня вот это сбивает с толку.
Сложно сказать. Можно, например, попробовать положить отдельную программу в каталог, где находится проект. Или посмотреть повнимательнее проект, где код работает. Может, там что-то инициализируется, что в дальнейшем используется dll-ками.
Здравствуйте, breee breee, Вы писали:
BB>Здравствуйте, cupuyc., Вы писали:
C>>спасибо, попробую. но если я не имею доступа к исходникам дллки? C>>как я писал раньше вопрос в том что в проекте есть функция которая идентична написаной мной в отдельной программе(код выше), я тупо копипастил, причем эта функция вызывается из отдельной дллки, НО в проекте эта функция отрабатывает на все 100% дллок, а в отдельной программе одна треть не загружает и выкидывает эту ошибку. Меня вот это сбивает с толку.
BB>Сложно сказать. Можно, например, попробовать положить отдельную программу в каталог, где находится проект. Или посмотреть повнимательнее проект, где код работает. Может, там что-то инициализируется, что в дальнейшем используется dll-ками.
С перехватом сообщения не получилось, в Debug окно ничего не передает
поместил программу в папку с проектом, теперь ошибки другие, вот что выдает GetLastError():
126 — 7e;
127 — 7f;
1114 — 45а;
... и в основном эта 998 — 3e6;
что говорит мсдн:
126 — 7e:
ERROR_MOD_NOT_FOUND
126 (0x7E)
The specified module could not be found.
... модуль есть.
127 — 7f:
ERROR_PROC_NOT_FOUND
127 (0x7F)
The specified procedure could not be found.
не могу понять что он имеет в виду, какая процедура...
1114 — 45а;
ERROR_DLL_INIT_FAILED
1114 (0x45A)
A dynamic link library (DLL) initialization routine failed.
... ошибка инициализации, где бы это посмотреть? в блоке DLLMain?
998 — 3e6;
ERROR_NOACCESS
998 (0x3E6)
Invalid access to memory location.
... почему нету доступа? я выгружаю те которые не нужны.
> Что именно сделал? Выставил "Stop always"? Это не нужно. > Исключение скорее всего вылетает в функции DllMain той dll-ки, которую ты > загружаешь. Тебе нужно посмотреть ее код, чтобы разобраться почему это > происходит и пофиксить это.
Так надо в отладчике поставить break on exception и оно поймаецо.
On 07/11/2012 12:13 PM, cupuyc. wrote:
> спасибо, попробую.
Не надо ловить исключение. Ты с этим ничего не сможешь сделать.
Надо включить ловилку в отладчике и глядеть где DLL-ка падает
при загрузке.
но если я не имею доступа к исходникам дллки?
А что ж ты тогда вообще хочешь ? Даже если ты найдёшь ошибку,
исправить без исходников всё равно невозможно.
Оно конечно может быть это какая-то наведённая ошибка, типа она
сама например грузить ещё третью ДЛЛ, и всё падает уже там, в третьей.
Тогда ты сможешь исправить это может быть.
> как я писал раньше вопрос в том что в проекте есть функция которая идентична > написаной мной в отдельной программе(код выше), я тупо копипастил, причем эта > функция вызывается из отдельной дллки, НО в проекте эта функция отрабатывает на > все 100% дллок, а в отдельной программе одна треть не загружает и выкидывает эту > ошибку. Меня вот это сбивает с толку.
Здравствуйте, cupuyc., Вы писали:
C>что говорит мсдн: C>126 — 7e: C>ERROR_MOD_NOT_FOUND C>126 (0x7E) C>The specified module could not be found. C>... модуль есть.
Здравствуйте, cupuyc., Вы писали:
C>что говорит мсдн: C>126 — 7e: C>ERROR_MOD_NOT_FOUND C>126 (0x7E) C>The specified module could not be found. C>... модуль есть.
Подскажите плз, возможно ли из процесса А создать процесс Б и в процессе Б проверять загружаемость дллки, т.к. когда выгружаешь из процесса А дллку она тянет за собой несколько дллок которые необходимы процессу А и он падает.
> Подскажите плз, возможно ли из процесса А создать процесс Б и в процессе Б > проверять загружаемость дллки, т.к. когда выгружаешь из процесса А дллку она > тянет за собой несколько дллок которые необходимы процессу А и он падает.
>> Подскажите плз, возможно ли из процесса А создать процесс Б и в процессе Б >> проверять загружаемость дллки, т.к. когда выгружаешь из процесса А дллку она >> тянет за собой несколько дллок которые необходимы процессу А и он падает.
MZ>Не может быть.
может и не может, но факт в том, что процесс падает когда вызывается функция FreeLibrary()
> может и не может, но факт в том, что процесс падает когда вызывается функция > FreeLibrary()
Ну так не вызывай FreeLibrary. Вообще, когда и откуда ты вызываешь эту функцию?
Она достаточно опасна. Например, нельзя её вызывать, если не уверен на 100%,
что никакой код из этой библиотеки не выполняется и что на данные этой
библиотеки нет ссылок. А иначе будет защита памяти.
Здравствуйте, cupuyc., Вы писали:
C>Подскажите плз, возможно ли из процесса А создать процесс Б и в процессе Б проверять загружаемость дллки, т.к. когда выгружаешь из процесса А дллку она тянет за собой несколько дллок которые необходимы процессу А и он падает.
Вот ведь круто! А зачем? (с)
Это вот зачем вообще такое? Экономия на копейках или экзотика какая? Или учебная задача?
>> может и не может, но факт в том, что процесс падает когда вызывается функция >> FreeLibrary()
MZ>Ну так не вызывай FreeLibrary. Вообще, когда и откуда ты вызываешь эту функцию? MZ>Она достаточно опасна. Например, нельзя её вызывать, если не уверен на 100%, MZ>что никакой код из этой библиотеки не выполняется и что на данные этой MZ>библиотеки нет ссылок. А иначе будет защита памяти.
Собственно вот весь код:
HMODULE hLib;
hLib = LoadLibrary(object.fileNameFull);
if (hLib=NULL)
AfxMessageBox(object.fileNameFull + " - Не загружена!");
else
FreeLibrary(hLib);
Пробовал не вызывать FreeLibrary() тогда программа падает при выходе из нее.
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, cupuyc., Вы писали:
C>>Подскажите плз, возможно ли из процесса А создать процесс Б и в процессе Б проверять загружаемость дллки, т.к. когда выгружаешь из процесса А дллку она тянет за собой несколько дллок которые необходимы процессу А и он падает. BFE>
BFE>Вот ведь круто! А зачем? (с)
BFE>Это вот зачем вообще такое? Экономия на копейках или экзотика какая? Или учебная задача?
Да вот, захотели буржуи, что бы в программе установки была автоматическая проверка загружаемости устанавливаемых ею dll.
> Да вот, захотели буржуи, что бы в программе установки была автоматическая > проверка загружаемости устанавливаемых ею dll.
Идиотизм. Они могут не загружаться в утановщике но загружаться в программе,
и наоборот. Манифесты могут быть указаны (они действуют на одно приложение)
и текущий каталог и содержимое PATH могут быть разными.
Здравствуйте, MasterZiv, Вы писали:
MZ>On 07/13/2012 12:23 PM, cupuyc. wrote:
>> >> HMODULE hLib; >> hLib = LoadLibrary(object.fileNameFull); >> if (hLib=NULL) >> AfxMessageBox(object.fileNameFull +" — Не загружена!"); >> else >> FreeLibrary(hLib);
>> Пробовал не вызывать FreeLibrary() тогда программа падает при выходе из нее.
MZ>А зачем вообще загружать её, если тут же она выгружается ?
Необходимо проверить загружаемость, т.е. подгрузить длл в память удостоверится что LoadLibrary отработает нормально без ошибок и выгрузить эту же длл из памяти за ненадобностью.
MZ>При выходе из кого ? выражайся яснее.
При выходе из программы проверки, в самом конце когда нажимаешь на крестик.
>>Идиотизм.
Ну как бы это не идиотизм а перестраховка на стадии установки. просто система работает в банковской сфере.
>>Они могут не загружаться в утановщике но загружаться в программе, >>и наоборот. Манифесты могут быть указаны (они действуют на одно приложение) >>и текущий каталог и содержимое PATH могут быть разными.
в том то и дело что они загружаются в проекте, я пытаюсь то же самое сделать и для установщика. Установка выполняется в каталоге проекта, т.е. пути все совпадают.
Здравствуйте, cupuyc., Вы писали:
>>>Идиотизм.
C>Ну как бы это не идиотизм а перестраховка на стадии установки. просто система работает в банковской сфере.
Ну, ты же сам видишь, что если они подгружаются в одном случае, не гарантирует, что они будут подгружаться в другом.
Может, по завершении установки производить первый запуск программы (например, с определенным параметром -selftest) и пусть она тестирует все ли в порядке.
Здравствуйте, cupuyc., Вы писали:
C>Необходимо проверить загружаемость, т.е. подгрузить длл в память удостоверится что LoadLibrary отработает нормально без ошибок и выгрузить эту же длл из памяти за ненадобностью.
Может просто проверять PE-файл на корректность? Т.е. сделать проверку, которая бы была аналогом ручной подгрузки DLL в память процесса.
И объясните заказчику что в этом случае достаточно обычной проверки формата файла.
Здравствуйте, acDev, Вы писали:
D>А ещё проще так:
D>LoadLibraryEx(lpFileName, hFile, LOAD_LIBRARY_AS_IMAGE)
а что значит флаг LOAD_LIBRARY_AS_IMAGE ?
>>Может просто проверять PE-файл на корректность?
даже не знаю, т.к. мне нужно проверять полную загрузку с проверкой всех зависимостей и т.д.
>>Может, по завершении установки производить первый запуск программы (например, с определенным параметром -selftest) и пусть она тестирует все ли в порядке.
в принципе это возможно, но оооочень уж геморно.
вот доступные из WINBASE.H, как то не густо:
#define DONT_RESOLVE_DLL_REFERENCES 0x00000001
#define LOAD_LIBRARY_AS_DATAFILE 0x00000002
#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008
Здравствуйте, acDev, Вы писали:
D>Здравствуйте, cupuyc., Вы писали:
C>>этот вариант мне не подходит. мне как раз таки нужно что бы он проверял зависимости.
D>Ну прочитай сам таблицу импорта и загрузи все "зависимости" через LoadLibraryEx.
а почему через LoadLibraryEx ?