Испрользование объектов в коде драйвера

Тема в разделе "WASM.NT.KERNEL", создана пользователем ubil, 12 дек 2006.

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Я точно знаю, что NuMega Driver Studio умела писать код с использованием объектов, который замечательно собирался с помощью build.exe. Кто-нибудь может подсказать как это делается? Нумегу лишний раз ставить/сносить только ради того чтобы посмотреть как они там с объектами работают как-то не хочется...

    ЗЫ: Ошибки такие:
    Linking Executable - i386\klogger.sys for i386
    klogger.obj() : error LNK2019: unresolved external symbol _atexit referenced in function _$E1
    klogger.obj() : error LNK2019: unresolved external symbol "public: __thiscall CLogQueue::CLogQueue(void)" (??0CLogQueue@@QAE@XZ) referenced in function _$E1
    klogger.obj() : error LNK2019: unresolved external symbol "public: __thiscall CL
    ogQueue::~CLogQueue(void)" (??1CLogQueue@@QAE@XZ) referenced in function _$E2
    klogger.obj() : error LNK2019: unresolved external symbol "public: void __thiscall CLogQueue::PutString(char *)" (?PutString@CLogQueue@@QAEXPAD@Z) referenced in function "long __stdcall InitializeLogger(void)" (?InitializeLogger@@YGJXZ)
    i386\klogger.sys() : error LNK1120: 4 unresolved externals
    BUILD: Done

    2 files compiled - 190 LPS
    1 executable built - 5 Errors
    ЗЗЫ: Шото да собралось, но думаю врядли оно будет работать нормально
     
  2. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    не юзай статические обекты с юзер-дефайнед конструкторами и деструкторами, вынеси их в одельные методы и вызывай руками как в дельфи... можно ли это обойти не искал... имхо такие объекты ошибка дизайна
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Кароче, уже спать типа лег, и вспомнил что файл loqueue.cpp забыл в sources прописать:) Прописал - осталась только одна ошибка:
    driver.obj() : error LNK2019: unresolved external symbol _atexit referenced in function _$E1
    i386\klogger.sys() : error LNK1120: 1 unresolved externals

    Она возникала когда я обект определял глобально. Если определять локально, на стеке, то все ОК...
    Кастати да, fr0b-p, если убрать конструктор и деструктор, то все работает. Спасибо!
     
  4. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    трабла из-за того что конструкторы статиков вызываются до твоего кода а деструкторы после завершения --> компиль цепляет c-runtime...

    если легко удалось статик заменить авто-объеком то ошибка дизайна исправлена :) но глобальные объекты бывают нуны и чтоб не дергать по пустякам IoAllocateDriverObjectExtension мона примерно так:

    #include <new>

    class my
    {
    my(); // user-defined constructor

    static my & instance()
    {
    static char storage[sizeof(my)];
    my * const ptr = (my*)storage;
    static bool initialized;
    if ( !initialized )
    {
    new ( ptr ) my(); // placement new
    initialized = true;
    }
    return *ptr;
    }
    };

    типа паттерн singleton
    если надо деструктор то придется делать обертку с подсчетом ссылок