Ошибка 1814 при создании CToolBar
От: woof  
Дата: 29.11.06 20:26
Оценка:
Совершенно неожиданно пришлось писать на MFC, которая уже порядком позабыта... да и изменений в библиотеке за последние три года наверное произошло немало...

Господа, кто-нибудь сталкивался с ошибкой 1814 (The specified resource name cannot be found in the image file.) при вызове функции LoadToolBar?

Ошибка возникает при вызове указанной функции из метода OnCreate, который принадлежит классу-наследнику от CMDIChildWnd. Пытаюсь использовать код приведенный в MSDN (CToolBar::CreateEx) с минимальными изменениями, а он никак не хочет работать.

    if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

        if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
            | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
            !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
        {
            TRACE1("Failed to create toolbar %d\n", GetLastError());
            //return -1;      // fail to create
        }

        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&m_wndToolBar);
   
    return 0;


Возможно ли что ошибка возникает из-за того что и класс, в котором создается ToolBar, и ресурс его (ToolBar) описывающий находятся в DLL? Идентификатор ресурса уникален и для DLL, что естественно, и для приложения вцелом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Ошибка 1814 при создании CToolBar
От: SexMachine Украина www.is.svitonline.com/sashko1
Дата: 01.12.06 11:36
Оценка:
Здравствуйте, woof, Вы писали:

W>Возможно ли что ошибка возникает из-за того что и класс, в котором создается ToolBar, и ресурс его (ToolBar) описывающий находятся в DLL? Идентификатор ресурса уникален и для DLL, что естественно, и для приложения вцелом.


Попробуйте перенести вызов собственно CToolBar.CreateEx внутрь ДЛЛ — в какой нибудь врап-метод. Там то он точно будет работать со своими ресурсами.
У кого-то варит голова, у кого-то — желудок...
Re[2]: Ошибка 1814 при создании CToolBar
От: woof  
Дата: 01.12.06 12:00
Оценка:
Здравствуйте, SexMachine, Вы писали:

SM>Попробуйте перенести вызов собственно CToolBar.CreateEx внутрь ДЛЛ — в какой нибудь врап-метод. Там то он точно будет работать со своими ресурсами.


Т.е. вынести создание тулбара из класса Frame, например, в App, и вызывать эту функцию из OnCreate? Я правильно понял суть идеи или имелось в виду что-то другое?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Ошибка 1814 при создании CToolBar
От: SexMachine Украина www.is.svitonline.com/sashko1
Дата: 01.12.06 12:25
Оценка:
Здравствуйте, woof, Вы писали:

W>Т.е. вынести создание тулбара из класса Frame, например, в App, и вызывать эту функцию из OnCreate? Я правильно понял суть идеи или имелось в виду что-то другое?


Да, только вынести не в App, а внутрь ДЛЛ — добавить экспортируемую функцию вроде CreateMyToolBar( DWORD dwFlags,...);
У кого-то варит голова, у кого-то — желудок...
Re[4]: Ошибка 1814 при создании CToolBar
От: woof  
Дата: 01.12.06 12:33
Оценка:
Здравствуйте, SexMachine, Вы писали:

SM>Да, только вынести не в App, а внутрь ДЛЛ — добавить экспортируемую функцию вроде CreateMyToolBar( DWORD dwFlags,...);


Спасибо, так и хочется поскорее попробовать, но получится только вечером
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Ошибка 1814 при создании CToolBar
От: woof  
Дата: 02.12.06 09:40
Оценка:
Здравствуйте, SexMachine, Вы писали:

SM>Да, только вынести не в App, а внутрь ДЛЛ — добавить экспортируемую функцию вроде CreateMyToolBar( DWORD dwFlags,...);


К сожалению этот вариант не сработал, причем аналогичная ошбка происходит и в том случае если я пытаюсь вызвать LoadBitmap

Может быть есть еще какие-то предложения, по поводу того как можно побороть данную ошибку? Я уже кажется все варианты перебрал...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Ошибка 1814 при создании CToolBar
От: woof  
Дата: 04.12.06 04:20
Оценка:
Нашлось решение и для этой проблемы , и возможно оно позволит кому-нибудь сохранить пару часов. К сожалению мне потребовалось гораздо больше времени...

При загрузке ресурсов находящихся в DLL обратите внимение на функцию AfxGetStaticModuleState();

By default, MFC uses the resource handle of the main application to load the resource template. If you have an exported function in a DLL, such as one that launches a dialog box in the DLL, this template is actually stored in the DLL module. You need to switch the module state for the correct handle to be used. You can do this by adding the following code to the beginning of the function:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.