zlibとgzipの圧縮アーカイバーを作成。
http://www.zlib.net/ からzlib source codeをダウンロード(zipファイル)して解凍します。

この中のwin32のMakefile.mscをビルドします。
zlib.libが作成されます。



Menu->Microsoft VisualStudio2012->VisualStudio Tools->x86 NativeTools コマンドプロンプトで以下を実行。
>cd xxx\zlib-1.2.8
>nmake -f win32/Makefile.msc



zlib.h、zconf.hとzlib.libを使用したサンプルが以下

#include "zlib.h"
#define CHUNK 16384
#pragma comment( lib, "zlib.lib" )
// 特定の規定のライブラリの無視: msvcrt.lib

bool GZIP::Compress( const byte* src, int src_len, std::stringstream& sm )
{
z_stream strm;

unsigned char out[CHUNK];
unsigned char in[CHUNK];


ZeroMemory( &strm, sizeof(strm));

// zlib
//int ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);

// gzip
int ret = deflateInit2(&strm,Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31,8,Z_DEFAULT_STRATEGY);

if (ret != Z_OK)
return false;

int flush, step_size = 0;

do
{
ZeroMemory(in,CHUNK);
strm.avail_in = min( CHUNK, src_len - step_size );
memcpy( in , src + step_size, strm.avail_in) ;
strm.next_in = in;
step_size += strm.avail_in;

flush = (strm.avail_in == CHUNK ? Z_NO_FLUSH : Z_FINISH );

do
{
ZeroMemory(out,CHUNK);
strm.avail_out = CHUNK;
strm.next_out = out;

ret = deflate(&strm, flush );
_ASSERT(ret != Z_STREAM_ERROR);

UINT wlen = CHUNK - strm.avail_out;

sm.write( (char*)out, wlen );
}
while( strm.avail_out == 0 );
}
while( flush != Z_FINISH );


deflateEnd(&strm);

return true;
}


bool GZIP::DeCompress( const byte* src, int src_len, std::stringstream& sm )
{
int ret;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];

ZeroMemory(&strm,sizeof(strm));

// zlib
//ret = inflateInit(&strm);

// gzip
ret = inflateInit2(&strm,47);
if (ret != Z_OK)
return false;

int step_size = 0;

do
{
ZeroMemory(in,CHUNK);
strm.avail_in = min( CHUNK, src_len - step_size );
memcpy( in , src + step_size, strm.avail_in) ;
strm.next_in = in;

step_size += strm.avail_in;

do
{
ZeroMemory(out,CHUNK);
strm.avail_out = CHUNK;
strm.next_out = out;

ret = inflate(&strm, Z_NO_FLUSH);
_ASSERT(ret != Z_STREAM_ERROR); /* state not clobbered */
switch (ret)
{
case Z_NEED_DICT:
ret = Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
case Z_MEM_ERROR:
(void)inflateEnd(&strm);
return false;
}

int wlen = CHUNK - strm.avail_out;

sm.write( (char*)out, wlen );

} while (strm.avail_out == 0);

} while (ret != Z_STREAM_END);

inflateEnd(&strm);

return true;
}

詳しくはここ