Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2009, 15:30   #1
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию LoadLibrary

Функция LoadLibrary возвращает нулевой адресс при динамической загрузке бибилотеки. Сообщений о том, что библиотека имеет неверный формат не возникало. учитывая то, что 5 минут назад все работало... библиотека написана мной, другие библиотеки с такими же функциями загружаються нормально. Какие есть на то возможные причины?
Ниже код загрузки. по надобности могу привести исходники в виде приложения (но думаю не в ней причина).
Код:
DWORD WINAPI Program(LPVOID lParam)
{
	PROG p = *(PROG*)lParam;
	HMODULE h = LoadLibraryA(p.file.c_str());
	if (!h) return false;
	typedef int (*Load)(X_Main*,int,LPVOID);
	Load func;
	func = (Load)::GetProcAddress(h,"Load");
	if (!func) return false;
	func(p.Main,p.version,0);
	return true;
}

bool Start(string file,X_Main * Main,int version)
{
	PROG p;
	p.file = file;
	p.Main = Main;
	p.version = version;
	CreateThread(0,0,Program,&p,0,0);
	Sleep(200);
	return true;
}
lennon вне форума Ответить с цитированием
Старый 14.09.2009, 20:04   #2
АНК
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 30
По умолчанию

Из справки API Win32:
Цитата:
If the function fails, the return value is NULL. To get extended error information, call GetLastError
Т.е. если возвращает NULL, то для получения дополнительной информации надо вызвать GetLastError.

А с ходу - проверте в отладчике, что у Вас в p.file.c_str() перед LoadLibrary...
В коде она инизиализируется как глобальная? Это настораживает.
АНК вне форума Ответить с цитированием
Старый 14.09.2009, 20:27   #3
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Цитата:
Сообщение от АНК Посмотреть сообщение
А с ходу - проверте в отладчике, что у Вас в p.file.c_str() перед LoadLibrary...
енто я проверил сразу. иначе бы не спрашивал.
переменная не глобальная ето структура которая передалась в качестве входных параметров для потока.

и в том то и дело что я незнаю почему GetLastError возвращает ошибку 998 ERROR_NOACCESS. я немножко перефразирую вопрос... почему возникает это ошибка в точке входа в библиотеку? я знаю что тяжело так сразу сказать, но может быть кто то встречался с данной проблемой? не думаю что ошибка в компиляторе (хотя все может быть xD)
lennon вне форума Ответить с цитированием
Старый 14.09.2009, 23:25   #4
АНК
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 30
По умолчанию

Цитата:
Сообщение от lennon Посмотреть сообщение
GetLastError возвращает ошибку 998 ERROR_NOACCESS
Знаете, может быть файл библиотеки каким-то процессом заблокирован и система просто не дает к нему доступа? Не пробовали его просто прочитать каким-либо вьювером?
АНК вне форума Ответить с цитированием
Старый 15.09.2009, 00:02   #5
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

с чтением порядок. именно эта библиотека не хочет загружаться. пробовал на другом месте на диске, с другим названием, изменил код, заново создал проект и собрал, создал пустой проект и пытался загрузить ее в новой программе, собирал в релизе И ОНА ВСЕ РАВНО НЕ ХОЧЕТ ЗАГРУЖАТЬСЯ. повторюся, другие библиотеки имеет такую таблицу экспорта, и они работают, а именно эта не хочет ) я уже и по крышке постучал и моитор протер но ничего не работае 8) вот что за чудо такое?

....

исправил... дело в том что класс был инициализрован в глобальном простарнстве т.е. за пределами любой функции. странно но это всегда работало =\ указатель который передавался в качестве параметра конструктору был не инициализирован сам... он кудато пропал xD
вот что мне помогло =)

Цитата:
To troubleshoot the LoadLibrary() failure, run the application under a debugger and enable first chance exception handling for the C0000005 Access Violation exception. If an access violation occurs when the LoadLibrary() function is called, the application will break into the debugger. The debugger's call stack can then be used to trace where the exception occurred. The stack trace should help you narrow down the actual problem related to the exception being encountered.
ааа черт вот это я затупил

Код:
X_Main * main;
PASSCRACK_API int Load(X_Main * Main,int Version,LPVOID Data)
{
	sock = new x::managment::X_Socket(main->lan);
	if (STARTED) return 0;
	main = Main;
...
}
main не инизиализирован ешо... а раньше sock иницилизировался в глобальном пространстве.. а ведь main то не сузествовал... и поэтому при LoadLibrary получалася ошибочка кхм оО

Последний раз редактировалось SuperVisor; 15.09.2009 в 08:19.
lennon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли у LoadLibrary и FreeLibrary побочный эффект? BaronTreep Win Api 5 23.08.2009 20:52
преобразование переменной AnsiString в PAnsiChar для использования в процедуре loadlibrary The Best Общие вопросы Delphi 2 12.07.2009 20:42