Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Ошибка при загрузке DLL


Автор: lv151 4.6.2009, 16:11
HINSTANCE hLib = LoadLibrary("my.dll");
FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL);

MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); - Операция успешно завершена, но hLib = 0;

Автор: GremlinProg 4.6.2009, 16:14
lv151, покажи DLLMain этой библиотеки

Автор: lv151 4.6.2009, 16:15
Цитата(GremlinProg @  4.6.2009,  16:14 Найти цитируемый пост)
покажи DLLMain этой библиотеки 

что это?

читаю мсдн smile

Автор: GremlinProg 4.6.2009, 16:18
Цитата(lv151 @  4.6.2009,  18:15 Найти цитируемый пост)
что это?

главная функция
Цитата(DllMain @ MSDN)

When the system calls the DllMain function with the DLL_PROCESS_ATTACH value, the function returns TRUE if it succeeds or FALSE if initialization fails. If the return value is FALSE when DllMain is called because the process uses the LoadLibrary function, LoadLibrary returns NULL. (The system immediately calls your entry-point function with DLL_PROCESS_DETACH and unloads the DLL.) If the return value is FALSE when DllMain is called during process initialization, the process terminates with an error. To get extended error information, call GetLastError.

When the system calls the DllMain function with any value other than DLL_PROCESS_ATTACH, the return value is ignored.

Автор: lv151 4.6.2009, 16:29
Как отлаживать DllMain?

Автор: GremlinProg 4.6.2009, 16:54
Цитата(lv151 @  4.6.2009,  18:29 Найти цитируемый пост)
Как отлаживать DllMain?

открываешь свойства DLL-проекта, заходишь на вкладку Debugging и заполняешь пункт Сommand
здесь нужно указать любую программу, которая загружает твою DLL
ставишь брейкпойнт в DllMain и отлаживаешь

Автор: lv151 4.6.2009, 16:57
Так и делал, но у меня никогда не заходит в DllMain.

Автор: GremlinProg 4.6.2009, 17:04
значит длл не загружалась, может в пути напутал чего
пробуй загружать длл статически:
Код

#pragma comment(lib,"путь/к/длл")

Автор: lv151 4.6.2009, 17:06
FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL);

MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); - Выдаёт - "Операция успешно завершена"

Автор: GremlinProg 4.6.2009, 17:09
да мы уже поняли ))

Добавлено через 1 минуту и 9 секунд
я имел ввиду при отладке

Добавлено через 2 минуты и 18 секунд
говорю ж показывай DllMain, чего гадать-то

Автор: lv151 4.6.2009, 17:18
Код

#include "afxdllx.h"

static AFX_EXTENSION_MODULE NEAR extensionDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        // extension DLL one-time initialization
        if (!AfxInitExtensionModule(extensionDLL, hInstance))
           return 0;

     new CDynLinkLibrary(extensionDLL);
    }
    return 1;   // ok
}


Автор: GremlinProg 4.6.2009, 17:22
ну, MFC в другом разделе

Автор: lv151 4.6.2009, 17:24
В смысле задавать вопрос в другой раздел форума?

Добавлено @ 17:29
В трэйсе при LoadLibrary наблюдается:
First-chance exception in My1.exe (NTDLL.DLL): 0xC0000139: (no name).

Я ошибся, не в том месте вызывал FormatMessage.
Ошибка - "Не найден указанный модуль".
Код


DWORD z = GetCurrentDirectory(256, tchBuffer);
MessageBox( NULL, (LPCTSTR)tchBuffer, "Folder", MB_OK | MB_ICONINFORMATION ); 
- в той же папке что и экзэшник.

Автор: GremlinProg 4.6.2009, 18:00
ну вот, а я уже переместил топик
Цитата(lv151 @  4.6.2009,  19:24 Найти цитируемый пост)
Ошибка - "Не найден указанный модуль".

Цитата(lv151 @  4.6.2009,  19:24 Найти цитируемый пост)
в той же папке что и экзэшник.

