// QQExportDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "QQExport.h"
#include "QQExportDlg.h"
#include "NameDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
FILE* fileopen;
FILE* filewrite;
int m_nVersion;
char m_MyName[20];
char m_OpName[20];
void WCharToAChar(wchar_t* wchar, char* str,int size)
{
memset(str,0,size);
DWORD flag=WideCharToMultiByte(CP_OEMCP,NULL,wchar,-1,NULL,0,NULL,FALSE);
WideCharToMultiByte(CP_OEMCP, NULL, wchar, -1, str, flag, NULL, FALSE);
}
void ACharToWChar(char* str, wchar_t* wchar,int size)
{
_wcsnset(wchar, 0, size);
DWORD flag=MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
MultiByteToWideChar (CP_ACP, 0, str, -1, wchar, size);
}
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CQQExportDlg 对话框
CQQExportDlg::CQQExportDlg(CWnd* pParent /*=NULL*/)
: CDialog(CQQExportDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_nVersion=2008;
m_bOverWrite=true;
m_SourcePath.Empty();
m_DisPath.Empty();
m_FileTitle.Empty();
pTipDlg=new CDialog;
pTipDlg->Create(IDD_BEGIN,0);
}
CQQExportDlg::~CQQExportDlg()
{
delete pTipDlg;
}
void CQQExportDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Text(pDX,IDC_PATH1,m_SourcePath);
DDX_Text(pDX,IDC_PATH2,m_DisPath);
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CQQExportDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_LIULAN1, &CQQExportDlg::OnBnClickedLiulan1)
ON_BN_CLICKED(IDC_LIULAN2, &CQQExportDlg::OnBnClickedLiulan2)
ON_BN_CLICKED(IDC_EXPORT, &CQQExportDlg::OnBnClickedExport)
ON_BN_CLICKED(IDC_BUTTON1, &CQQExportDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CQQExportDlg 消息处理程序
BOOL CQQExportDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CQQExportDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CQQExportDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CQQExportDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CQQExportDlg::OnBnClickedLiulan1()
{
CString strFilter=L"2008聊天记录(*.db)|*.db|2009聊天记录(*.info)|*.info||";
CFileDialog Dlg(true,NULL,NULL,NULL,strFilter,this);
if(Dlg.DoModal()==IDOK)
{
m_SourcePath=Dlg.GetPathName();
m_FileTitle=Dlg.GetFileTitle();
UpdateData(false);
}
else return;
}
void CQQExportDlg::OnBnClickedLiulan2()
{
CString strFilter=L"文本文件(*.txt)|*.txt||";
CFileDialog Dlg(false,L"*.txt",m_FileTitle,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strFilter,this);
if(Dlg.DoModal()==IDOK)
{
m_DisPath=Dlg.GetPathName();
CFileStatus cs;
if(CFile::GetStatus(m_DisPath,cs))
{
if(MessageBox(m_DisPath+_T(" 已存在,\n 希望导出时覆盖该文件 请选”是“ \n 希望将导出内容添加到该文件末尾 请选”否“"),L"信息提示",MB_ICONINFORMATION|MB_YESNO)==IDYES)
{
m_bOverWrite=true;
}
else
m_bOverWrite=false;
}
UpdateData(false);
}
else return;
}
DWORD WINAPI Export(LPVOID lpParam)
{
CQQExportDlg* pMainDlg=(CQQExportDlg*)lpParam;
while(!feof(fileopen))
{
if(m_nVersion==2008)
Export2008(fileopen,filewrite);
else if(m_nVersion==2009)
Export2009(fileopen,filewrite);
}
fclose(fileopen);
fclose(filewrite);
Sleep(500);
pMainDlg->pTipDlg->ShowWindow(SW_HIDE);
pMainDlg->EnableWindow(true);
pMainDlg->SetForegroundWindow();
memset(m_MyName,0,20);
memset(m_OpName,0,20);
m_nVersion=2008;
AfxMessageBox(_T("导出完成!"));
return 0;
}
void CQQExportDlg::OnBnClickedExport()
{
if(m_SourcePath.IsEmpty())
{
MessageBox(L"请先选择要导出的聊天文件!",L"信息提示",MB_ICONINFORMATION|MB_OK);
return ;
}
if(m_DisPath.IsEmpty())
{
MessageBox(L"请先选择导出后保存的位置!",L"信息提示",MB_ICONINFORMATION|MB_OK);
return ;
}
char source[MAX_PATH]={0},dis[MAX_PATH]={0};
WCharToAChar(m_SourcePath.GetBuffer(),source,MAX_PATH);
WCharToAChar(m_DisPath.GetBuffer(),dis,MAX_PATH);
m_SourcePath.ReleaseBuffer();
m_DisPath.ReleaseBuffer();
fileopen=fopen(source,"rb");
if(!fileopen)
{
AfxMessageBox(L"原聊天记录文件无法打开!");
return;
}
BYTE begin;
fread(&begin,sizeof(BYTE),1,fileopen);
if(begin==0xa8)
{
m_nVersion=2009;
if(MessageBox(m_SourcePath+_T("\n是手机QQ2009版的聊天记录,文件中并没有保存聊天双方的昵称,\n是否添加昵称?"),L"信息提示",MB_ICONQUESTION|MB_YESNO)==IDYES)
{
CNameDlg nameDlg;
if(nameDlg.DoModal()==IDOK)
{
wchar_t MyName[20],OpName[20];
memset(MyName,0,20);
memset(OpName,0,20);
wcscpy_s(MyName,nameDlg.m_MyName.GetBuffer(20));
wcscpy_s(OpName,nameDlg.m_OpName.GetBuffer(20));
nameDlg.m_MyName.ReleaseBuffer();
nameDlg.m_OpName.ReleaseBuffer();
WCharToAChar(MyName,m_MyName,20);
WCharToAChar(OpName,m_OpName,20);
}
}
}
else
if(begin==0x25)
m_nVersion=2008;
else
{
AfxMessageBox(m_SourcePath+_T("\n并不是手机QQ聊天记录,或者文件已损坏!"));
fclose(fileopen);
return;
}
fseek(fileopen,0,SEEK_SET);
if(m_bOverWrite)
filewrite=fopen(dis,"wb");
else
filewrite=fopen(dis,"ab");
if(!filewrite)
{
AfxMessageBox(m_DisPath+_T("\n无法打开!"));
return;
}
hThread=CreateThread(NULL,NULL,Export,LPVOID(this),0,&ThreadID);
WaitForSingleObject(hThread,IGNORE );
m_DisPath.Empty();
m_bOverWrite=true;
UpdateData(false);
this->EnableWindow(false);
pTipDlg->ShowWindow(SW_SHOW);
}
#include <time.h>
void Export2008(FILE* fr, FILE* fw)
{
fseek(fr,-1,SEEK_CUR);
BYTE mark[15],null[4];
char timestr[36],str[40],msg[2048];
wchar_t wtimestr[18],wstr[20],buff[1024];
memset(wtimestr,0x0000,36);
memset(wstr,0x0000,40);
memset(buff,0x0000,2048);
long int len;
fread(mark,sizeof(BYTE),10,fr);
fread(wtimestr,sizeof(wchar_t),17,fr);
fread(null,sizeof(BYTE),2,fr);
fread(wstr,sizeof(wchar_t),16,fr);
len=(((long int)mark[3])*16*16+(long int)mark[2])-0x4e;
fread(
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
qqexport.rar.rar (15个子文件)
resource.h 1KB
NameDlg.cpp 699B
NameDlg.h 432B
QQExport.exe 29KB
stdafx.h 2KB
QQExport.cpp 2KB
res
MMSBar_QQWEB_Phone.ico 2KB
QQExport.ico 21KB
QQExport.rc2 364B
QQExportDlg.cpp 17KB
QQExport.rc 6KB
stdafx.cpp 139B
QQExportDlg.h 1KB
QQExport.vcproj 6KB
QQExport.h 453B
共 15 条
- 1
资源评论
- junjun07062012-03-19基于对话框的程序,很精简,特别是对文件结构的Hex分析很透彻,读取文件的Cfile类使用值得学习
- azure76762012-11-25旧版可以用,新版的用不了,程序不错,期待更新
bsplover
- 粉丝: 224
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功