zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Похоже вот subj возник... никто не упражнялся? Есть ли с этим проблемы?
Т.е. в Win32API-dll зашифрованные данные с открытыми ключами (массив строк в base64)... пока параметров было немного, встраивал в dll-ку в виде статического массива прямо как есть... ... Хотелки возросли, вместе с ними и объём данных, который нужно встроить в dll-ку... Попробовал всё это безобразие пожать в zip-файл (через System.IO.Packaging) -> при нормальном сжатии, процент сжатия 25%... в принципе, выигрыш есть... При использовании, планирую заюзать Packaging API: http://msdn.microsoft.com/en-us/library/windows/desktop/dd742822%28v=vs.85%29.aspx (OpcServices.dll) http://msdn.microsoft.com/en-us/library/windows/desktop/ee453681%28v=vs.85%29.aspx... Полазил по инету... чего-то не увидел, чтобы subj где-то встретился... Так вот, не юзал ли кто? Какой тип ресурса для этого может подойти? Document?... [attachment 15300 typeRc.jpg] Ладненько, завтра поглазеем... может чего и выйдет... ;) Ну т.е. не хотелось бы иметь zip-файл, лежащий рядом с dll-кой, а поместить его прямо в неё... в виде ресурса... ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 3 раз(а). Последнее : MichaelD, 04.01.13 03:12 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Импорт. Выбрать файл. В диалоге "Resource type" ввести RCDATA.
Ну или руками прописать в .rc файл строчку вида
Цитата:Вообще-то зашифрованные данные (ну и "случайные" типа ключей) в общем случае НЕ сжимаются. base64 - конечно же сжимается, но на кой было кодировать исходные байтики в base64, чтобы потом, путём сжатия получить снова те же самые "байтики"? Не логичнее тогда ПРОСТО в виде ресурса (или даже кучи отдельных ресурсов - по 1 на "ключ-элемент") помещать некодированные в base64 массивчики байт? P.S. На самом деле можно и кастомный тип использовать - например написать RSAKeys, или ещё чего Просто это потом нужно будет в коде вычитывания ресурсов применять. ------------------ WBR, Igor Исправлено 1 раз(а). Последнее : Igor Korolyov, 04.01.13 13:18 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Спасибо, наткнулся на пример C++ кода, демонстрирующего использование: http://stackoverflow.com/questions/9240188/how-to-load-a-custom-binary-resource-in-a-vc-static-library-as-part-of-a-dll ...
Поскольку ключи генерятся в одном приложении (генератор данных), хранятся в другом модуле (dll-с данными для клиента), а используются в третьем (собственно целевом приложении, поставленном клиенту, и использующем эту dll)... то решил, что - просто полученные в результате шифровки "байтики" - не очень-то "транспортабельны"... и лучше уж иметь "соответствующие base64-строки" (на накладные расходы - наплевать... ;) ) - кроме того, на этапах шифровки/дешифровки мной используется алгоритмическое (соответственно прямое и обратное) преобразования данных (ну чтобы уж не в очень-то прямом виде были зашифрованные данные, полученные в результате "стандартной процедуры шифрования")... где мне удобнее было работать именно "со строками", чем просто с "байтиками"... Т.ч. логика мысли, приведшей к замене "байтиков" на "строки" была такой... ;) Ну а использование сжатие, как понимаю, просто "слегка компенсирует" этот "дополнительно возникший объём" в результате этой "моей прихоти"... ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 2 раз(а). Последнее : MichaelD, 04.01.13 17:11 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Блин, сам себе проблемы нашёл... - мало того, что использование требует "обходительный способ обращения" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd742822%28v=vs.85%29.aspx)
Э... блин, "тонкий" намёк на "толстые" обстоятельства... Хм... тот то я смотрю, что "их примеры кода" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd742823%28v=vs.85%29.aspx) написаны "как функции", а "не как классы"... Что сразу мне не понравилось... однако, как только нарисовал класс-покрышку, тут же получил обломы типа: Цитата: Ладненько... перерисовал на то, "как сделано у них"... "всё зафунциклировало"... Однако:- оно ещё имеет и "ограничение на возможность использование": . http://en.wikipedia.org/wiki/Open_Packaging_Conventions Цитата: . http://social.msdn.microsoft.com/Forums/en-US/os_opc/thread/3ab75f39-e008-4662-a2a6-96c6aff43080 Цитата: http://msdn.microsoft.com/en-us/library/windows/desktop/dd371219%28v=vs.85%29.aspx Цитата: Э... Может кто подскажет "free native-code API's" для работы "с zip-данными из-под Win32Api-dll", лишённый указанных ограничений? COM-обёртки в т.ч. и над System.IO.Packaging пока не интересуют... --- - http://www.boost.org/doc/libs/1_52_0/index.html - http://www.codeproject.com/articles/4288/win32-wrapper-classes-for-gilles-volant-s-zip-unzi?msg=4068466 - ? скачал/поглазел на последнее... вроде работает... ;) ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 9 раз(а). Последнее : MichaelD, 06.01.13 14:33 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Цитата: Хм... а никто не "развлекался" на пути использования штатных Windows-средств, типа: http://www.autohotkey.com/board/topic/18239-zipunzip-using-native-zipfolder-feature-in-xp/, т.е. используя zipfldr.dll (https://forum.script-coding.com/viewtopic.php?id=5556) Цитата: ? ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 1 раз(а). Последнее : MichaelD, 07.01.13 11:42 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Совет с http://gcup.ru/forum/45-19693-1 вроде помогает: Цитата: ... ну хорошо, пробуем копаться дальше... ;) ------------------ С уважением, Михаил Дроздов, Пермь, Россия |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Похоже пара http://www.zlib.net/ (zlib 1.2.7) + http://www.codeproject.com/Articles/4457/zipstream-bzip2stream-iostream-wrappers-for-the-zl (zipstream, bzip2stream: iostream обертки для zlib, bzip2 библиотеки) -> составит то, что можно будет использовать... и не только в этой задачке... ------------------ С уважением, Михаил Дроздов, Пермь, Россия |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Мы использовали обёртку sevenzipsharp.codeplex.com - но это надо для "управляемых" сред. Для unmanaged можно напрямую использовать 7z.dll
Попытки "использовать встроенное в винду" - IMHO блажь и неверный путь ------------------ WBR, Igor |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Чего-то изрядно достал меня этот вопрос (приседания вокруг встраивания zlib, bzip2 в boost-iostreams)... ... и похоже наконец нашёл, что как-то так http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/ нужно попробовать... ;)
Ну это конечно... ;)
По времени, пока не до жиру... ну в переборе различных решений... Блин пока не получается так чтобы взял + воспользовался -> получил результат... пошёл дальше... ------------------ С уважением, Михаил Дроздов, Пермь, Россия |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Хм... а "ларчик" похоже открывается вот такой последовательностью: http://stackoverflow.com/questions/7282645/how-to-build-boost-iostreams-with-gzip-and-bzip2-support-on-windows - How to build boost iostreams with gzip and bzip2 support on Windows... ;) ------------------ С уважением, Михаил Дроздов, Пермь, Россия |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Хм... это несколько не так... , например, вот такой тест: // testDecompresses.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <sstream> #include <string> #include <boost/iostreams/filtering_streambuf.hpp> #include <boost/iostreams/filter/bzip2.hpp> #include <boost/iostreams/copy.hpp> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { std::string buf = "this is a test\n"; //boost::iostreams::filtering_istream in; // I think this is simpler boost::iostreams::filtering_streambuf<boost::iostreams::input> in; in.push(boost::iostreams::bzip2_compressor()); std::istringstream uncompressed_string(buf); // in.push(boost::make_iterator_range(buf)); // another option in.push(uncompressed_string); std:stringstream compressed_string; boost::iostreams::copy(in, compressed_string); std::cout << compressed_string.str(); return 0; } после успешной компиляции, при линке не видит libboost_bzip2-vc100-mt-gd-1_52.lib... .. Ну и реально в \boost\boost_1_52_0\stage\lib - не наблюдаем такого... Однако, после того как "допилим" согласно http://stackoverflow.com/questions/12950544/boost-iostreams-with-bzip-unresolved-symbols, т.е. выполнив вот такую команду: >b2.exe --with-iostreams -sBZIP2_SOURCE=C:\bzip2-106 приведённый выше код наконец-то зафунциклировал! Хм... т.е. "чудо", в виде появления набора библиотек: libboost_bzip2-vc100-mt-1_52.lib libboost_bzip2-vc100-mt-gd-1_52.lib libboost_bzip2-vc100-mt-s-1_52.lib libboost_bzip2-vc100-mt-sgd-1_52.lib свершилось! ... Ну и далее, если в вышеприведённом коде заменить bzip2 на zlib, то получаем те же яйца: LINK : fatal error LNK1104: cannot open file 'libboost_zlib-vc100-mt-gd-1_52.lib' ... и соответственно, выполнив: >b2.exe --with-iostreams -sZLIB_SOURCE=C:\zlib127 имеем в \boost\boost_1_52_0\stage\lib недостающие библиотеки: libboost_zlib-vc100-mt-1_52.lib libboost_zlib-vc100-mt-gd-1_52.lib ... ну и код конечно же начинает выполняться! О чём как бы говорит выдержка из документации: http://www.boost.org/doc/libs/1_40_0/libs/iostreams/doc/installation.html по поводу параметров ZLIB_SOURCE/BZIP2_SOURCE имеет вот такой намёк: Цитата: ... ну да, после того как весь интернет исползаешь , в принципе "доходчиво"... ;) ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 3 раз(а). Последнее : MichaelD, 09.01.13 16:36 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Хм... это просто "чудо" какое-то... ну по возможностям то там то сям огребать проблемы...
Проделываю то, что прекрасно работало - в MS VS.NET 2010(SP1) под OS Windows 2003 Server x86, но теперь под OS Windows 7 x64, собирая также 32-битные приложения - в MS VS.NET 2010(SP1) - в MS VS.NET 2012 ну я имею ввиду вот это: Цитата: для кода, использующего zlib: #include "stdafx.h" #include <sstream> #include <string> #include <boost/iostreams/filtering_streambuf.hpp> //#include <boost/iostreams/filter/bzip2.hpp> #include <boost/iostreams/filter/zlib.hpp> #include <boost/iostreams/copy.hpp> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { std::string buf = "this is a test\n"; //boost::iostreams::filtering_istream in; // I think this is simpler boost::iostreams::filtering_streambuf<boost::iostreams::input> in; // in.push(boost::iostreams::bzip2_compressor()); in.push(boost::iostreams::zlib_compressor()); std::istringstream uncompressed_string(buf); // in.push(boost::make_iterator_range(buf)); // another option in.push(uncompressed_string); std:stringstream compressed_string; boost::iostreams::copy(in, compressed_string); std::cout << compressed_string.str(); return 0; } при попытки скомпилировать и создать приложение, вылетает такое: 1>------ Перестроение всех файлов начато: проект: testDecompresses, Конфигурация: Debug Win32 ------ 1> testDecompresses.cpp 1>c:\program files (x86)\boost\boost_1_52_0\boost\iostreams\copy.hpp(128): warning C4244: 'argument' : conversion from 'std::streamsize' to 'int', possible loss of data 1> c:\program files (x86)\boost\boost_1_52_0\boost\iostreams\copy.hpp(159) : see reference to function template instantiation 'std::streamsize boost::iostreams::detail::copy_impl<Source,Sink>(Source &,Sink &,std::streamsize,boost::mpl::false_,boost::mpl::false_)' being compiled 1> with 1> [ 1> Source=boost::reference_wrapper<boost::iostreams::filtering_streambuf<boost::iostreams::input>>, 1> Sink=boost::reference_wrapper<std:stringstream> 1> ] 1> c:\program files (x86)\boost\boost_1_52_0\boost\iostreams\copy.hpp(157) : while compiling class template member function 'std::streamsize boost::iostreams::detail::copy_operation<Source,Sink>:perator ()(void)' 1> with 1> [ 1> Source=boost::reference_wrapper<boost::iostreams::filtering_streambuf<boost::iostreams::input>>, 1> Sink=boost::reference_wrapper<std:stringstream> 1> ] 1> c:\program files (x86)\boost\boost_1_52_0\boost\iostreams\copy.hpp(180) : see reference to class template instantiation 'boost::iostreams::detail::copy_operation<Source,Sink>' being compiled 1> with 1> [ 1> Source=boost::reference_wrapper<boost::iostreams::filtering_streambuf<boost::iostreams::input>>, 1> Sink=boost::reference_wrapper<std:stringstream> 1> ] 1> c:\program files (x86)\boost\boost_1_52_0\boost\iostreams\copy.hpp(245) : see reference to function template instantiation 'std::streamsize boost::iostreams::detail::copy_impl<boost::reference_wrapper<T>,boost::reference_wrapper<std::basic_ostringstream<_Elem,_Traits,_Alloc>>>(Source,Sink,std::streamsize)' being compiled 1> with 1> [ 1> T=boost::iostreams::filtering_streambuf<boost::iostreams::input>, 1> _Elem=char, 1> _Traits=std::char_traits<char>, 1> _Alloc=std::allocator<char>, 1> Source=boost::reference_wrapper<boost::iostreams::filtering_streambuf<boost::iostreams::input>>, 1> Sink=boost::reference_wrapper<std:stringstream> 1> ] 1> c:\users\michael\documents\visual studio 2010\projects\testdecompresses1\testdecompresses\testdecompresses.cpp(27) : see reference to function template instantiation 'std::streamsize boost::iostreams::copy<boost::iostreams::filtering_streambuf<Mode>,std:stringstream>(Source &,Sink &,std::streamsize,void *,void *)' being compiled 1> with 1> [ 1> Mode=boost::iostreams::input, 1> Source=boost::iostreams::filtering_streambuf<boost::iostreams::input>, 1> Sink=std:stringstream 1> ] 1> stdafx.cpp 1> Generating Code... 1>testDecompresses.obj : error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::default_compression" (?default_compression@zlib@iostreams@boost@@3HB)" 1>testDecompresses.obj : error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::deflated" (?deflated@zlib@iostreams@boost@@3HB)" 1>testDecompresses.obj : error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::default_strategy" (?default_strategy@zlib@iostreams@boost@@3HB)" 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "protected: __thiscall boost::iostreams::detail::zlib_base::~zlib_base(void)" (??1zlib_base@detail@iostreams@boost@@IAE@XZ) в функции __unwindfunclet$??0?$zlib_compressor_impl@V?$allocator@D@std@@@detail@iostreams@boost@@QAE@ABUzlib_params@23@@Z$0 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "protected: __thiscall boost::iostreams::detail::zlib_base::zlib_base(void)" (??0zlib_base@detail@iostreams@boost@@IAE@XZ) в функции "public: __thiscall boost::iostreams::detail::zlib_compressor_impl<class std::allocator<char> >::zlib_compressor_impl<class std::allocator<char> >(struct boost::iostreams::zlib_params const &)" (??0?$zlib_compressor_impl@V?$allocator@D@std@@@detail@iostreams@boost@@QAE@ABUzlib_params@23@@Z) 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "protected: void __thiscall boost::iostreams::detail::zlib_base::reset(bool,bool)" (?reset@zlib_base@detail@iostreams@boost@@IAEX_N0@Z) в функции "public: __thiscall boost::iostreams::detail::zlib_compressor_impl<class std::allocator<char> >::~zlib_compressor_impl<class std::allocator<char> >(void)" (??1?$zlib_compressor_impl@V?$allocator@D@std@@@detail@iostreams@boost@@QAE@XZ) 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "private: void __thiscall boost::iostreams::detail::zlib_base::do_init(struct boost::iostreams::zlib_params const &,bool,void * (__cdecl*)(void *,unsigned int,unsigned int),void (__cdecl*)(void *,void *),void *)" (?do_init@zlib_base@detail@iostreams@boost@@AAEXABUzlib_params@34@_NP6APAXPAXII@ZP6AX22@Z2@Z) в функции "protected: void __thiscall boost::iostreams::detail::zlib_base::init<class std::allocator<char> >(struct boost::iostreams::zlib_params const &,bool,struct boost::iostreams::detail::zlib_allocator<class std::allocator<char>,class std::allocator<char> > &)" (??$init@V?$allocator@D@std@@@zlib_base@detail@iostreams@boost@@IAEXABUzlib_params@23@_NAAU?$zlib_allocator@V?$allocator@D@std@@V12@@123@@Z) 1>testDecompresses.obj : error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::stream_end" (?stream_end@zlib@iostreams@boost@@3HB)" 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: static void __cdecl boost::iostreams::zlib_error::check(int)" (?check@zlib_error@iostreams@boost@@SAXH@Z) в функции "public: bool __thiscall boost::iostreams::detail::zlib_compressor_impl<class std::allocator<char> >::filter(char const * &,char const *,char * &,char *,bool)" (?filter@?$zlib_compressor_impl@V?$allocator@D@std@@@detail@iostreams@boost@@QAE_NAAPBDPBDAAPADPAD_N@Z) 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "protected: void __thiscall boost::iostreams::detail::zlib_base::after(char const * &,char * &,bool)" (?after@zlib_base@detail@iostreams@boost@@IAEXAAPBDAAPAD_N@Z) в функции "public: bool __thiscall boost::iostreams::detail::zlib_compressor_impl<class std::allocator<char> >::filter(char const * &,char const *,char * &,char *,bool)" (?filter@?$zlib_compressor_impl@V?$allocator@D@std@@@detail@iostreams@boost@@QAE_NAAPBDPBDAAPADPAD_N@Z) 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "protected: int __thiscall boost::iostreams::detail::zlib_base::xdeflate(int)" (?xdeflate@zlib_base@detail@iostreams@boost@@IAEHH@Z) в функции "public: bool __thiscall boost::iostreams::detail::zlib_compressor_impl<class std::allocator<char> >::filter(char const * &,char const *,char * &,char *,bool)" (?filter@?$zlib_compressor_impl@V?$allocator@D@std@@@detail@iostreams@boost@@QAE_NAAPBDPBDAAPADPAD_N@Z) 1>testDecompresses.obj : error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::no_flush" (?no_flush@zlib@iostreams@boost@@3HB)" 1>testDecompresses.obj : error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::finish" (?finish@zlib@iostreams@boost@@3HB)" 1>testDecompresses.obj : error LNK2019: ссылка на неразрешенный внешний символ "protected: void __thiscall boost::iostreams::detail::zlib_base::before(char const * &,char const *,char * &,char *)" (?before@zlib_base@detail@iostreams@boost@@IAEXAAPBDPBDAAPADPAD@Z) в функции "public: bool __thiscall boost::iostreams::detail::zlib_compressor_impl<class std::allocator<char> >::filter(char const * &,char const *,char * &,char *,bool)" (?filter@?$zlib_compressor_impl@V?$allocator@D@std@@@detail@iostreams@boost@@QAE_NAAPBDPBDAAPADPAD_N@Z) 1>C:\Users\Michael\Documents\Visual Studio 2010\Projects\testDecompresses1\Debug\testDecompresses.exe : fatal error LNK1120: 14 неразрешенных внешних элементов ========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ========== советы докомпилить статические lib-ы, типа: b2 --with-iostreams -sBZIP2_SOURCE=C:\bzip2-106 runtime-link=static b2 --with-iostreams -sZLIB_SOURCE=C:\zlib-127 runtime-link=static b2 toolset=msvc-10.0 --with-iostreams -sBZIP2_SOURCE=C:\bzip2-106 runtime-link=static b2 toolset=msvc-10.0 --with-iostreams -sZLIB_SOURCE=C:\zlib-127 runtime-link=static ну да, дополнительные lib-ы в boost\boost_1_52_0\stage\lib получаем: ... libboost_bzip2-vc100-mt-s-1_52 libboost_bzip2-vc100-mt-sgd-1_52 libboost_bzip2-vc110-mt-s-1_52 libboost_bzip2-vc110-mt-sgd-1_52 ... libboost_zlib-vc100-mt-s-1_52 libboost_zlib-vc100-mt-sgd-1_52 libboost_zlib-vc110-mt-s-1_52 libboost_zlib-vc110-mt-sgd-1_52 ... но это "не решает указанную выше проблему"... И в интернет чего-то не удаётся найти способ решения этой проблемы... Не там ищу?... P.S. на http://www.zlib.net/DLL_FAQ.txt говориться, что под статик собрана специальная библиотека ZLIB1.DLL (если правильно понял, конечно)... но вроде как в boost мы не используем вариант с dll... Вобщем, здесь я чего-то не понял... ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 1 раз(а). Последнее : MichaelD, 11.01.13 08:33 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
... При использовании bzip2_decompressor(), после того как bz2-ресурс-файл в dll будет получен, например как-нибудь так:
/////////////////////////////////////////////////////////// // BinaryResourceData.h #pragma once class CBinaryResourceData { protected: HRSRC m_resourceData; HGLOBAL m_hResourceData; HGLOBAL m_hResForStream; LPVOID m_pMemForStream; UINT m_resourceDataSize; LPVOID m_pBinaryResourceData; public: CBinaryResourceData(void); ~CBinaryResourceData(void); DWORD Load(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType); UINT GetResourceDataSize(void); LPVOID GetBinaryResourceData(void); }; /////////////////////////////////////////////////////////// // BinaryResourceData.cpp #include "StdAfx.h" #include "BinaryResourceData.h" // Constructor CBinaryResourceData::CBinaryResourceData(void) : m_resourceData(NULL), m_resourceDataSize(0), m_hResourceData(NULL), m_pBinaryResourceData(NULL), m_hResForStream(NULL), m_pMemForStream(NULL) { } // Destructor CBinaryResourceData::~CBinaryResourceData(void) { if (m_hResForStream != NULL) { ::GlobalFree(m_hResForStream); m_hResForStream = NULL; } } // Load resorce DWORD CBinaryResourceData::Load(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType) { DWORD dwLastError = S_OK; if ((m_resourceData = ::FindResource(hModule, lpName, lpType)) == NULL) { dwLastError = ::GetLastError(); } if (dwLastError == S_OK && (m_resourceDataSize = ::SizeofResource(hModule, m_resourceData)) == 0) { dwLastError = ::GetLastError(); } if (dwLastError == S_OK && (m_hResourceData = ::LoadResource(hModule, m_resourceData)) == NULL) { dwLastError = ::GetLastError(); } if (dwLastError == S_OK && (m_pBinaryResourceData = ::LockResource(m_hResourceData)) == NULL) { dwLastError = ::GetLastError(); } if (dwLastError == S_OK && (m_hResForStream = ::GlobalAlloc(GPTR, m_resourceDataSize)) == NULL) { dwLastError = ::GetLastError(); } if (dwLastError == S_OK && (m_pMemForStream = ::GlobalLock(m_hResForStream)) == NULL) { dwLastError = ::GetLastError(); } if (dwLastError == S_OK && !::GlobalUnlock(m_hResForStream)) { dwLastError = ::GetLastError(); } if (dwLastError == S_OK && m_resourceDataSize > 0) { ::CopyMemory(m_pMemForStream, m_pBinaryResourceData, m_resourceDataSize); } return dwLastError; } UINT CBinaryResourceData::GetResourceDataSize() { return m_resourceDataSize; } LPVOID CBinaryResourceData::GetBinaryResourceData() { return m_pBinaryResourceData; } /////////////////////////////////////////////////////////////////// здесь последние два метода возвращают размер вытащенного из ресурсов bz2-файла и адрес памяти, в которую эти данные были размещены... ... Возникает проблем: как этот самый массив запакованных данных, присоеденить к входному потоку filtering_streambuf<input> in, обеспечивающему распаковку? Так вот здесь: http://artofcode.wordpress.com/2010/12/12/deriving-from-stdstreambuf/ - "Deriving from std::streambuf" - показано: как это можно сделать! ... В результате код, что-нибудь типа: ///////////////////////////////////////////// // DataB2zTools.h #pragma once using namespace std; class CDataB2zTools { public: CDataB2zTools(void); ~CDataB2zTools(void); DWORD GetDataFromFile(LPCTSTR lpszFileName, vector<string>* pvsResults); DWORD GetDataFromBinary(LPVOID pBinaryResourceData, UINT resourceDataSize, vector<string>* pvsResults); }; template< typename StrT > int split(const char* str, const char* delim, vector<StrT>& results, bool empties = true) { char* pstr = const_cast<char*>(str); char* r = NULL; r = strstr(pstr, delim); int dlen = strlen(delim); while( r != NULL ) { char* cp = new char[(r-pstr)+1]; memcpy(cp, pstr, (r-pstr)); cp[(r-pstr)] = '\0'; if( strlen(cp) > 0 || empties ) { StrT s(cp); results.push_back(s); } delete[] cp; pstr = r + dlen; r = strstr(pstr, delim); } if( strlen(pstr) > 0 || empties ) { results.push_back(StrT(pstr)); } return results.size(); } ///////////////////////////////////////////// // DataB2zTools.cpp #include "StdAfx.h" #pragma warning(disable:4244) #include <boost/iostreams/filtering_streambuf.hpp> #include <boost/iostreams/copy.hpp> #include <boost/iostreams/filter/bzip2.hpp> #pragma warning(default:4244) using namespace std; #include "DataB2zTools.h" // artofcode.wordpress.com - см. детали в статье "Deriving from std::streambuf" CDataB2zTools::CDataB2zTools(void) { } CDataB2zTools::~CDataB2zTools(void) { } DWORD CDataB2zTools::GetDataFromFile(LPCTSTR lpszFileName, vector<string>* pvsResults) { using namespace boost::iostreams; DWORD dwErr = S_OK; try { ifstream file(lpszFileName, ios_base::in | ios_base::binary); filtering_streambuf<input> in; in.push(bzip2_decompressor()); in.push(file); stringstream oss; boost::iostreams::copy(in, oss); string is = oss.str(); split(is.c_str(), ";", *pvsResults, true); } catch (...) { dwErr = GetLastError(); } return dwErr; } DWORD CDataB2zTools::GetDataFromBinary(LPVOID pBinaryResourceData, UINT resourceDataSize, vector<string>* pvsResults) { using namespace boost::iostreams; DWORD dwErr = S_OK; try { const std::string sbr(reinterpret_cast<char*>(pBinaryResourceData), resourceDataSize); std::istringstream isb(sbr); filtering_streambuf<input> in; in.push(bzip2_decompressor()); in.push(isb); stringstream oss; boost::iostreams::copy(in, oss); string is = oss.str(); split(is.c_str(), ";", *pvsResults, true); } catch (...) { dwErr = GetLastError(); } return dwErr; } /////////////////////////////////////////////////////////////////// в DllMain позволит вытащить этот ресурс в виде вектора: vector<string> g_vsResourceData; (зазипованные данные в моём случае, это разделённые через ';' строковые данные в base-64 кодировке), как-нибудь так: /////////////////////////////////////////////////////////////////// // dllmain.cpp : Defines the entry point for the DLL application. #include "stdafx.h" #include "EASyncData.h" #include "BinaryResourceData.h" #include "DataB2zTools.h" //////////////////////////////////////////////////////////////////////// // Globals for this module. // HMODULE g_hModule = NULL; vector<string> g_vsResourceData; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hModule = hModule; if (g_vsResourceData.size() == 0) { DWORD dwErr = E_FAIL; CBinaryResourceData binaryResourceData; dwErr = binaryResourceData.Load(hModule, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); UINT uiResourceDataSize = binaryResourceData.GetResourceDataSize(); if (dwErr == S_OK && uiResourceDataSize > 0) { CDataB2zTools dataB2zTools; dataB2zTools.GetDataFromBinary( binaryResourceData.GetBinaryResourceData(), uiResourceDataSize, &g_vsResourceData); } else { LPVOID lpMsgBuf; ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErr, 0, // Default language (LPTSTR)&lpMsgBuf, 0, NULL); if (lpMsgBuf != NULL) { ::MessageBox( ::GetForegroundWindow(), (LPCTSTR)lpMsgBuf, _T("EASyncData.dll - error on loading resource:"), MB_OK|MB_ICONERROR); ::LocalFree(lpMsgBuf); } else { _TCHAR szErrMsg[_MAX_PATH + _MAX_FNAME]; _stprintf_s(szErrMsg, _MAX_PATH + _MAX_FNAME, _T("Error code = %d"), dwErr); ::MessageBox( ::GetForegroundWindow(), szErrMsg, _T("EASyncData.dll - error on loading resource:"), MB_OK|MB_ICONERROR); } } } case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: case DLL_THREAD_DETACH: break; } lpReserved; return TRUE; } //////////////////////////////////////////////////////////////////////////// // EASyncData.h // The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the EASYNCDATA_EXPORTS // symbol defined on the command line. this symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // EASYNCDATA_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #ifdef EASYNCDATA_EXPORTS #define EASYNCDATA_API __declspec(dllexport) #else #define EASYNCDATA_API __declspec(dllimport) #endif EASYNCDATA_API INT GetMaxItems(); EASYNCDATA_API BSTR GetValue(INT item); //////////////////////////////////////////////////////////////////////////// // EASyncData.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #include "EASyncData.h" extern std::vector<std::string> g_vsResourceData; EASYNCDATA_API BSTR GetValue(INT item) { if (item < 0 || item >= (INT)g_vsResourceData.size()) { return SysAllocString(L"*** Error arg item."); } else { LPCSTR selValue = (LPCSTR)g_vsResourceData[item].c_str(); return SysAllocString((LPCWSTR)selValue); } } EASYNCDATA_API INT GetMaxItems() { return (INT)g_vsResourceData.size(); } //////////////////////////////////////////////////////////////////////////// // TestEASyncData.cpp : Defines the entry point for the console application. // #include "stdafx.h" typedef int (__cdecl *pfnGetMaxItems)(); typedef LPCSTR (__cdecl *pfnGetValue)(int index); int _tmain(int argc, _TCHAR* argv[]) { LPCTSTR szDllFile = _T("EASyncData.dll"); DWORD dwLastError = S_OK; HMODULE hModule = ::LoadLibrary(szDllFile); if (hModule == NULL) { dwLastError = ::GetLastError(); _tprintf(_T("Error = %d\n"), dwLastError); } else { pfnGetMaxItems GetMaxItems; pfnGetValue GetValue; GetMaxItems = (pfnGetMaxItems)::GetProcAddress(hModule, (LPCSTR)"GetMaxItems"); GetValue = (pfnGetValue)::GetProcAddress(hModule, (LPCSTR)"GetValue"); if (GetMaxItems != NULL && GetValue != NULL) { int maxItems = GetMaxItems(); LPCSTR lpszValue0 = GetValue(0); LPCSTR lpszValueMax = GetValue(maxItems - 1); printf("maxItems = %d\n", maxItems); printf("lpszValue0 = %s\n", lpszValue0); printf("lpszValueMax = %s\n", lpszValueMax); } else { _tprintf(_T("GetMaxItems == NULL || GetValue == NULL")); } ::FreeLibrary(hModule); } _tprintf(_T("Press any key to exite...")); _gettch(); return 0; } ////////////////////////////////// maxItems = 230 lpszValue0 = 3sUPjoNHW2hBLG3 lpszValueMax = HE7sXWpHXeJOjE2 Press any key to exite... т.е. binaryResourceData.Load(...) - вытаскивает ресурс в память, а dataB2zTools.GetDataFromBinary(...) распаковывает, парсит и размещает полученный данные в векторе g_vsResourceData... Э... надеюсь не слишком вас утомил? Ну всё-таки решил изложить "с подробностями", вдруг кому-нить придётся повторить эти "мои телодвижения"... ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 6 раз(а). Последнее : MichaelD, 17.01.13 07:03 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Изложенное, прекрасно работает из-под MS VS2010(SP1) в 32-битовом варианте... однако, попытки проделать это же в MS VS2008, после успешной компиляции, приводят к проблемам линковки, аналогичным выше приведённым: Цитата: при Цитата: ... Есть подозрение, что это следствие "неправильной" пересбоки библиотек из http://www.bzip.org/downloads.html - "1.0.6 source tarball" из-под MS VS2008 (в 32-бит) ( ну и выше в MS VS2012 (в 64-бит)) в том виде "как есть"... ну т.е. сами библиотеки boost вроде как не причём... Может кто уже наезжал на подобные грабли при использовании именно этой версии исходников, взятых с www.bzip.org в вариантах: из-под MS VS2008 (в 32-бит) ( ну и выше в MS VS2012 (в 64-бит)) (что-то типа: https://github.com/DennisOSRM/Project-OSRM/wiki/Windows-Compilation)... и поделится конкретными действиями для преодоления ? ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 4 раз(а). Последнее : MichaelD, 17.01.13 08:01 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Чтобы "правильно" откомпилировать boost-версии lib-библиотек для bzip2, нужно будет "слегка потрудиться"... ;) И мои телодвижения в этом направлении, можно изложить в виде вот такой "инструкции", приводящей, как надеюсь, к положительному результату... Во всяком случае, у меня это (из-под MS VS2008) получилось... ;) Цитата: ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 11 раз(а). Последнее : MichaelD, 19.01.13 17:35 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
... Вот сюда: https://skydrive.live.com/redir?resid=6877DB1EDC597E2B!174&authkey=!ABZ0hHnbALZ0hJY - "Как откомпилировать модули библиотеки boost (http://www.boost.org/) для MS VS 2008/2010 с тем, чтобы было возможным использование библиотек bzip2 (http://www.bzip.org/) и zlib (http://www.zlib.net/)?", т.е. дополнил предыдущую версию (где звук только о bzip2) информацией и по zlib-библиотеке...
Как надеюсь, изложенные инструкции помогут вам добиться желаемого... ;) ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 3 раз(а). Последнее : MichaelD, 22.01.13 08:06 |
Re: zip-файл как ресурс в MS VC++ Win32API-dll | |
---|---|
MichaelD Автор Сообщений: 7578 Дата регистрации: 14.05.2005 |
Есть подозрение, что с необходимостью наличия *.dll/*.lib в исходных каталогах, я несколько погорячился... , в реальности, непосредственно при сборке lib-библиотек через b2.exe, никакие "предварительно собранные" библиотеки: - zdll.dll, zdll.dll, zlib.dll zlib.lib из C:\zlib-127 - libbz2.dll libbz2.dll.lib из C:\bzip2-106 не участвуют... Во всяком случае, несколько нелогично: зачем "уже собранные", если собственно и производится "пересборка"? ... Вернее так: они конечно нужны, если вы собираетесь воспользоваться этими библиотеками "вне использования библиотеки boost", но вот при при сборке lib-библиотек через b2.exe - "они никак не задействованы"... А это, в свою очередь, "несколько упрощает" дело подготовки библиотеки boost... Чтобы проверить, я переместил перечисленные выше библиотеки в другое место... и, выполнил команду на сборку, типа: Цитата: ниже, несколько "подрезанные" результаты выполнения из окна команд: Цитата: Т.е. если не обращать внимание на кучу предупреждений об использовании устаревших функций, то требуемые библиотеки были успешно пересозданы! ;) Другими словами, мои извинения, что я "слегка помутил воду" в этом вопросе... Ладненько, завтра попробую подправить текст документа по ссылке... ;) ------------------ С уважением, Михаил Дроздов, Пермь, Россия Исправлено 1 раз(а). Последнее : MichaelD, 20.01.13 02:29 |
© 2000-2024 Fox Club  |