:: Не фоксом единым
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
Ratings: 0 negative/0 positive
Re: zip-файл как ресурс в MS VC++ Win32API-dll
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Импорт. Выбрать файл. В диалоге "Resource type" ввести RCDATA.
Ну или руками прописать в .rc файл строчку вида
IDR_RCDATA1 RCDATA "MyFile.7z"
Соответственно в resource.h описать константу
#define IDR_RCDATA1 101
Это стандартный тип ресурса ("неуправляемого" - т.е. обычного win32) для "произвольных бинарных данных".

Цитата:
зашифрованные данные с открытыми ключами (массив строк в base64)
Вообще-то зашифрованные данные (ну и "случайные" типа ключей) в общем случае НЕ сжимаются. base64 - конечно же сжимается, но на кой было кодировать исходные байтики в base64, чтобы потом, путём сжатия получить снова те же самые "байтики"? Не логичнее тогда ПРОСТО в виде ресурса (или даже кучи отдельных ресурсов - по 1 на "ключ-элемент") помещать некодированные в base64 массивчики байт?

P.S. На самом деле можно и кастомный тип использовать - например написать RSAKeys, или ещё чего Просто это потом нужно будет в коде вычитывания ресурсов применять.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 04.01.13 13:18
Ratings: 0 negative/0 positive
Re: zip-файл как ресурс в MS VC++ Win32API-dll
MichaelD
Автор

Сообщений: 7578
Дата регистрации: 14.05.2005
Igor Korolyov
Импорт. Выбрать файл. В диалоге "Resource type" ввести RCDATA.
Ну или руками прописать в .rc файл строчку вида

IDR_RCDATA1 RCDATA "MyFile.7z"

Соответственно в resource.h описать константу

#define IDR_RCDATA1 101

Это стандартный тип ресурса ("неуправляемого" - т.е. обычного win32) для "произвольных бинарных данных".

Спасибо, наткнулся на пример C++ кода, демонстрирующего использование:

http://stackoverflow.com/questions/9240188/how-to-load-a-custom-binary-resource-in-a-vc-static-library-as-part-of-a-dll ...


Igor Korolyov
Цитата:
зашифрованные данные с открытыми ключами (массив строк в base64)

Вообще-то зашифрованные данные (ну и "случайные" типа ключей) в общем случае НЕ сжимаются. base64 - конечно же сжимается, но на кой было кодировать исходные байтики в base64, чтобы потом, путём сжатия получить снова те же самые "байтики"? Не логичнее тогда ПРОСТО в виде ресурса (или даже кучи отдельных ресурсов - по 1 на "ключ-элемент") помещать некодированные в base64 массивчики байт?

Поскольку ключи генерятся в одном приложении (генератор данных), хранятся в другом модуле (dll-с данными для клиента), а используются в третьем (собственно целевом приложении, поставленном клиенту, и использующем эту dll)... то решил, что

- просто полученные в результате шифровки "байтики" - не очень-то "транспортабельны"... и лучше уж иметь "соответствующие base64-строки" (на накладные расходы - наплевать... ;) )
- кроме того, на этапах шифровки/дешифровки мной используется алгоритмическое (соответственно прямое и обратное) преобразования данных (ну чтобы уж не в очень-то прямом виде были зашифрованные данные, полученные в результате "стандартной процедуры шифрования")... где мне удобнее было работать именно "со строками", чем просто с "байтиками"...

Т.ч. логика мысли, приведшей к замене "байтиков" на "строки" была такой... ;) Ну а использование сжатие, как понимаю, просто "слегка компенсирует" этот "дополнительно возникший объём" в результате этой "моей прихоти"...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия




Исправлено 2 раз(а). Последнее : MichaelD, 04.01.13 17:11
Ratings: 0 negative/0 positive
Re: zip-файл как ресурс в MS VC++ Win32API-dll
MichaelD
Автор

Сообщений: 7578
Дата регистрации: 14.05.2005
MichaelD
При использовании, планирую заюзать Packaging API: msdn.microsoft.com (OpcServices.dll) msdn.microsoft.com...

