www.pudn.com > QqMsgView.rar > LocalMessage.cpp


#include  
#include  
#include  
#include "LocalMessage.h" 
#include "Main.h" 
#include "Select.h" 
#include "control.h" 
#include "DecryptMessage.h" 
#include "lib.h" 
#include "About.h" 
#include "resource.h" 
long ppro; 
int TreeWidth=158; 
int ListHight=150; 
int MessageColum=0; 
WNDPROC wpOrigEditProc; 
int ViewQQLocalMessage() 
{ 
	int x,y; 
	x=(GetSystemMetrics(SM_CXSCREEN)/2)-350; 
	y=(GetSystemMetrics(SM_CYSCREEN)/2)-240; 
	LocalMessage pro; 
	MSG     msg; 
	WNDCLASS wndclass ; 
	wndclass.style         = CS_HREDRAW | CS_VREDRAW; 
	wndclass.lpfnWndProc   = LocalMessage::WndProc; 
	wndclass.cbClsExtra    = 0 ; 
	wndclass.cbWndExtra    = 0 ; 
	wndclass.hInstance     = hInstance; 
	wndclass.hIcon         = NULL; 
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW); 
	wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW; 
	wndclass.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU); 
	wndclass.lpszClassName = "QQLocalMessage"; 
	if (!RegisterClass (&wndclass)) 
		return 1; 
	ppro=(long)&pro; 
	pro.hwnd=CreateWindowEx(WS_EX_ACCEPTFILES,"QQLocalMessage","QQ消息查看器", 
		WS_OVERLAPPED |WS_SYSMENU|WS_CAPTION |WS_THICKFRAME | 
		WS_MINIMIZEBOX | WS_MAXIMIZEBOX,x,y,700,480, 
		NULL,NULL,hInstance,NULL); 
	if(pro.hwnd==INVALID_HANDLE_VALUE) 
		return 2; 
	while (GetMessage (&msg, NULL, 0, 0)) 
	{ 
		TranslateMessage (&msg) ; 
		DispatchMessage (&msg) ; 
	} 
	return 0; 
} 
LRESULT CALLBACK LocalMessage::WndProc(HWND hwnd, UINT message, 
						 WPARAM wParam, LPARAM lParam) 
{ 
	static LocalMessage *pro; 
	switch(message) 
	{ 
	case WM_CREATE: 
		pro = (LocalMessage *)ppro; 
		pro->hwnd=hwnd; 
		pro->WndCreate(); 
		break; 
	case WM_CLOSE: 
		pro->WndClose(); 
		break; 
	case WM_COMMAND: 
		pro->WndProcCommand(wParam,lParam); 
		break; 
	case WM_SIZE: 
		pro->WndSize(wParam,lParam); 
		break; 
	case WM_MOUSEMOVE: 
		pro->WndMouseMove(wParam,lParam); 
		break; 
	case WM_NOTIFY: 
		pro->WndProcNotify(wParam,lParam); 
		break; 
	} 
	return DefWindowProc (hwnd, message, wParam, lParam); 
} 
int LocalMessage::WndProcCommand(WPARAM wParam, LPARAM lParam) 
{ 
	switch(wParam) 
	{ 
	case ID_SELECTQQNUMBER: 
		SelectFolder(hwnd); 
		if(FunctionVaule==1) 
			this->InitTreeView(MainWindowStruct[0].hwnd); 
		break; 
	case ID_EXIT: 
		this->WndClose(); 
		break; 
	case ID_ABOUT: 
		About(hwnd); 
		break; 
	} 
	return 0; 
} 
int LocalMessage::WndClose() 
{ 
	ExitProcess(0); 
	return 0; 
} 
int LocalMessage::WndCreate() 
{ 
	SelectFolder(NULL); 
	if(FunctionVaule == 0) 
		SendMessage(hwnd,WM_CLOSE,NULL,NULL); 
	if(FunctionVaule == 1) 
	{ 
		this->CreateMainPane(hwnd); 
		ShowWindow(hwnd,SW_SHOW); 
	} 
 
	return 0; 
} 
int LocalMessage::WndProcNotify(WPARAM wParam,LPARAM lParam) 
{ 
	switch(wParam) 
	{ 
	case IDC_MAINTREEVIEW: 
		this->Tree_Notify(lParam); 
		break; 
	case IDC_MAINLIST: 
		this->List_Notify(lParam); 
		break; 
	} 
	return 0; 
} 
int LocalMessage::Tree_Notify(LPARAM lParam) 
{ 
	HTREEITEM hItemSelected; 
	HWND HwndTree; 
	TVITEMW   tvItem; 
	char CurrentGroup[50],CurentQQNumber[50]; 
	switch(((LPNMHDR)lParam)->code) 
	{ 
	case TVN_SELCHANGED: 
		HwndTree = ((LPNMTREEVIEW)lParam)->hdr.hwndFrom; 
		hItemSelected =TreeView_GetSelection(HwndTree); 
		if(hItemSelected) 
		{ 
			ZeroMemory( &tvItem,sizeof(TVITEMW) ); 
			ZeroMemory(CurentQQNumber,50); 
			tvItem.hItem = hItemSelected; 
			tvItem.mask =  TVIF_TEXT||TVIF_CHILDREN; 
			tvItem.stateMask = TVIS_OVERLAYMASK ; 
			tvItem.pszText =(LPWSTR)CurentQQNumber; 
			tvItem.cchTextMax = 50; 
			if ( TreeView_GetItem(HwndTree,&tvItem)==0) 
			{ 
				return 0; 
			} 
			if(IsQQNumber(CurentQQNumber)==false) 
				return 0; 
			ZeroMemory(&tvItem,sizeof(TVITEMW)); 
			ZeroMemory(CurrentGroup,50); 
			tvItem.hItem= TreeView_GetParent(HwndTree,hItemSelected); 
			tvItem.mask =  TVIF_TEXT||TVIF_CHILDREN; 
			tvItem.stateMask = TVIS_OVERLAYMASK ; 
			tvItem.pszText=(LPWSTR)CurrentGroup; 
			tvItem.cchTextMax=50; 
			if ( TreeView_GetItem(HwndTree,&tvItem)==0) 
			{ 
				return 0; 
			} 
			if(this->ViewNameToDbName(CurrentGroup)) 
			{ 
				this->InsetValueToList(CurrentGroup,CurentQQNumber); 
			} 
		} 
		break; 
	} 
	return 0; 
} 
int LocalMessage::CreateMainPane(HWND HwndMainWindow) 
{ 
	for(int i = 0;i<3;i++) 
	{ 
		MainWindowStruct[i].hwnd = CreateWindowEx( 
			MainWindowStruct[i].dwExStyle, 
			MainWindowStruct[i].lpClassName, 
			"", 
			MainWindowStruct[i].dwStyle, 
			MainWindowStruct[i].x, 
			MainWindowStruct[i].y, 
			MainWindowStruct[i].nWidth, 
			MainWindowStruct[i].nHeight, 
			HwndMainWindow, 
			MainWindowStruct[i].hMenu, 
			hInstance,NULL); 
		if(MainWindowStruct[i].hwnd == NULL) 
				MessageBox(hwnd,"窗体创建失败!","",0); 
		if(i==3 ||i==4) 
			wpOrigEditProc=(WNDPROC)SetWindowLong(MainWindowStruct[i].hwnd, 
			GWL_WNDPROC,(long)MainWindowStruct[i].WindowLong); 
	} 
	this->InitTreeView(MainWindowStruct[0].hwnd); 
	this->InitList(MainWindowStruct[1].hwnd); 
	return 0; 
} 
int LocalMessage::InitList(HWND HwndList) 
{ 
	LVCOLUMN lvc; 
	lvc.mask =LVCF_FMT| LVCF_WIDTH | LVCF_TEXT ; 
	lvc.pszText = "发信人"; 
	lvc.cx =100; 
	lvc.fmt =LVCFMT_LEFT; 
	ListView_InsertColumn(HwndList,0,&lvc); 
	lvc.pszText ="日期"; 
	lvc.cx =80; 
	lvc.fmt =LVCFMT_CENTER; 
	ListView_InsertColumn(HwndList,1,&lvc); 
	lvc.pszText = "时间"; 
	lvc.cx =80; 
	lvc.fmt =LVCFMT_CENTER; 
	ListView_InsertColumn(HwndList,2,&lvc); 
	lvc.pszText ="内容"; 
	lvc.cx =265; 
	lvc.fmt =LVCFMT_LEFT; 
	ListView_InsertColumn(HwndList,3,&lvc); 
	SendMessage(HwndList,LVM_SETEXTENDEDLISTVIEWSTYLE, 
		LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES, 
		LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); 
	return 0; 
} 
int LocalMessage::InsetValueToList(char * CurrentGroup,char * CurrentQQNumber) 
{ 
	char * Data=NULL,*p=NULL; 
	int IndexLenght,DataLength,*Index=NULL,i,j; 
	ListView_DeleteAllItems(MainWindowStruct[1].hwnd); 
	if(this->ReadData(CurrentGroup, 
		CurrentQQNumber,(char **)&Index,&Data, 
		&IndexLenght,&DataLength)) 
		return 0; 
	this->DecodeMessage(Data,DataLength,Index,IndexLenght); 
	tm *t=0; 
	char SendName[20],SendDate[30],SendTime[20],*SendData=NULL; 
	int tem=0,SendDataLength=0; 
 
	if(MessageColum==1) 
		j=5; 
	else if(MessageColum==2) 
		j=8; 
	else if(MessageColum==3) 
		j=12; 
	else if(MessageColum==4) 
		goto Ex; 
	else 
		goto Ex; 
	 
	for(i=0; itm_year+1900),(t->tm_mon+1),t->tm_mday); 
		wsprintf(SendTime,"%2d:%2d:%2d",t->tm_hour,t->tm_min,t->tm_sec); 
		strncpy(SendName,p+4+j,(*(int *)(p+j))); 
		tem =4+j+(int)*(p+j); 
		SendDataLength =*(int *)(p+tem); 
		SendData =(char *)malloc_(SendDataLength+8); 
		if(SendData==NULL) 
			break; 
		strcpy(SendData,p+tem+4); 
 
		this->InsetDataToList(MainWindowStruct[1].hwnd,i, 
			SendName,SendDate,SendTime,SendData); 
		if(SendData) 
			free_(SendData); 
		t=0; 
	} 
