Судя потому, что там написано, return действительно лишний. Без него VC++ 7.1 компилирует это код без ошибок и предупреждений. Я понимаю что библиотека универсальная. Но может следует внести некоторые изменения, например так:
И сново здравствуйте!
Андрей, Вы будете смеяться, но дождавшись наконец-то полного ребилдинга проекта
я заметил еще один варнинг (он тоже из области 4-го уровня).Это C4512!
Проявляется он далеко не всегда, напримерм у меня в проекте есть несеколько модулей оптимизированные под
высокую производительность, поэтому они не искрользуют никаких библиотек, кроме некоторых шаблонов STL, и
в настройки этих подпроэктов выкручены "по максимуму".
Так вот в этих модулях, зачем-то компилятор начинает меня предупреждать что
для структуры CLWMutex и шаблона CAutoLock<T> невозможно автоматически сгенерировать оператор присваивания.
При этом сам оператор в явном виде нигде не вызывается. Я уже слышал про такую особенность VC++ 7.1 и встерчался
с ней в своем коде. Дело в том что этот "умный" компилятор хочет в некоторых местах "соптимизировать" использование
структур и не может это сделать т.к. не может автоматически сгенерировать этот самый оператор (из-за наличия ссылок внутри класса или структуры). После этого он работает как положено, т.е. ошибкой или потенциальной ошибкой это не
считается. Но осадок остался
Во многих форумах встречал такой способ отучить компилятор от глупостей — объявить в приватной секции класса или шаблона конструктор копирования и оператор присваивания, но не реализовывать их. Причем этот способ не влияет на другие компиляторы и дает возможность компилятору "догадатся" что для данного класса или структуры запрещено явное и неявное копирование. В своем коде я делал такое не раз — работает.
В соответствии с этим я, набравшись наглости, модифицировал Ваши классы так:
23W>И сново здравствуйте! 23W>Андрей, Вы будете смеяться, но дождавшись наконец-то полного ребилдинга проекта 23W>я заметил еще один варнинг (он тоже из области 4-го уровня).Это C4512!
Ок, спасибо за поправки, я их интегрировал (в слегка изменнном виде) и выложил результат в файлы по старой ссылке.
A>Библиотека классная. A>Есть одно очень МАЛЕНЬКОЕ замечание A>в строке 478 формируется сообщение "Can'n resolve procedure <%s>: %d". A>Мне кажется что должно быть так "Can't resolve procedure <%s>: %d".
Ага, точно. Этот баг фиксился несколько раз, но, как феникс, он постоянно возрождался от версии к версии Вот и сейчас.
Выложил в файлы исправленный вариант. http://gzip.rsdn.ru/File/8583/delayimphlp.zip
Спасибо за замечание.
Здравствуйте, Andrew S, Вы писали:
AS>Ага, точно. Этот баг фиксился несколько раз, но, как феникс, он постоянно возрождался от версии к версии Вот и сейчас.
Еще вопросик в тему: в вашей статье нигде не упоминается про лицензию? есть какие-нибудь ограничения на использования вашей библиотеки в коммерческих проектах?
AS>>Ага, точно. Этот баг фиксился несколько раз, но, как феникс, он постоянно возрождался от версии к версии Вот и сейчас.
A>
A>Еще вопросик в тему: в вашей статье нигде не упоминается про лицензию? есть какие-нибудь ограничения на использования вашей библиотеки в коммерческих проектах?
Иначе был бы смысл выкладывать ее в общий доступ... Конечно, нет ограничений, по крайней мере, с моей стороны — пользуйте, изменяйте и улучшайте на здоровье. Если какие баги\улучшательства найдете — пишите, поправим\добавим в новые версии.
Здравствуйте, Andrew S, Вы писали:
A>>Еще вопросик в тему: в вашей статье нигде не упоминается про лицензию? есть какие-нибудь ограничения на использования вашей библиотеки в коммерческих проектах? AS>Иначе был бы смысл выкладывать ее в общий доступ... Конечно, нет ограничений, по крайней мере, с моей стороны — пользуйте, изменяйте и улучшайте на здоровье. Если какие баги\улучшательства найдете — пишите, поправим\добавим в новые версии.
1. Немного изменены макросы DL_REPEAT_XXXX Теперь нумерация параметров начинается с 0, а не с 1. Для совместимости с бустом. На внешнем интерфейсе библиотеки это никак не отразилось.
2. Расширен список поддерживаемых компиляторов: добавлена возможность вместо предлагаемой библиотекой реализации использовать порождающие макросы от boost::preprocessor. Для этого надо в свойствах проекта или же перед включением заголовка библиотеки определить макрос
#define DL_USE_BOOST_PP
По крайней мере, теперь макросы не будут проблемой в случае, если нативная реализация не устраивает целевой препроцессор.
1. Генерируемые макросами типы, надобные для внутренних нужд библиотеки, находятся теперь в наймспейсе internal_types. Т.о., чтобы добраться до типа модуля, надо теперь писать нечто вроде module_name::internal_types::module_type. Решение, в принципе, спорное — если есть аргументы за\против, можно пообсуждать.
2. Добавлены макросы DL_UNLOAD_MODULE(nmspace) и DL_RESET_FUN(nmspace, name_id). Первый выгружает модуль, а второй приводит функцию в состояние до загрузки (т.е. при следующем ее вызове опять будет вызван прокси-объект). Понадобится это может, например, если необходимо выгрузить и опять загрузить библиотеку, хотя и будет выглядеть довольно муторно. Если есть лучшие предложения — можно обсудить.
3. Багфиксы юникодной конфигурации (за это отдельное спасибо Вечяславу).
4. Новый пример.
Здравствуйте, Andrew S, Вы писали:
AS>Версия 1.2.0
Скачал новую версию. Компилирую. Запускаю прогу. При загрузке функции получаю Debug Error:
...
File: delayimphlp.h
Line: 611
Run-Time Check Failure #0 — The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling conversion with a function pointer declared with a different calling conversion.
Abort Ignore Retry
Вашу библиотеку использую так:
DL_USE_MODULE_BEGIN(foo, _T("foo.dll"))
DL_DECLARE_FUN_THROW(
Bar
, result
, (char const*)(short)(char const*)(char const*)(char const*)(HWND)(char const*)
)
DL_USE_MODULE_END()
где то в коде...
result bar_result = foo::Bar( // на этой строчке вываливается message box Debug Error'а
str1_.c_str()
, short1_
, str2_.c_str()
, str3_.c_str()
, str4_.c_str()
, m_hWnd
, str5_.c_str()
);
Где грабли?
P.S. Если делаю по простому LoadLibrary, GetProcAddress — все ОК.
Грабли в соглашениях о вызове. У вас, скорее всего, используется __сcall. В библиотеке — __stdcall, и добавлять поддержку других конвенций не планируется.
ssi>P.S. Если делаю по простому LoadLibrary, GetProcAddress — все ОК.
А кто бы сомневался. Там-то вы функцию определяете как __ccall.
Здравствуйте, Andrew S, Вы писали:
ssi>>Где грабли?
AS>Грабли в соглашениях о вызове. У вас, скорее всего, используется __сcall. В библиотеке — __stdcall, и добавлять поддержку других конвенций не планируется.
ssi>>P.S. Если делаю по простому LoadLibrary, GetProcAddress — все ОК.
AS>А кто бы сомневался. Там-то вы функцию определяете как __ccall.
Как выйдти из положения? Dll-ка не моя, поэтому использовать другие соглашения о вызове не могу, в то же время хочу использовать Вашу библиотеку, имхо очень удобная.
Здравствуйте, Аноним, Вы писали:
А>Как выйдти из положения? Dll-ка не моя, поэтому использовать другие соглашения о вызове не могу, в то же время хочу использовать Вашу библиотеку, имхо очень удобная.
Ну так просто замени везде в библиотеке WINAPI на на что надо. Правда её тогда нельзя будет использовать с системными функциями.