Re[11]: [linkerr] DllMain already defined
От: AlexGin Беларусь  
Дата: 28.05.12 15:28
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> Пример:

>>
>> CCommandData* pCommandData = (CCommandData*)ptr->GetThis();
>> if (pCommandData)
>> {
>> HINSTANCE hClientResources = AfxGetResourceHandle();
MZ>hClientResources = AfxGetResourceHandle(); -- это не нужно.

>> AfxSetResourceHandle(::GetModuleHandle("Telecontrol.dll"));

>> // ЗДЕСЬ МЫ РАБОТАЕМ С РЕСУРСАМИ БИБЛТОТЕКИ "Telecontrol.dll"
>> ..................................
>> ..................................
>> ..................................
>> AfxSetResourceHandle(hClientResources); --
MZ>-- и это не нужно.
>> delete pCommandData;
>> }

MZ>НЕ нужно возвращать обратно ресурсник, это бессмысленно.


MZ>Итак, простое правило:

MZ>1) КАЖДЫЙ раз в коде, непосредственно перед тем, как выполнить какую-то
MZ>операцию, которая загружает откуда-то ресурсы, ты должен
MZ>проставить хэндл библиотеки с ресурсами с помощью AfxSetResourceHandle().
MZ>Исключение составляют ресурсы из библиотек MFC и других extension DLL.

MZ>2) Если у тебя в коде идёт подряд скажем 20 операций, загружающих ресурсы,

MZ>нужно ли ставить AfxSetResourceHandle() перед каждой из них -- зависит
MZ>от твоего кода. Если ты уверен на 100%, что никакой другой код в промежутках
MZ>(вызовы дочерних функций, вызовы сообщений и их обработка) не переустановит
MZ>ResourceHandle, то можешь сделать это только один раз, в начале.

MZ>3) Возвращать его при этом нет смысла -- см правило 1)


Допустим, что я сделал по твоему рецепту, то есть написал этот код в таком виде:
Здесь я предполагаю, что мы работаем даже не в головном *.exe модуле, а в какой-либо другой (не Telecontrol.dll) библиотеке:
    CCommandData* pCommandData = (CCommandData*)ptr->GetThis();
    if  (pCommandData)
         {
             AfxSetResourceHandle(::GetModuleHandle("Telecontrol.dll"));
// ЗДЕСЬ МЫ РАБОТАЕМ С РЕСУРСАМИ БИБЛТОТЕКИ "Telecontrol.dll"
                          ..................................
                          ..................................
                          ..................................
            delete  pCommandData;
         }


Что будет дальше, когда мы выйдем из данного участка?
Хендл ресурсов останется на бибилитотеке Telecontrol.dll, вместо перехода на текущую библиотеку.
Наличие хендла на старой библиотеке (которая Telecontrol.dll) обеспечит нам дальнейшие грабли
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.