На главную Наши проекты:
Журнал   ·   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.
  
> CreateWindow и ERROR_PROC_NOT_FOUND , Не рисутся кнопка...
    Есть программа, в ней есть DLL в котором рисуется окошко и в нем кнопки.
    Так вот, если просто запустить программу то DLL создает окно и рисует кнопки. Но если запустить программу через что либо (например через CreateProcess) то DLL рисует окно НО кнопки не рисует. Глянул под отладчиком - вот такая ошибка: ERROR_PROC_NOT_FOUND
    Кнопку рисую так:
    ExpandedWrap disabled
      CreateWindow("button", " ", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 20, 20+25*2, WindowW-20, 20, hSettingWnd, (HMENU)ID_B1, NULL, NULL);

    Скрин :
    user posted image
    Заранее благодарен за любую помощь.
    Сообщение отредактировано: Skino -
      Надо понимать, что программа и DLL не твои?
        DLL моя.
          И раньше она загружалась нормально?
          Судя по ошибке, вызывающая программа не может найти одну из экспортируемых функций твоей DLL.
            Цитата B.V. @
            И раньше она загружалась нормально?

            Изначально и всегда была такая проблема.
            Цитата B.V. @
            Судя по ошибке, вызывающая программа не может найти одну из экспортируемых функций твоей DLL.

            В DLL нету экспорт. функций. Функция создания кнопки чисто из windows.h
              Цитата Skino @
              Но если запустить программу через что либо (например через CreateProcess)

              lpCurrentDirectory что указываешь?
              укажи директорию программы, которую запускаешь
                Цитата Skino @
                В DLL нету экспорт. функций.

                Т.е. ты производишь все эти действия в DllMain, где не рекомендуется делать ничего, кроме элементарной инициализации?

                Цитата MSDN
                Warning There are serious limits on what you can do in a DLL entry point. To provide more complex initialization, create an initialization routine for the DLL. You can require applications to call the initialization routine before calling any other routines in the DLL.
                ...
                Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.
                  B.V.Весь код безопасен и рабочий (проверено). НО проблемы только когда запускаешь прогу из под проги...
                    Никакое количество положительных тестов не может доказать правильность теории. С ростом их количества всего лишь уменьшается вероятность её неправильности. Но достаточно всего только одного испытания, провалившегося у заказчика, чтобы теория оказалась несостоятельной, и неустойку платить придётся, никуда не денешься.
                      Разница между двумя методами запуска в текущей директории для запускаемого процесса. Следовательно, ошибка может быть связана с загрузкой другой копии какой-то dll, не имеющей необходимой экспортируемой функции. Но это не оправдывает наличие подобного кода в DllMain, и называть код корректным, только потому что он работает при определенных условиях, когда в документации явным образом не рекомендуется вызывать в DllMain что-либо, кроме функций kernel (и то, не всех) -- как минимум, некорректно
                        Так же хочу подметить что окно, и кнопка окна создаются через одну и ту же функцию (CreateWindowExA), только вот рузультат создания главного окна = ERROR_SUCCESS а кнопки ERROR_PROC_NOT_FOUND. Причём идут они все следом.
                          Для начала, перенеси код из DllMain в отдельную экспортируемую функцию, и приведи её здесь, если ошибка не исчезнет
                            Цитата B.V. @
                            перенеси код из DllMain в отдельную экспортируемую функцию

                            А смысл если её вызов будет все равно из самой DLL.

                            Добавлено
                            Цитата Skino @
                            перенеси код из DllMain в отдельную экспортируемую функцию

                            И вообще у меня в DllMain создается новый поток, а потом в нем уже все пляски.
                              О боже...
                              Цитата
                              Because Kernel32.dll is guaranteed to be loaded in the process address space when the entry-point function is called, calling functions in Kernel32.dll does not result in the DLL being used before its initialization code has been executed. Therefore, the entry-point function can call functions in Kernel32.dll that do not load other DLLs. For example, DllMain can create synchronization objects such as critical sections and mutexes, and use TLS. Unfortunately, there is not a comprehensive list of safe functions in Kernel32.dll.

                              Windows 2000: Do not create a named synchronization object in DllMain because the system will then load an additional DLL. This restriction does not apply to subsequent versions of Windows.

                              Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components.

                              Цитата
                              During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process.
                              Это то, что нарылось за три минуты. Дальше копать сам справишься?
                                Цитата Qraizer @
                                Это то, что нарылось за три минуты. Дальше копать сам справишься?

                                В цитатах не увидел ничего что бы помогло мне "копать" в нужно направлении.
                                  Даже так... Я считал, что приведённых цитат более чем достаточно, чтобы отказаться от затеи играть с огнём. Особенно, учитывая что ты прав: копать можно долго и упорно, выискивая всё новые и новые подводные камни и без конца примеряя их к своему коду.
                                  Впрочем, хозяин - барин. Удачной отладки.
                                    Цитата Qraizer @
                                    отказаться

                                    К сожалению нет такой возможности. Я больше чем уверен что вопрос решится максимум затрагивая 50 символов.
                                    Просто я не знаю что и где косячит.
                                      Вы не понимаете, вот упр. часть кода:
                                      ExpandedWrap disabled
                                        // рисуем MainWindow
                                        hSettingWnd = CreateWindowEx(...);
                                        // далее рисуем кнопки
                                        CreateWindowEx(...);

                                      Если пройтись отладчиком то видно что первая функция CreateWindowEx возвратила SUCCESS_ERROR, идущая СЛЕДОМ за ней уже ERROR_PROC_NOT_FOUND, отсюда следут что адрес функции существует и находится в должном месте.

                                      В новом потоке DLL перед кодом я поставил Sleep(5000) т.е. код исполняется после всех виданных и невиданных инициализаций.

                                      П.С.
                                      Dem_max, пожалуйста относитесь с уважением к участникам форума.

                                      Добавлено
                                      Попробывал такой метод:
                                      ExpandedWrap disabled
                                        typedef HWND (__stdcall *pCreateWindowEx)(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,
                                            int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
                                        pCreateWindowEx MyCreateWindowEx;
                                         
                                            HMODULE hmUser32 = GetModuleHandle("User32.dll");
                                            MyCreateWindowEx = (pCreateWindowEx)GetProcAddress(hmUser32, "CreateWindowExA");

                                      Функции выполнились успешно, нашлась DLL, нашелся адрес, но попытка создать кнопку через новую функцию к сожалению не увенчался успехом.
                                      Сообщение отредактировано: Skino -
                                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script execution time: 0,0456 ]   [ 15 queries used ]   [ Generated: 7.11.25, 22:14 GMT ]