Блин, сам себе проблемы нашёл...

- мало того, что использование требует "обходительный способ обращения" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd742822%28v=vs.85%29.aspx)
Getting Started with the Packaging API
Packaging API Programming Notes
COM Programming Notes

When programming with Packaging APIs, remember the following:

. The ThreadingModel used by the Packaging APIs is "Both", also known as the mixed-model.
. Caution Packaging objects are not thread-safe; the caller must synchronize access to Packaging objects.
. The Packaging APIs do not support any form of marshaling across apartments; if the caller attempts to implement marshaling for Packaging interfaces the attempt will fail or cause undefined behavior. Passing raw pointers to Packaging objects across apartments may lead to undefined behavior.

Э... блин, "тонкий" намёк на "толстые" обстоятельства...
Хм... тот то я смотрю, что "их примеры кода" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd742823%28v=vs.85%29.aspx) написаны "как функции", а "не как классы"... Что сразу мне не понравилось... однако, как только нарисовал класс-покрышку, тут же получил обломы типа:

Цитата:
Необработанное исключение в "0x771415de" в "*.exe": 0xC0000005: Нарушение прав доступа при чтении "0x1eb0b28c".


Ладненько... перерисовал на то, "как сделано у них"... "всё зафунциклировало"...

Однако:



- оно ещё имеет и "ограничение на возможность использование":

. http://en.wikipedia.org/wiki/Open_Packaging_Conventions
Цитата:
...Since Windows 7, OPC is also natively supported in the Windows API through a set of COM interfaces...

. http://social.msdn.microsoft.com/Forums/en-US/os_opc/thread/3ab75f39-e008-4662-a2a6-96c6aff43080
Цитата:
...OpcServices.dll (located in Windows 7 \Windows\System32\) contains the Win7 native-code OPC API's. The native-code OPC APIs were not designed or tested to run down-level - it's doubtful that this DLL will work on Windows XP...

http://msdn.microsoft.com/en-us/library/windows/desktop/dd371219%28v=vs.85%29.aspx
Цитата:
...
Minimum supported client- Windows 7 [desktop apps only]
Minimum supported server - Windows Server 2008 R2 [desktop apps only]
...

Э... Может кто подскажет "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
Ratings: 0 negative/0 positive
Re: zip-файл как ресурс в MS VC++ Win32API-dll
MichaelD
Автор