сложно сказать,
тут есть некоторые нюансы совместимости при загрузке образов в Vista/W7: http://www.wasm.ru/forum/viewtopic.php?id=32892
такое возможно, пожалуй, только если длл была скомпилирована, к примеру в XP, а загружается в висте
по крайней мере, на это может указывать ошибка в NTDLL

Автор: lv151 4.6.2009, 19:20
нет, усё в хр. уже и явно путь прописал - та же ерунда :(.

Автор: bugmenot 5.6.2009, 01:04
Выложи exe и dll, если они не очень большие

Автор: Earnest 5.6.2009, 06:07
Модуль может быть другой - используемый этой DLL. Нужно проверить зависимости. Но сначала 100% убедись, что имя \ путь правильно написал, до буквы...

Автор: lv151 5.6.2009, 08:54
Цитата(Earnest @  5.6.2009,  06:07 Найти цитируемый пост)
Модуль может быть другой - используемый этой DLL

т.е.?
Цитата
Выложи exe и dll, если они не очень большие

Извини, не могу, рабочая(не имею права).

Пересобрал все подключённые lib-ки, то же самое.

А не может ли быть дело в exe-нике?

Автор: lv151 5.6.2009, 09:47
Таким образом ведут себя некоторые MFC-ые DLL-ки в моём проекте.
p.s.
Я создал пустой проект и пробую их загружать.

Цитата(Earnest @  5.6.2009,  06:07 Найти цитируемый пост)
Модуль может быть другой - используемый этой DLL. Нужно проверить зависимости. Но сначала 100% убедись, что имя \ путь правильно написал, до буквы... 

проверил.

Пробовал через ::AfxLoadLibrary, то же самое.

Автор: bugmenot 5.6.2009, 12:09
Цитата(lv151 @  5.6.2009,  08:54 Найти цитируемый пост)
А не может ли быть дело в exe-нике?

Если не работает банально LoadLibrary, наверняка дело в DLL.

Цитата(lv151 @  5.6.2009,  08:54 Найти цитируемый пост)
Извини, не могу, рабочая(не имею права).

PM?

Автор: lv151 5.6.2009, 12:11
Цитата(bugmenot @  5.6.2009,  12:09 Найти цитируемый пост)
PM? 

???

Автор: bugmenot 5.6.2009, 12:27
В смысле не хочешь ли ты кинуть мне DLL-ку в PM (личное сообщение)?
Обещаю не продавать smile

Автор: lv151 5.6.2009, 13:07
Не имею права. 

Автор: bugmenot 5.6.2009, 13:13
Ну тогда извини, не знаю, как тебе помочь.

Автор: lv151 5.6.2009, 14:04
И на этом спасибо.

Я раньше не понимал - что за "Ад DLL", вот он и наступил smile.

Автор: Andrey44 5.6.2009, 14:50
Цитата(lv151 @  5.6.2009,  14:04 Найти цитируемый пост)
Я раньше не понимал - что за "Ад DLL", вот он и наступил

Что-то не совсем понятно что за "Ад"
Ты дллку через LoadLibrary в экзэшнике грузишь или в какой другой длл?

Автор: lv151 5.6.2009, 15:08
Да, создал пустой exe проект, в нём

HINSTANCE hLib6 = ::AfxLoadLibrary("d:\\mydll.dll");

hLib6 всегда = NULL;

 smile  smile  smile 

Автор: jonie 5.6.2009, 15:18
FileMon в зубы и смотреть чего он пытается найти и не может

Добавлено через 46 секунд
если не в том проблема (например динамически через ком чего грузится) тогда RegMon поможет

Автор: lv151 5.6.2009, 15:47
d:\WINSPOOL.DRV not found Attributes:Error

Всё сакссэс но hLib6 всегда = NULL; smile 

Автор: lv151 5.6.2009, 17:41
Разобрался, DEPENDS.EXE решает. Дело в одной из подключаемых dll. УРА!
Всем спасибо!

Автор: Andrey44 9.6.2009, 07:04
lv151, ага, значит твоя длл использовала еще одну длл которой не было рядом. smile 

Автор: lv151 9.6.2009, 10:06
Нет, была старая версия вложенной DLL.
Dependency Walker всё показал.

http://ru.wikipedia.org/wiki/Dependency_Walker

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