Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > LoadLibrary


Автор: mrgloom 23.5.2012, 12:46
была строчка кода

Код

m_Module = ::LoadLibrary( path );
    if( m_Module != NULL )


наличие длл проверил, путь тоже всё нормально, но условие не проходит .
раньше работало, теперь длл начала зависеть от python27_d.dll и видимо не грузится.

Добавлено через 4 минуты и 7 секунд
кинул python27_d.dll в ту же папку и заработало.

Автор: GremlinProg 23.5.2012, 14:48
Цитата(mrgloom @  23.5.2012,  14:46 Найти цитируемый пост)
теперь длл начала зависеть от python27_d.dll и видимо не грузится.

Цитата(mrgloom @  23.5.2012,  14:46 Найти цитируемый пост)
кинул python27_d.dll в ту же папку и заработало.

либо python перестал кидать свои библиотеки в системную папку,
либо он был неправильно установлен

Автор: mrgloom 23.5.2012, 15:37
дело в том что я сам собирал python27_d.dll , т.к. он в стандартной поставке не идет.
больше удивляет почему функция LoadLibrary не ругается ,если ей что то не хватает, а просто спокойно выдает нулл.

Автор: 500mhz 23.5.2012, 16:40
для ругани есть GetLastError

Автор: Dem_max 24.5.2012, 04:38
Цитата

функция LoadLibrary не ругается ,если ей что то не хватает, а просто спокойно выдает нулл.

Запомни в Windows если функция WinAPI выполнилась не удачно, то либо она может возвращать код ошибки сама, но для получения кода ошибки надо всегда пользовать GetLastError(); 

Автор: mrgloom 9.6.2012, 14:05
странно в дебаге норм, а в релизе не работает. (не помогает так же кидать python.dll в к основной dll в папку)

GetLastError выдает ошибку 998. Неверная попытка доступа к адресу памяти.

Добавлено через 5 минут и 14 секунд
Код

#define _AFXDLL


если это важно мне еще пришлось добавить это, для того чтобы скомпилить релиз версию.

Автор: mrgloom 9.6.2012, 14:27
вроде выяснил, что не грузит мою длл, т.к. там есть вызов функции из питона и она вызывается не успешно, но как это обрабатывать непонятно.

Автор: mrgloom 13.6.2012, 13:10
теперь такая проблема, запуская свою программу на другом компьютере и она открывается и тут же закрывается, с чем это связано вообще непонятно, вероятно с длл или с тем, что фейлится какая то функция в длл.
на компьютере где разрабатывается всё норм.

Автор: mrgloom 13.6.2012, 14:07
что самое интересное, что при нормальной работе т.е.
Код

m_Module = ::LoadLibrary( path );
DWORD err = ::GetLastError();
CString str;
str.Format(_T("err: %d"), err);
AfxMessageBox(str, MB_OK | MB_ICONERROR);  //ошибка 126  (Не найден указанный модуль. )
if( m_Module != NULL ) //но это условие проходит и всё норм
{...}

Автор: feodorv 13.6.2012, 17:44
GetLastError() имеет смысл вызывать при возникновении ошибки или при специально оговоренных ситуациях. В остальных случаях вызовы не обязаны устанавливать ошибку в 0. То есть ошибочная ситуация не может быть проверена через GetLastError().

Автор: mrgloom 14.6.2012, 09:34
ну а как можно понять от чего не запускается программа, если она не выводит никакой отладочной информации?

Автор: GremlinProg 14.6.2012, 10:59
Цитата(mrgloom @  14.6.2012,  11:34 Найти цитируемый пост)
ну а как можно понять от чего не запускается программа, если она не выводит никакой отладочной информации?

m_Module != NULL и есть признак успешного вызова LoadLibrary,
вот если бы он не выполнялся, тогда можно было бы посмотреть в GetLastError, чтобы понять, что не так, но не наоборот!

т.е. нельзя по GetLastError определить, был ли вызов LoadLibrary успешным, т.к. GetLastError дает код последней ошибки в принципе, т.е. код, который был выставлен функцией SetLastError в последний раз, до вызова GetLastError

в недрах LoadLibrary вызывается еще куча функций и любая могла выставить этот LastError, который в самой LoadLibrary допустим,
поэтому существует правило: посмотреть в GetLastError сразу после вызова функции только при условии, что функция вернулась неуспешно

признак успешности/неуспешности зависит от самой функции, и в документации он отдельно оговорен, как например к LoadLibrary:
Цитата(MSDN @  LoadLibrary Function)

Return Value
   If the function succeeds, the return value is a handle to the module.

   If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Автор: mrgloom 25.6.2012, 14:03
а можно как то выводить информацию о том каких длл-ок не хватает? если моя длл тянет за собой еще длл-ки, или я должен их грузить вручную? и проверять загрузились ли?

Автор: borisbn 25.6.2012, 16:17
Цитата(mrgloom @  25.6.2012,  14:03 Найти цитируемый пост)
а можно как то выводить информацию о том каких длл-ок не хватает?

http://www.dependencywalker.com/

Автор: mrgloom 28.6.2012, 12:13
Цитата(borisbn @  25.6.2012,  16:17 Найти цитируемый пост)
а можно как то выводить информацию о том каких длл-ок не хватает?

http://www.dependencywalker.com/ 


этой программой я и так пользуюсь, а вот в самом коде как?
если я из главного .exe загружаю свою библиотеку .dll, а она тянет за собой еще .dll сторонние, то как проверить их наличие?


+ еще как получить какую либо отладочную информацию от стороннего приложения, а то так часто бывает, что запускаешь какой либо .exe, а он программа просто открывается и закрывается или вообще не открывается и не выдаёт ошибок.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)