Сообщений: 7578
Дата регистрации: 14.05.2005
MichaelD
скачал/поглазел на последнее... вроде работает... ;)

  • Сам скомпилированный код примера вроде работает, а вот воспользоваться исходниками чего-то не получается, из-под MS VS 2010(SP1) имею:
    Цитата:
    LINK : fatal error LNK1104: не удается открыть файл "LIBC.lib"

  • ... да и с использованием boost не так всё гладко, как хотелось бы... во всяком случае, приседания с получением нужного множества lib-ов из исходников через bjam, по крайней мере пока... остались именно бесполезными приседаниями...

    Хм... а никто не "развлекался" на пути использования штатных 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)

    Цитата:
    zipfldr.dll является COM-сервером, но не содержит tlb файла внутри. также нет этого tlb снаружи.
    ProgID = CompressedFolder
    CLSID = {E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}

    ?


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия




    Исправлено 1 раз(а). Последнее : MichaelD, 07.01.13 11:42
    Ratings: 0 negative/0 positive
  • Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    LINK : fatal error LNK1104: не удается открыть файл "LIBC.lib"

    Совет с http://gcup.ru/forum/45-19693-1 вроде помогает:

    Цитата:
    НАШЁЛ РЕШЕНИЕ на англоязычных форумах:

    Цитата:
    I am trying to convert a VC6 project to VC9, and the linker tells me
    that it cannot open file 'LIBC.lib'.

    Цитата:
    Libc.lib is the old single-threaded static-linked C runtime library. This is no
    longer used in recent versions of Visual C++. Static-linked projects should use
    the multi-threaded library LibMT.lib.

    Цитата:
    This attempt to link libc.lib should not be there, but you might try going to
    Project Properties->Configuration Properties->Linker->Input->Ignore Specific Library
    and typing libc.lib there.
    короч- нужно добавлять libc.lib в список игнорирования.

    ... ну хорошо, пробуем копаться дальше... ;)


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    ... ну хорошо, пробуем копаться дальше... ;)

    Похоже пара 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 библиотеки) -> составит то, что можно будет использовать... и не только в этой задачке...


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    Igor Korolyov

    Сообщений: 34580
    Дата регистрации: 28.05.2002
    Мы использовали обёртку sevenzipsharp.codeplex.com - но это надо для "управляемых" сред. Для unmanaged можно напрямую использовать 7z.dll
    Попытки "использовать встроенное в винду" - IMHO блажь и неверный путь


    ------------------
    WBR, Igor
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    составит то, что можно будет использовать... и не только в этой задачке...

    Чего-то изрядно достал меня этот вопрос (приседания вокруг встраивания zlib, bzip2 в boost-iostreams)...
    ... и похоже наконец нашёл, что как-то так http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/ нужно попробовать... ;)

    Igor Korolyov
    Попытки "использовать встроенное в винду" - IMHO блажь и неверный путь

    Ну это конечно... ;)

    Igor Korolyov
    Для unmanaged можно напрямую использовать 7z.dll

    По времени, пока не до жиру... ну в переборе различных решений...
    Блин пока не получается так чтобы взял + воспользовался -> получил результат... пошёл дальше...


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    Чего-то изрядно достал меня этот вопрос (приседания вокруг встраивания zlib, bzip2 в boost-iostreams)...

    Хм... а "ларчик" похоже открывается вот такой последовательностью:

    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... ;)


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    Хм... а "ларчик" похоже открывается вот такой последовательностью:
    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...

    Хм... это несколько не так... , например, вот такой тест:
    // 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

    приведённый выше код наконец-то зафунциклировал! \m/

    Хм... т.е. "чудо", в виде появления набора библиотек:

    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

    свершилось! :bodr:

    ... Ну и далее, если в вышеприведённом коде заменить 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

    ... ну и код конечно же начинает выполняться! :beer2: :bi:

    О чём как бы говорит выдержка из документации: http://www.boost.org/doc/libs/1_40_0/libs/iostreams/doc/installation.html по поводу параметров ZLIB_SOURCE/BZIP2_SOURCE имеет вот такой намёк:

    Цитата:
    Path to the zlib/libbz2 source files, if they're not in a location where they'll be found automatically.

    ... ну да, после того как весь интернет исползаешь , в принципе "доходчиво"... ;)


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия




    Исправлено 3 раз(а). Последнее : MichaelD, 09.01.13 16:36
    Ratings: 0 negative/0 positive
    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

    ну я имею ввиду вот это:

    Цитата:
    ... и соответственно, выполнив:

    >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

    ... ну и код конечно же начинает выполняться! :beer2: :bi:

    для кода, использующего 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

    ... но это "не решает указанную выше проблему"... :al:

    И в интернет чего-то не удаётся найти способ решения этой проблемы... :-[ Не там ищу?...

    P.S. на http://www.zlib.net/DLL_FAQ.txt говориться, что под статик собрана специальная библиотека ZLIB1.DLL (если правильно понял, конечно)... но вроде как в boost мы не используем вариант с dll... Вобщем, здесь я чего-то не понял...


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия




    Исправлено 1 раз(а). Последнее : MichaelD, 11.01.13 08:33
    Ratings: 0 negative/0 positive
    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... Э... надеюсь не слишком вас утомил? :-[

    Ну всё-таки решил изложить "с подробностями", вдруг кому-нить придётся повторить эти "мои телодвижения"... :danc:


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия




    Исправлено 6 раз(а). Последнее : MichaelD, 17.01.13 07:03
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    ... При использовании bzip2_decompressor(), после того как bz2-ресурс-файл в dll будет получен...

    Изложенное, прекрасно работает из-под MS VS2010(SP1) в 32-битовом варианте... однако, попытки проделать это же в MS VS2008, после успешной компиляции, приводят к проблемам линковки, аналогичным выше приведённым:

    Цитата:
    ... error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::default_compression"...

    при

    Цитата:
    libboost_bzip2-vc90-mt-1_52.lib
    libboost_bzip2-vc90-mt-gd-1_52.lib
    libboost_bzip2-vc90-mt-s-1_52.lib
    libboost_bzip2-vc90-mt-sgd-1_52.lib

    ...

    Есть подозрение, что это следствие "неправильной" пересбоки библиотек из 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
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    Изложенное, прекрасно работает из-под MS VS2010(SP1) в 32-битовом варианте... однако, попытки проделать это же в MS VS2008, после успешной компиляции, приводят к проблемам линковки, аналогичным выше приведённым:
    Цитата:
    ... error LNK2001: неразрешенный внешний символ ""int const boost::iostreams::zlib::default_compression"...

    Есть подозрение, что это следствие "неправильной" пересбоки библиотек из http://www.bzip.org/downloads.html - "1.0.6 source tarball" из-под MS VS2008 (в 32-бит) ( ну и выше в MS VS2012 (в 64-бит)) в том виде "как есть"... ну т.е. сами библиотеки boost вроде как не причём...

    Чтобы "правильно" откомпилировать boost-версии lib-библиотек для bzip2, нужно будет "слегка потрудиться"... ;) И мои телодвижения в этом направлении, можно изложить в виде вот такой "инструкции", приводящей, как надеюсь, к положительному результату... Во всяком случае, у меня это (из-под MS VS2008) получилось... ;)

    Цитата:
    Как откомпилировать модули библиотеки boost (http://www.boost.org/) для MS VS 2008/2010 с тем, чтобы было возможным использование библиотеки bzip2 (http://www.bzip.org/)?

    Что называется хороший вопрос! Намаявшись с такой задачей и, в конечном счёте, получив положительный результат, попробую изложить ключевые моменты…

    Установка/компиляция библиотеки boost
    После того, как вы скачаете и разместите распакованное содержимое исходной библиотеки у себя на компьютере, например, в каталог: C:\boost\boost_1_52_0, первым делом, следует выполнить компиляцию всех модулей, входящих в эту библиотеку (http://www.boost.org/doc/libs/1_52_0/more/getting_started/windows.html#prepare-to-use-a-boost-library-binary), т.е. находясь в подкаталоге C:\boost\boost_1_52_0, следует выполнить из командной строки две команды:

    >bootstrap
    >.\b2 [toolset=(msvc-10.0|msvc-9.0)]

    … и дождаться завершения процесса компиляции всех имеющихся библиотек для соответствующих версий MS Visual Studio. Результаты вы можете видеть в подкаталогах: C:\boost\boost_1_52_0\bin.v2\libs\ и C:\boost\boost_1_52_0\stage\lib\.

    Далее, следует установить/откомпилировать компоненты библиотек bzip2. См. также http://www.boost.org/doc/libs/1_52_0/libs/iostreams/doc/index.html - «The Boost Iostreams Library», http://stackoverflow.com/questions/2629421/how-to-use-boost-in-visual-studio-2010 - «How to use Boost in Visual Studio 2010».

    Установка/компиляция компонент библиотеки bzip2
    Разметив содержимое скаченных и распакованных данных поставки, например, в каталоге C:\bzip2-106, прежде всего, необходимо выполнить компиляцию содержащихся в этом каталоге исходных файлов, используя файл C:\bzip2-106\makefile.msc.

    Для этого, откройте окно «Visual Studio Command Prompt (2008/2010)» (возможно из-под администратора, если требуется) (см. линк «Visual Studio Tools» у вашей версии MS Visual Studio) и, перейдя в подкаталог ..\VC\bin\ выполните там файл vcvars32.bat для установки переменных среды выполнения. Затем, перейдя в подкаталог C:\bzip2-106, выполните оттуда команду: >nmake -f makefile.msc.

    Далее, следует также выполнить их компиляцию средствами MS VS 2008/2010. Чтобы это сделать, откройте файл libbz2.dsp в вашей версии MS Visual Studio и выполните компиляцию полученного в результате проекта в двух разных версиях: Debug и Release.

    В этом месте, совет с https://github.com/DennisOSRM/Project-OSRM/wiki/Windows-Compilation - «Windows Compilation» - разместить результаты компиляций в отдельных подкаталогах: bin, lib и include – стоил мне многих часов безуспешных экспериментов, в результате которых, мне так и не удалось получить результирующие библиотеки в boost.

    Вместо этого, получив результаты компиляции соответственно в подкаталогах: \bin_10_debug, \bin_10_release, \bin_09_debug, и \bin_09_release, при компиляции boost-библиотек, я использовал один единственный исходный каталог - C:\bzip2-106, каждый раз перед построением соответствующих версий boost-библиотек, последовательно копируя в него libbz2.lib-файл результатов компиляции из подкаталогов \bin_.... Вот почему, команда для компиляции, например для release и static (т.е. libboost_bzip2-vc90-mt-s-1_52.lib) у меня выглядела следующим образом:

    >b2.exe toolset=msvc-9.0 -a variant=release runtime-link=static --with-iostreams -sBZIP2_BINARY=C:\bzip2-106 -sBZIP2_INCLUDE=C:\bzip2-106 -sBZIP2_LIBPATH=C:\bzip2-106 -sBZIP2_SOURCE=C:\bzip2-106

    (подробности об установке см. также на http://www.boost.org/doc/libs/1_52_0/libs/iostreams/doc/index.html, описание назначений параметров см. на http://www.boost.org/boost-build2/doc/html/bbv2/overview/invocation.html)

    Подменяя файл libbz2.lib в C:\bzip2-106, изменяя параметры: toolset, variant, runtime-link на требуемые, и выполняя приведённую выше команду, мы можем создать нужное нам множество библиотек.

    Да, чуть не забыл упомянуть… И это важно! Изменяя версию MS Visual Studio, не забудьте выполнить перекомпиляцию исходных файлов в каталоге C:\bzip2-106, используя C:\bzip2-106\makefile.msc именно для текущей версии MS VS так, как об этом сказано в начале этого раздела!… В результате, у вас должен получиться вот такой набор библиотек:

    libboost_bzip2-vc90-mt-1_52.lib
    libboost_bzip2-vc90-mt-gd-1_52.lib
    libboost_bzip2-vc90-mt-s-1_52.lib
    libboost_bzip2-vc90-mt-sgd-1_52.lib
    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

    Несколько утомительно? Ну а что сделаешь?

    Код примера использования
    В заключении, можно привести исходный C++ код, выполняющий упаковку в bzip2-формат заданной строки, на котором можно проверить работу этой библиотеки:
    // TestBzip2.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <fstream>
    #include <iostream>
    #include <vector>
    #include <boost/iostreams/filtering_streambuf.hpp>
    #include <boost/iostreams/filter/bzip2.hpp>
    #include <boost/iostreams/copy.hpp>
    
    void pack()
    {            
        std:fstream file("hello.bz2", std::ios_base:ut | std::ios_base::binary);
        boost::iostreams::filtering_streambuf<boost::iostreams:utput> out;
        out.push(boost::iostreams::bzip2_compressor());
        out.push(file);
    
        char data[5] = {'h', 'e', 'l', 'l', 'o'};    
        boost::iostreams::copy(
            boost::iostreams::basic_array_source<char>(data, sizeof(data)),
            out);
    }
    
    void unpack()
    {
        std::fstream file("hello.bz2", std::ios_base::in | std::ios_base::binary);
        boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
        in.push(boost::iostreams::bzip2_decompressor());
        in.push(file);
    
        boost::iostreams::copy(in, std::cout);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        pack();
        unpack();
        return 0;
    }


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия




    Исправлено 11 раз(а). Последнее : MichaelD, 19.01.13 17:35
    Ratings: 0 negative/0 positive
    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
    Ratings: 0 negative/0 positive
    Re: zip-файл как ресурс в MS VC++ Win32API-dll
    MichaelD
    Автор

    Сообщений: 7578
    Дата регистрации: 14.05.2005
    MichaelD
    Как надеюсь, изложенные инструкции помогут вам добиться желаемого... ;)

    Есть подозрение, что с необходимостью наличия *.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...

    Чтобы проверить, я переместил перечисленные выше библиотеки в другое место... и, выполнил команду на сборку, типа:

    Цитата:
    b2.exe toolset=msvc-10.0 -a variant=debug --with-iostreams -sBZIP2_BINARY=C:\bzip2-106 -sBZIP2_INCLUDE=C:\bzip2-106 -sBZIP2_LIBPATH=C:\bzip2-106 -sBZIP2_SOURCE=C:\bzip2-106 -sZLIB_BINARY=C:\zlib-127 -sZLIB_INCLUDE=C:\zlib-127 -sZLIB_LIBPATH=C:\zlib-127 -sZLIB_SOURCE=C:\zlib-127 stage

    ниже, несколько "подрезанные" результаты выполнения из окна команд:

    Цитата:
    C:\Program Files (x86)\boost\boost_1_52_0>b2.exe toolset=msvc-10.0 -a variant=de
    bug --with-iostreams -sBZIP2_BINARY=C:\bzip2-106 -sBZIP2_INCLUDE=C:\bzip2-106 -s
    BZIP2_LIBPATH=C:\bzip2-106 -sBZIP2_SOURCE=C:\bzip2-106 -sZLIB_BINARY=C:\zlib-127
    -sZLIB_INCLUDE=C:\zlib-127 -sZLIB_LIBPATH=C:\zlib-127 -sZLIB_SOURCE=C:\zlib-127
    stage

    Component configuration:

    - chrono : not building
    - context : not building
    - date_time : not building
    - exception : not building
    - filesystem : not building
    - graph : not building
    - graph_parallel : not building
    - iostreams : building
    - locale : not building
    - math : not building
    - mpi : not building
    - program_options : not building
    - python : not building
    - random : not building
    - regex : not building
    - serialization : not building
    - signals : not building
    - system : not building
    - test : not building
    - thread : not building
    - timer : not building
    - wave : not building

    ...patience...
    ...found 673 targets...
    ...updating 33 targets...
    ...
    common.copy stage\lib\libboost_zlib-vc100-mt-gd-1_52.lib
    bin.v2\libs\iostreams\build\zlib\msvc-10.0\debug\link-static\threading-multi\lib
    boost_zlib-vc100-mt-gd-1_52.lib
    Скопировано файлов: 1.
    ...
    common.copy stage\lib\libboost_bzip2-vc100-mt-gd-1_52.lib
    bin.v2\libs\iostreams\build\bzip2\msvc-10.0\debug\link-static\threading-multi\li
    bboost_bzip2-vc100-mt-gd-1_52.lib
    Скопировано файлов: 1.
    ...
    common.copy stage\lib\libboost_iostreams-vc100-mt-gd-1_52.lib
    bin.v2\libs\iostreams\build\msvc-10.0\debug\link-static\threading-multi\libboost
    _iostreams-vc100-mt-gd-1_52.lib
    Скопировано файлов: 1.
    ...updated 33 targets...

    C:\Program Files (x86)\boost\boost_1_52_0>

    Т.е. если не обращать внимание на кучу предупреждений об использовании устаревших функций, то требуемые библиотеки были успешно пересозданы! ;)

    Другими словами, мои извинения, что я "слегка помутил воду" в этом вопросе...
    Ладненько, завтра попробую подправить текст документа по ссылке... ;)


    ------------------
    С уважением,
    Михаил Дроздов, Пермь, Россия




    Исправлено 1 раз(а). Последнее : MichaelD, 20.01.13 02:29
    Ratings: 0 negative/0 positive


    Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

    On-line: 8 (Гостей: 8)

    © 2000-2024 Fox Club 
    Яндекс.Метрика