VC++2005: LoadLibrary
От: JumangeeNET Россия http://forum.myquest.ru
Дата: 30.08.08 15:31
Оценка:
Здравствуйте

Проблема странная, но есть. При подключении DLL с помощью LoadLibrary она возвращает 0, а GetLastError = 126 — "Не найден указанный модуль". Эта ошибка вроде как должна появляться только если не найдены модули от которых зависит моя DLL, но они все рядом! Проверял с помощью Dependency Walker — больше никакие не нужны вроде как (он сказал что нужна msvcr80.dll её и всех похожих на нее я подложил рядом, при этом, vc2005 цепляет ее при запуске сам судя по 'core.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_...\msvcp80.dll', No symbols loaded. ). DLL пробовал цеплять и с абсолютными путями, и с относительным....

Возможно ли что причина в самой DLL-ке? Проверил dllmain — она всегда возвращает true, записи в лог нету — значит dllmain ещё не вызывалась вообще?

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    FILE* f = fopen("log.txt", "a");
    fputs("dll test!", f);
    fclose(f);

    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


Сама по-себе длл-ка содержит одну ф-ию отдающую экземпляр класса:

extern "C" __declspec( dllexport ) ISubSys* createSubSys(ICoreSubSys* core)
...


В общем, компиляется, а потом — такая задница....
Могу выложить саму DLL для вскрытия, могу приложить список внешних длл которые положил рядышком... помогите! целый день над этим бьюсь....
visual v++ loadlibrary dll
Re: VC++2005: LoadLibrary
От: axxie  
Дата: 31.08.08 06:31
Оценка:
Здравствуйте, JumangeeNET, Вы писали:

JNE>Проблема странная, но есть. При подключении DLL с помощью LoadLibrary она возвращает 0, а GetLastError = 126 — "Не найден указанный модуль". Эта ошибка вроде как должна появляться только если не найдены модули от которых зависит моя DLL, но они все рядом! Проверял с помощью Dependency Walker — больше никакие не нужны вроде как (он сказал что нужна msvcr80.dll её и всех похожих на нее я подложил рядом, при этом, vc2005 цепляет ее при запуске сам судя по 'core.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_...\msvcp80.dll', No symbols loaded. ). DLL пробовал цеплять и с абсолютными путями, и с относительным....


Я так понял, что core.exe — это ваш главный исполняемый файл, тот который загружает библиотеку с помощью LoadLibrary?
Если это так, то приведенное сообщение ('core.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_...\msvcp80.dll', No symbols loaded) говорит лишь о том, что msvcr80.dll загрузилась для этого экзешника, и не факт, что библиотека тоже её подхватит. Проверьте в ресурсах dll наличие правильного манифеста для SxS. Там должно быть что-то вроде такого:
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
Re[2]: VC++2005: LoadLibrary
От: JumangeeNET Россия http://forum.myquest.ru
Дата: 31.08.08 09:02
Оценка:
Здравствуйте, axxie, Вы писали:

A>Там должно быть что-то вроде такого:

A>
A>  <dependency>
A>    <dependentAssembly>
A>      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
A>    </dependentAssembly>
A>  </dependency>
A>


Примерно такое есть. Проблема решилась — дело было в том, что я случайно пытался юзать юникод-версию LoadLibrary! Перейдя на LoadLibraryA всё стало ок
Re[3]: VC++2005: LoadLibrary
От: Аноним  
Дата: 31.08.08 13:58
Оценка:
JNE>Примерно такое есть. Проблема решилась — дело было в том, что я случайно пытался юзать юникод-версию LoadLibrary! Перейдя на LoadLibraryA всё стало ок
LoadLibraryA не что иное как конверсия переданного параметра в юникод и вызов LoadLibraryW. Так что проблема была в каком-то другом месте.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.