⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 localmessage.cpp

📁 对QQ的聊天文件进行解密的源代码,只要选择聊天记录保存的文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	hParentItem = TreeView_InsertItem(hwndTreeView, &tvInsert);
	
	
	tvItem.pszText ="聊天消息";
	tvInsert.item = tvItem;
	tvInsert.hInsertAfter = TVI_LAST;
	tvInsert.hParent = hParentItem;
	ht1 = TreeView_InsertItem(hwndTreeView, &tvInsert);
	if(	this->InsertToTreeView(hwndTreeView,"C2CMsg",ht1,&ppstgOpen))
		TreeView_DeleteItem(hwndTreeView,ht1);

	tvItem.pszText ="系统消息";
	tvInsert.item = tvItem;
	tvInsert.hInsertAfter = TVI_LAST;
	tvInsert.hParent = hParentItem;
	ht2 = TreeView_InsertItem(hwndTreeView, &tvInsert);
	if(this->InsertToTreeView(hwndTreeView,"SysMsg",ht2,&ppstgOpen))
		TreeView_DeleteItem(hwndTreeView,ht2);

	tvItem.pszText ="群组消息";
	tvInsert.item = tvItem;
	tvInsert.hInsertAfter = TVI_LAST;
	tvInsert.hParent = hParentItem;
	ht3 = TreeView_InsertItem(hwndTreeView, &tvInsert);
	if(this->InsertToTreeView(hwndTreeView,"GroupMsg",ht3,&ppstgOpen))
		TreeView_DeleteItem(hwndTreeView,ht3);

	tvItem.pszText ="临时消息";
	tvInsert.item = tvItem;
	tvInsert.hInsertAfter = TVI_LAST;
	tvInsert.hParent = hParentItem;
	ht4 = TreeView_InsertItem(hwndTreeView, &tvInsert);
	if(this->InsertToTreeView(hwndTreeView,"TempSessionMsg",ht4,&ppstgOpen))
		TreeView_DeleteItem(hwndTreeView,ht4);

	TreeView_Expand(hwndTreeView,hParentItem,TVE_TOGGLE);
	ppstgOpen->Release();
	return 0;