Ex: 
	if(Index) 
		free_(Index); 
	if(Data) 
		free_(Data); 
	return 0; 
} 
int LocalMessage::InsetDataToList(HWND HwndList,int index,char* one,char * two,char * three,char *four) 
{ 
	LVITEM lvi; 
	int idx=0; 
	lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;  
	lvi.state = 0; 
	lvi.stateMask = 0; 
	lvi.iItem = index; 
	lvi.iSubItem = 0; 
	lvi.lParam = 0; 
	lvi.pszText = NULL; 
	ListView_InsertItem(HwndList, &lvi); 
	ListView_SetItemText(HwndList,index,0,one); 
	ListView_SetItemText(HwndList,index,1,two); 
	ListView_SetItemText(HwndList,index,2,three); 
	idx=strlen(four); 
	if(four[idx-1]==0xd) 
	{ 
		if(idx<22) 
		{ 
			memset(four,0,idx); 
			return 0; 
		} 
		four[idx-22]=0; 
	} 
	ListView_SetItemText(HwndList,index,3,four); 
 
	return 0; 
} 
int LocalMessage::InitTreeView(HWND hwndTreeView) 
{ 
	TV_ITEM           tvItem; 
	TV_INSERTSTRUCT   tvInsert; 
	HTREEITEM         hParentItem; 
	HTREEITEM ht1,ht2,ht3,ht4; 
	IStorage* ppstgOpen = NULL; 
	WCHAR TemPath[MAX_PATH]; 
	HRESULT hr = S_OK; 
	char *error; 
	memset((char *)TemPath,0,(MAX_PATH*2)); 
	MultiByteToWideChar(CP_ACP,0,QQDatabasePath, 
		(int)strlen(QQDatabasePath),TemPath,MAX_PATH); 
	hr = StgOpenStorage(TemPath,NULL,0x12,NULL,NULL,&ppstgOpen); 
	if(FAILED(hr)) 
	{ 
		error = "打开数据库失败!"; 
		goto Ex; 
	} 
	TreeView_DeleteAllItems(hwndTreeView); 
	ListView_DeleteAllItems(MainWindowStruct[1].hwnd); 
	SetWindowText(MainWindowStruct[2].hwnd,""); 
	tvItem.cChildren = TRUE; 
	tvItem.pszText = QQNumber; 
	tvItem.mask = TVIF_TEXT |TVIF_CHILDREN; 
	tvInsert.item = tvItem; 
	tvInsert.hInsertAfter = TVI_SORT; 
	tvInsert.hParent = TVI_ROOT; 
	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;icode) 
	{ 
	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; 
}