На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Подключение библиотеки(dll)
    Есть прога, состоящая из екзешника и библиотеки(dll-ки). У меня есть исходники библиотеки, соответственно я могу внести нужные правки, скомпилить и собрать dll-файл. Но если я его закину к экзешнику, заменив имеющуюся dll-ку, то получаю ошибку "Не найдена точка входа... в библиотеку...". Как сие побороть\исправить? Сразу говорю - править исходники экзешника и собрать его по новой не могу.
      Первый тест - собери библиотеку БЕЗ ПРАВОК. И попробуй подключить - отпишись.
        Еще можно открыть этот exe в hex редакторе (за его отсутствием можно ограничиться и Блокнотом) и посмотреть список имен функций, которые exe импортирует из этой библиотеки dll.
        Список импортируемых функций (hex)
        Прикреплённая картинка

        Список импортируемых функций (текст)
        Прикреплённая картинка
          Majestio
          Пробовал, все то-же.

          Цитата macomics @
          посмотреть список имен функций, которые exe импортирует из этой библиотеки dll

          Зачем? Я же написал, и экзешник и библиотека - один проект, просто править библиотеку я могу а экзешник нет.
          Просто давно уже подзабросил с WinAPI ковыряться, не помню как там реализовано подключение библиотек к экзешнику. Помню, что вроде есть какой-то 16-значный идентификатор, и бла-бла-бла...
            А причем тут WinAPI. У меня нету вашего exe - я просто взял любой попавшийся под руку и показал как пример импорт из KERNEL32.DLL
            Вам надо найти такой же список в своем exe, но для своей библиотеки. Дописать в секцию экспорта библиотеки все те функции, которые exe ждет от нее. Иначе он не запустится. При сопоставлении имен импортируемых функций в exe и экспортируемых функций из dll загрузчик выдаст ошибку "Не найдена точка входа... в библиотеку..." и все остановится на этом. Таким образом необходимо обеспечить, чтобы из библиотеки экспортировались все функции, которые импортирует из нее exe. А для этого надо иметь на руках полный список этих функций.
            Как его получить я вам уже написал.
              Цитата AndreySol @
              .. получаю ошибку "Не найдена точка входа... в библиотеку...". Как сие побороть\исправить?

              .def - файл подключен к dll проекту ?

              Добавлено
              Цитата macomics @
              Еще можно открыть этот exe в hex редакторе..

              Лучше взять спец-утилиту и посмотреть экспорт из оригинальной
              dll и вновь собранной. И сравнить список функций.
                Цитата ЫукпШ @
                Лучше взять спец-утилиту и посмотреть экспорт из оригинальной
                dll и вновь собранной. И сравнить список функций.

                Тогда уж не из оригинальной, а из самого этого exe.
                Спасибо что напомнили. Поищите depends. Утилита, которая позволяет просматривать импорт и экспорт.
                  Цитата macomics @
                  Тогда уж не из оригинальной, а из самого этого exe.

                  Причём тут exe ?
                  Он исправен и не интересен.
                  Интересна разница в dll-ях.
                  Эту разницу экспорта и надо смотреть.
                  Можно так (приаттачено)
                  Сообщение отредактировано: ЫукпШ -

                  Прикреплённый файлПрикреплённый файлpe_tut07_export.zip (1,84 Кбайт, скачиваний: 49)
                    Цитата ЫукпШ @
                    Причём тут exe ?
                    Он исправен и не интересен.
                    Интересна разница в dll-ях.
                    Эту разницу экспорта и надо сотреть.

                    Скрытый текст
                    MajestioПервый тест - собери библиотеку БЕЗ ПРАВОК. И попробуй подключить - отпишись.
                    AndreySolПробовал, все то-же.

                    Этот вариант уже не катит. На это уже ответили.
                    Exe нужен, чтобы определить недостающие функции, присутствие которых он ожидает в этой библиотеке. Из-за отсутствия одной из таких функций и получается ошибка. Но так как редактировать можно только библиотеку, тогда посмотреть исходный список можно только в exe.
                      Цитата macomics @
                      Скрытый текст
                      MajestioПервый тест - собери библиотеку БЕЗ ПРАВОК. И попробуй подключить - отпишись.
                      AndreySolПробовал, все то-же.

                      Этот вариант уже не катит. На это уже ответили.

                      Предлагаемый эксперимент к экспорту dll отношения не имеет.
                      И вообще смысла в нем мало.
                      Как раз начинать надо со сравнения экспорта dll.
                        Цитата ЫукпШ @
                        Как раз начинать надо со сравнения экспорта dll.

                        Так вы меня так и не поняли. У него нету dll, с которой exe запускается.
                        Тогда и остается только сравнивать список импорта exe со списком экспорта dll.
                        В списке экспорта dll могут присутствовать лишние функции, но в нем же должны быть все функции из списка импорта exe.
                        т.к. изменять можно только код dll, тогда только и остается что дополнить список ее экспорта недостающими функциями, хотя бы на уровне stub'ов.
                          Цитата
                          У него нету dll, с которой exe запускается.

                          Отвечу вам вашей же записью: Так вы меня так и не поняли.
                          Есть проект, который в виде исходников под VS-студию. Экзешник и библиотека собраны из этих исходников. Экзешник собран не мной, и в него внесены правки. Я собрал библиотеку не внося в нее никаких правок и она не подключается к экзешнику. Ошибка подробнее:
                          Цитата
                          Точка входа в процедуру
                          ?mem_alloc@xrMemory@QAEPAXI@Z не найдена в библиотеке ....xrSE_Factory.dll

                          Код экзешника и библиотеки:
                          ExpandedWrap disabled
                            int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
                            {
                                ....
                             
                                HMODULE     hFactory;
                                LPCSTR      g_name  = "xrSE_Factory.dll";
                                Log     ("Loading DLL:",g_name);
                                hFactory    = LoadLibrary   (g_name);
                                if (0==hFactory) R_CHK  (GetLastError());
                                R_ASSERT2   (hFactory,"Factory DLL raised exception during loading or there is no factory DLL at all");
                             
                                ....
                             
                                return      (0);
                            }
                             
                            BOOL APIENTRY DllMain(HANDLE module_handle, DWORD call_reason, LPVOID reserved)
                            {
                                switch (call_reason)
                                {
                                    case DLL_PROCESS_ATTACH:
                                    {
                                        g_temporary_stuff = &trivial_encryptor::decode;
                             
                                        Core._initialize("xrSE_Factory",NULL,TRUE,"fsfactory.ltx");
                                        string_path SYSTEM_LTX;
                                        FS.update_path(SYSTEM_LTX,"$game_config$","system.ltx");
                                        pSettings = xr_new<CInifile>(SYSTEM_LTX);
                             
                                        CCharacterInfo::InitInternal();
                                        CSpecificCharacter::InitInternal();
                             
                                        break;
                                    }
                                    case DLL_PROCESS_DETACH:
                                    {
                                        ....
                                    }
                                }
                                return (TRUE);
                            }

                          в буфере обмена имеется лог ошибки:
                          Цитата
                          Expression : hFactory
                          Function : WinMain
                          File : .\xrAI.cpp
                          Line : 225
                          Description : Factory DLL raised exception during loading or there is no factory DLL at all

                          Как я понимаю, проблема в том, что сборка делалась в разных версиях VS-студии, т.е. разные версии компиляторов\компоновщиков.
                          Как это побороть, причем на стороне dll-ки, т.к. править экзешник я не могу, потому-что потеряю правки сдкланные не мной.

                          M
                          Используем тег [code]!
                          Сообщение отредактировано: B.V. -
                            Цитата AndreySol @
                            Отвечу вам вашей же записью: Так вы меня так и не поняли.

                            Вот как раз описанное вами и означает: "У него нету dll, с которой exe запускается".
                            Пускай exe и dll из одного проекта, но exe не запускается с той dll, которая у вас есть.
                            Цитата AndreySol @
                            Expression : hFactory
                            Function : WinMain
                            File : .\xrAI.cpp
                            Line : 225
                            Description : Factory DLL raised exception during loading or there is no factory DLL at all

                            Ошибка во время сопоставления списка импортируемых exe функций и экспортируемых dll функций.
                            Открываете exe с помощью Блокнот, hex-редактора или depends и ищите список импорта. Приводите список экспорта в библиотеке к списку импорта exe (чтобы все имена из списка импорта присутствовали в списке экспорта). Как вы этого добьетесь - ваша задача. Подробностей про компилятор вы не оставили. Привести имена к похожему виду можно и вручную - точно их определив для экспортируемой функции (чтобы студия не добавляла к именам свои приписки вроде "?mem_alloc@xrMemory@QAEPAXI@Z" - подчеркнуто).
                            Но приписки, которые уже существуют в именах функций из списка импорта exe файла вам надо будет перенести и определить их, задавая точные имена экспортируемым из dll функциям. Поэтому без исследования списка импорта exe и не обойтись.
                            Сообщение отредактировано: macomics -
                              Цитата AndreySol @
                              Ошибка подробнее:
                              Цитата
                              Точка входа в процедуру
                              ?mem_alloc@xrMemory@QAEPAXI@Z не найдена в библиотеке ....xrSE_Factory.dll

                              AndreySol, стандартные библиотеки подключены к проекту dll ?
                              А также все другие необходимые.
                              Все ли необходимые модули (исходники) подключены к проекту ?
                              Сообщение отредактировано: ЫукпШ -
                                Цитата AndreySol @
                                Majestio
                                Пробовал, все то-же.


                                Ну вот, видишь, первый шаг ты прошел успешно! Код библиотеки без твоих правок - неработоспособен. Как говорят, отсутствие результата - уже есть результат. Что делать дальше - я не знаю. Но перво-наперво я бы замарочился с отладкой. Что исполняемый модуль желает загрузить (я про DLL), и что он там хочет найти.

                                Сорян, дальше - это выше моей компетенции. Дальше сам + Гугыль + СтекОверфлов
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0442 ]   [ 21 queries used ]   [ Generated: 28.03.24, 20:28 GMT ]