提取TM2008接收到的表情(转贴)

TM2008把接收到的自定义表情不是存放在一个文件夹中,而是放在一个文件里面。这个文件的位置在:我的文档QQ Files你的QQ号码CustomFaceRecv.db,当然你自己的自定义表情就存在CustomFace.db里面。

我们的目的,就是把别人的变成我的,这个.db文件其实是一个复合文档。因此我写了个程序把里面的文件全部提取出来了。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <Unknwn.h>

int wmain(int argc, wchar_t** argv)
{
   HRESULT hr;
   IStorage* piStorage = NULL;
   IEnumSTATSTG* piEnumSTATSTG = NULL;
   STATSTG statstg;
   IStream* piStream = NULL;
   BYTE bBuffer[512];
   ULONG dwReaded;
   WCHAR wszExtractDir[MAX_PATH];
   WCHAR wszExtractPath[MAX_PATH];
   FILE* pFile = NULL;

   if (argc != 2)
       return 1;

   wcscpy(wszExtractDir, argv[1]);
   *(wcsrchr(wszExtractDir, L'\')) = 0L;
   wcscat(wszExtractDir, L"\Extracted");
   CreateDirectoryW(wszExtractDir, NULL);

   wcscat(wszExtractDir, L"\");

   CoInitialize(NULL);

   hr = StgOpenStorageEx( argv[1],
                          STGM_READ | STGM_SHARE_DENY_WRITE,
                          STGFMT_ANY,
                          0,
                          NULL,
                          NULL,
                          IID_IStorage,
                          reinterpret_cast<void**>(&piStorage) );
   if (FAILED(hr))
       goto clean0;

   hr = piStorage->EnumElements(0, NULL, 0, &piEnumSTATSTG);
   if (FAILED(hr))
       goto clean0;

   hr = piEnumSTATSTG->Next(1, &statstg, NULL);
   while (S_OK == hr)
   {
       wprintf(L"%sn", statstg.pwcsName);
       hr = piStorage->OpenStream( statstg.pwcsName,
                                   NULL,
                                   STGM_SHARE_EXCLUSIVE,
                                   0,
                                   &piStream );
       if (FAILED(hr))
           continue;

       wcscpy(wszExtractPath, wszExtractDir);
       wcscat(wszExtractPath, statstg.pwcsName);
       pFile = _wfopen(wszExtractPath, L"wb");
       if (pFile)
       {
           hr = piStream->Read(bBuffer, 512, &dwReaded);
           while (S_OK == hr && dwReaded)
           {
               fwrite(bBuffer, 1, dwReaded, pFile);

               hr = piStream->Read(bBuffer, 512, &dwReaded);
           }

           fclose(pFile);
           pFile = NULL;
       }

       piStream->Release();
       piStream = NULL;

       hr = piEnumSTATSTG->Next(1, &statstg, NULL);
   }

clean0:
   if (piEnumSTATSTG)
   {
       piEnumSTATSTG->Release();
       piEnumSTATSTG = NULL;
   }

   if (piStorage)
   {
       piStorage->Release();
       piStorage = NULL;
   }

   CoUninitialize();
}

编译后的文件下载
下载文件
下载文件 点击这里下载文件

使用方法qq_db2dir.exe "D:MyDocQQ Files285584CustomFaceRecv.db"
解压出来的位置:D:MyDocQQ Files285584Extracted

点赞 (0)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据