Не пашет CRT-инициализация, когда exe-шник грузится через LoadLibrary

Тема в разделе "LANGS.C", создана пользователем EvilsInterrupt, 19 ноя 2010.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Всем привет,

    У меня проблема инциализации CRT-части модуля.


    Существует проект MSVC 2010 ulimate, в результате которого получается "1.exe" . Пользователи юзали этот файл как ГУИ часть продукта. Из-за нужных полезностей в этом проекте, добавлена экспортируемая функция CoolFunc в этом "1.exe" и которую я вызываю через схему LoadLibrary -> GetProcAddress в другом ActiveX модуле --- active.ocx , читай dll-файл.

    Особенности:
    Скрипт партнерского продукта зовет мой ActiveX - active.ocx, следовательно мой active.ocx грузится в процесс партнерского продукта, но моими LoadLibrary к нему грузится и 1.exe

    В чем сложность?

    В моей экспортируемой функции создается статический объект класс CLibraryInitailization :

    Код (Text):
    1. bool coolFunc()
    2. {
    3.   static CLibraryInitailization initObj;
    4. ..
    Суть этого объекта в том, чтобы в конструкторе заинициализировать нужные вещи для работы функции в дальнейшем, а в деструкторе все ресурсы освободить.

    Но почему-то , конструктор этого объекта при создании не вызывается!!!

    Почему?

    ЗЫ:
    Если чтото непонятно, спрашивайте. Модуль 1.exe должен как и раньше уметь работать в качестве GUI, т.е. там не желательные глобальные переделки, но он также должен работать и как dll чтобы предоставить экспортируемую функцию
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    EvilsInterrupt
    может вынеси из екзе нужный функционал в длл и совместно её юзать?
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    wsd
    Не вариант, по срокам к вторнику не успеть! )))
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt
    Вы имеете в виду, что конструктор CLibraryInitailization не вызывается при вызове coolFunc()?
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    green
    Да! Не дергается! ;) А должен, это же статический объект и этот конструктор должен отработать один раз, но увы его работы не наблюдается
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt
    Это очень странно... инициализация локальных статических не-PОD объектов не имеет отношения к общему механизму инициализации глобальных статических объектов.
    Можете показать код ф-ции coolFunc?
    Можно только бинарный (obj) или asm.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    EvilsInterrupt
    ну тогда заместо статик инита сингелтон вбахать?
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    green
    Поглядел по внимательней, что воообще ну уровне ассемблера и увидел , что конструктор-то дергается! Однако внутри него не отрабатывает new оператор, внутри него встречается вызов функции malloc и делая на этом вызове F10, т.е. не заходя в функцию получаю исключение! Оператор new внутри конструктора юзается для создания другого объекта класса, который уже протестирован и в другом проекте при тех-же аргументах нормально отрабатывает!

    В опциях проекта стоит /MTd , т.к. смотрю дебаг версию
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >>ну тогда заместо статик инита сингелтон вбахать?
    только что пост написал. ;) Не получится, потому что new не отрабатывает!
     
  10. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Поступила мысль для всего проекта перегрузить new и delete внутрь впихнуть VirtualAlloc . Кто чего еще предложит ? )))
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt
    Я бы всё-таки выяснил, почему malloc грохается... возможно, это следствие другой ошибки (испорчен хип и т.п.).
     
  12. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ну так понятно же в чем проблема по-моему. Когда грузится exe как dll, естественно не происходит инициализация CRT и malloc валится как и многое другое. Если перегрузить new на VirtualAlloc это не будет решением проблемы, т.к. будет падать что-нибудь другое. Нужно либо костылями вызвать инициализацию crt, либо можно попробовать собрать exe и ocx с использованием одной и той же msvcrt**.dll (с динамической линковкой).
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    KeSqueer
    Твоя вторая мысль примерно в юзание WDK -> Build.cmd он кажется может привязать к одной и той же msvcrt**.dll (с динамической линковкой). ????
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt
    Я подумал, что вы из dll обращаетесь к уже загруженному процессобразующему exe. Просто грузить в процесс второй ехе через LoadLibrary нельзя - по-моему, windows ему даже импорты не настроит.
    Т.е. грузить-то можно, но не как исполняемый модуль. Для чтения ресурсов, например.
     
  15. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    только что проверил,- если ты грузишь ехе с экспортом через LoadLibrary, то его точка входа не вызывается, - соответственно не получаешь и никакого инита CRT.

    эт твоя уже подгруженная длл должна делать h = GetModuleHandle(0); GetProcAddress(h, "helloexe")
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    При загрузке exe через LoadLibrary:
    1) не настраивается таблица импорта и не грузятся указанные в ней dll,
    2) не настраиваются релоки (хотя образ в больш-ве случаев грузится не по своему адресу),
    3) ес-но не вызывается точка входа и соотв-но не инициализируется CRT и т.п.
    Примерчик того как это можно исправить ручками см., например, здесь (последние два поста).
    (Хотя не факт, что вызова одной функции типа _heap_init достаточно для инициализации всего, того, что может юзаться в экспортируемой функции...)
     
  17. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    По-моему, Clerk как-то упоминал недокументированную ф-цию, позволяющую "загрузить" DLL, уже замапленную в память процесса. Если так, то можно грузить ехе через LoadLibrary, установить ему DLL-флаг в заголовке и вызвать эту ф-цию.
     
  18. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo
    Мне не совсем понятно, почему мой exe-шник, в котором вижу наличие релоков, вдруг не может нормально загрузиться? Все казалось бы есть : импорт - да, релоки - да. Разве что в хидере не указан флаг что это длл, может быть видя этот флаг сис. загрузчик не применяет релоки или еще чтото
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да, именно так. См. LoadLibraryEx:
    А на деле даже и релоки не фиксятся, т.к. предполагается, что загрузка exe через LoadLibrary может юзаться только для извлечения ресурсов - см.ремарку из LoadLibrary:
     
  20. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo
    дааа, чуется мне надо отвлечься или в отпуск, хз где ваще глаза! ))) спасибо! )
    Тема закрыта, вопрос исчерпан. Спасибо всем, наибольшую пользу оказал leo спасибо ему! ;)