Ex:
	char mm[21];
	wsprintf(mm,"%08X",hr);
	MessageBox(hwnd,error,mm,NULL);
	return hr;
}
int LocalMessage::InsertToTreeView(HWND HwndTreeView,char * db,HTREEITEM TreeParent,IStorage** is)
{
	TV_ITEM           tvItem;
	TV_INSERTSTRUCT   tvInsert;
	WCHAR wdb[50];
	IStorage* pp = *is;
	IStorage* ppstgOpen = NULL;
	IEnumSTATSTG* ppenum =NULL;
	HRESULT hr = S_OK;
	char *error,QQMessageNumber[20];
	char *pName;
	STATSTG rgelt;
	ULONG pceltFetched=1;
	size_t NameLength;
	int i=0;
	memset((char *)wdb,0,100);
	MultiByteToWideChar(CP_ACP,0,db,(int)strlen(db),wdb,50);

	hr = pp->OpenStorage(wdb,NULL,0x12,NULL,NULL,&ppstgOpen);
	if(FAILED(hr))
	{
		error = "读取数据库失败!";
		goto Ex;
	}
	hr = ppstgOpen->EnumElements(NULL,NULL,NULL,&ppenum);
	if(FAILED(hr))
	{
		error = "Failed ppstgOpen->EnumElements";
		goto Ex;
	}
	while(pceltFetched)
	{
		hr = ppenum->Next(1,&rgelt,&pceltFetched);
		if(FAILED(hr))
		{
			error = "Failed	Next";
			goto Ex;
		}
		if(rgelt.pwcsName)
		{
			ZeroMemory(QQMessageNumber,20);
			WideCharToMultiByte(CP_ACP,0,rgelt.pwcsName,wcslen(rgelt.pwcsName),
				QQMessageNumber,20,NULL,NULL);
			pName =QQMessageNumber;
			NameLength = strlen(pName);
			if(NameLength>9 || NameLength<5)
				goto conti;
			while(*pName)
			{
				if(*pName<0x30 || *pName >0x39)
					goto conti;
				pName++;
			}
			tvItem.cChildren = false;
			tvItem.pszText = QQMessageNumber;
			tvItem.mask = TVIF_TEXT |TVIF_CHILDREN;
			tvInsert.item = tvItem;
			tvInsert.hInsertAfter = TVI_LAST;
			tvInsert.hParent = TreeParent;
			TreeView_InsertItem(HwndTreeView, &tvInsert);
			i++;
		}
conti:;

	}
	ppenum->Release();
	ppstgOpen->Release();
	if(i==0)
		return 1;
	return 0;
Ex:
	char tem[100];
	wsprintf(tem,"操作数据库%s",db);
	//MessageBox(hwnd,error,tem,NULL);
	if(ppenum)
		ppenum->Release();
	if(ppstgOpen)
		ppstgOpen->Release();
	return 1;
}
int LocalMessage::WndSize(WPARAM wParam,LPARAM lParam)
{
	MoveWindow(MainWindowStruct[0].hwnd,0,0,TreeWidth,HIWORD(lParam),true);
	MoveWindow(MainWindowStruct[1].hwnd,TreeWidth+2,0,LOWORD(lParam)-TreeWidth-2,HIWORD(lParam)-ListHight,true);
	MoveWindow(MainWindowStruct[2].hwnd,TreeWidth+2,
		HIWORD(lParam)-ListHight+30,LOWORD(lParam)-TreeWidth-2,ListHight-30,true);
	return 0;
}
LRESULT APIENTRY WndSplit(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_MOUSEMOVE:
		MessageBeep(0);
		break;
	}
	//WM_NCMOUSEMOVE

	return CallWindowProc(wpOrigEditProc, hwnd, message,wParam, lParam); 
}
int LocalMessage::WndMouseMove(WPARAM wParam,LPARAM lParam)
{
	char tem[10];
	RECT rect;
	GetClientRect(hwnd,&rect);
	if(LOWORD(lParam)==TreeWidth || LOWORD(lParam)==(TreeWidth+1))
	{
		wsprintf(tem,"%2d",LOWORD(lParam));
		//SetWindowText(hwnd,tem);
		//SetCursor(LoadCursor(hInstance,IDC_HAND));
		//ShowCursor(true);
		if(wParam==MK_LBUTTON)
		{
			SetCapture(hwnd);
			//MessageBeep(0);
			//SendMessage(hwnd,WM_SIZE,)
		}
	}
	if((HIWORD(lParam)==(rect.bottom -ListHight+28))||(HIWORD(lParam)==(rect.bottom -ListHight+29))&&LOWORD(lParam)>TreeWidth)
	{
		wsprintf(tem,"%2d",HIWORD(lParam));
		//SetWindowText(hwnd,tem);
	}
	return 0;
}
int LocalMessage::ViewNameToDbName(char * name)
{
	if(strcmp(name,"聊天消息")==0)
	{
		ZeroMemory(name,50);
		strcpy(name,"C2CMsg");
		MessageColum =1;
		return 1;
	}
	if(strcmp(name,"系统消息")==0)
	{
		ZeroMemory(name,50);
		strcpy(name,"SysMsg");
		MessageColum =2;
		return 2;
	}
	if(strcmp(name,"群组消息")==0)
	{
		ZeroMemory(name,50);
		strcpy(name,"GroupMsg");
		MessageColum =3;
		return 3;
	}
	if(strcmp(name,"临时消息")==0)
	{
		ZeroMemory(name,50);
		strcpy(name,"TempSessionMsg");
		MessageColum =4;
		return 4;
	}
	return 0;
}
int LocalMessage::ReadData(char * CurrentGroup,char * CurrentQQNumber,char ** pIndex,char ** pData,int * IndexLength,int * DataLength)
{
	IStorage* ppstgOpen = NULL;
	IStorage* ppstgOpen1 = NULL;
	IStorage* ppstgOpen2 = NULL;

	char *Index =NULL;
	char *Data =NULL;
	WCHAR TemPath[MAX_PATH];
	WCHAR TemGroup[50],TemQQNumber[20];
	HRESULT hr = S_OK;
	char *error;
	memset((char *)TemPath,0,(MAX_PATH*2));
	memset((char *)TemGroup,0,100);
	memset((char *)TemQQNumber,0,40);
	MultiByteToWideChar(CP_ACP,0,QQDatabasePath,
		(int)strlen(QQDatabasePath),TemPath,MAX_PATH);
	MultiByteToWideChar(CP_ACP,0,CurrentGroup,
		(int)strlen(CurrentGroup),TemGroup,50);
	MultiByteToWideChar(CP_ACP,0,CurrentQQNumber,
		(int)strlen(CurrentQQNumber),TemQQNumber,20);

	hr = StgOpenStorage(TemPath,NULL,0x12,NULL,NULL,&ppstgOpen);
	if(FAILED(hr))
	{
		error = "打开数据库失败!";
		goto Ex;
	}
	hr = ppstgOpen->OpenStorage(TemGroup,NULL,0x12,NULL,NULL,&ppstgOpen1);
	if(FAILED(hr))
	{
		error = "ppstgOpen1!";
		goto Ex;
	}
	hr =ppstgOpen1->OpenStorage(TemQQNumber,NULL,0x12,NULL,NULL,&ppstgOpen2);
	if(FAILED(hr))
	{
		error = "&ppstgOpen2";
		goto Ex;
	}
	IStream *ppstm =NULL;
	STATSTG rgelt;
	ULONG DataLength0=0;
	hr = ppstgOpen2->OpenStream(L"Index.msj",NULL,0x12,NULL,&ppstm);
	if(FAILED(hr))
	{
		error = "&ppstm Index.msj";
		goto Ex;
	}
	ppstm->Stat(&rgelt,NULL);
	if(rgelt.cbSize.LowPart==0)
		goto Ex;
	Index = (char *)malloc_(rgelt.cbSize.LowPart+8);
	ZeroMemory(Index,rgelt.cbSize.LowPart+8);
	hr = ppstm->Read(Index,rgelt.cbSize.LowPart,&DataLength0);
	if(FAILED(hr))
	{
		error = "Read error";
		free(Index);
		ppstm->Release();
		goto Ex;
	}
	*IndexLength =(rgelt.cbSize.LowPart/4);
	ppstm->Release();


	hr = ppstgOpen2->OpenStream(L"Data.msj",NULL,0x12,NULL,&ppstm);
	if(FAILED(hr))
	{
		error = "&ppstm Data.msj";
		goto Ex;
	}
	ppstm->Stat(&rgelt,NULL);
	if(rgelt.cbSize.LowPart==0)
		goto Re;
	Data = (char *)malloc_(rgelt.cbSize.LowPart+8);
	ZeroMemory(Data,rgelt.cbSize.LowPart+8);
	hr = ppstm->Read(Data,rgelt.cbSize.LowPart,&DataLength0);
	if(FAILED(hr))
	{
		error = "Read error";
		free(Data);
		ppstm->Release();
		goto Ex;
	}
	*DataLength =rgelt.cbSize.LowPart;
	*pIndex = Index;
	*pData = Data;
Re:
	ppstm->Release();
	ppstgOpen2->Release();
	ppstgOpen1->Release();
	ppstgOpen->Release();
	return 0;
Ex:
	//MessageBox(hwnd,error,"",0);
	if(ppstgOpen2)
		ppstgOpen2->Release();
	if(ppstgOpen1)
		ppstgOpen1->Release();
	if(ppstgOpen)
		ppstgOpen->Release();
	return 1;
}
int LocalMessage::DecodeMessage(char * message,int Length,int * Index,int number)
{
	char *pout;
	int i;
	int MessageLength=0;
	for(i =0;i<number;i++)
	{
		if(Index[i+1]==0)
			Index[i+1]=Length;
		MessageLength =Index[i+1]-Index[i];
		pout = (char *)malloc(MessageLength);
		memset(pout,0,MessageLength);
		decode(message+Index[i],MessageLength,DecryptPassword,pout,&MessageLength);
		memcpy(message+Index[i],pout,MessageLength);
		free(pout);

	}
	return 0;
}
int LocalMessage::List_Notify(LPARAM lParam)
{
	char *text;
	switch(((LPNMHDR)lParam)->code)
	{
	case NM_CLICK:
	case NM_RCLICK:
		text=(char *)malloc_(0x2000);
		ListView_GetItemText(((NMITEMACTIVATE *)lParam)->hdr.hwndFrom,
			((NMITEMACTIVATE *)lParam)->iItem,3,text,0x2000);
		SetWindowText(MainWindowStruct[2].hwnd,text);
		free_(text);
		break;
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -