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

📄 tcsylist.cpp

📁 这个是集合几种关于硬盘的序列号的获取方式的DLL
💻 CPP
📖 第 1 页 / 共 5 页
字号:
BOOL CTcsyRegistList::AddEndDiskItem(STcsyRegistItem &sItem)
{
	if(TcsyHead.nItemCount < 0) return FALSE;        // 链表尚未建立
	STcsyRegistItem TempItem = sItem;                // 临时单元数据
	if(!LoadDiskItem(TempItem)) return FALSE;        // 装载单元失败
	STcsyRegistNode *pNode = new STcsyRegistNode;    // 新的内存节点
	if(pNode == NULL) return FALSE;                  // 申请内存失败

	sItem = TempItem;                                // 返回提取数据
	m_nNodeCount++;                                  // 多了一个成员
	pNode->ItemData = TempItem;                      // 拷贝到新内存
	if(PtrEnd == NULL)                               // 当前为一空链
	{
		PtrStart = PtrEnd = PtrCurr = pNode;         // 内存首尾指针
	}
	else
	{
		pNode->PtrPrior = PtrEnd;                    // 新单元上节点
		PtrEnd->PtrNext = pNode;                     // 原尾的下节点
		PtrEnd = PtrCurr = pNode;                    // 新尾和新当前
	}
	return TRUE;                                     // 返回成功追加
}

//-------------------------------------------------------------------------//

// 尾删节点(0成功、1空链、2失败):释放内存。移除扇区数据(可选)
LONG CTcsyRegistList::DelEnd(BOOL bDelItem)
{
	if(m_nNodeCount <= 0) return DEL_EMPTYLIST;      // 已经是空链啦
	if(bDelItem == TRUE)                             // 移除扇区数据
	{
		if(m_nNodeCount != TcsyHead.nItemCount)      // 防扇区删断链
			return DEL_FAILURE;
		STcsyRegistItem tEndItem = PtrEnd->ItemData, bPriorItem;
		if(Delete(tEndItem.AddrSelf) == FALSE)       // 删除结束单元
			return DEL_FAILURE;

		STcsyRegistHead TempHead = TcsyHead;         // 临时注册标头
		BOOL bEmptyList = FALSE;                     // 是否已经删空
		STcsyRegistAddr eEmptyAddr;
		if(TempHead.nItemCount == 1)                 // 再删就没有啦
		{
			bEmptyList = TRUE;
			TempHead.AddrStart = TempHead.AddrEnd = eEmptyAddr;
		}
		else                                         // 还有很多的呢
		{
			STcsyRegistItem tPriorItem = PtrEnd->PtrPrior->ItemData;
			tPriorItem.AddrNext = eEmptyAddr;
			TempHead.AddrEnd = tPriorItem.AddrSelf;
			if(SaveDiskItem(tPriorItem) == FALSE)    // 不成功则恢复
			{
				SaveDiskItem(tEndItem); return DEL_FAILURE;
			}
			bPriorItem = PtrEnd->PtrPrior->ItemData; // 写新的尾内存
			PtrEnd->PtrPrior->ItemData = tPriorItem;
		}

		TempHead.nItemCount--;                       // 减少一个成员
		if(SaveDiskHead(TempHead) == FALSE)
		{
			if(!bEmptyList) SaveDiskItem(bPriorItem);// 不成功则恢复
			SaveDiskItem(tEndItem);
			if(!bEmptyList) PtrEnd->PtrPrior->ItemData = bPriorItem;
			return DEL_FAILURE;
		}
		TcsyHead = TempHead;                         // 记录新的标头
		if(m_bUserRegisted && IsSameAddr(tEndItem.AddrSelf,
			AddrRegist))                             // 同步登陆注册
		{
			m_bUserRegisted = FALSE; AddrRegist.Set(0L, 0L);
		}
	}

	if((--m_nNodeCount) == 0) PtrStart = NULL;       // 少了一个成员
	STcsyRegistNode *pPrior = PtrEnd->PtrPrior;
	delete PtrEnd; if(pPrior) pPrior->PtrNext = NULL;// 删除内存节点
	PtrEnd = PtrCurr = pPrior;
	return DEL_SUCCESS;                              // 返回成功标志
}

// 首删节点(0成功、1空链、2失败):释放内存。移除扇区数据(可选)
LONG CTcsyRegistList::DelStart(BOOL bDelItem)
{
	if(m_nNodeCount <= 0) return DEL_EMPTYLIST;      // 已经是空链啦
	if(bDelItem == TRUE)                             // 移除扇区数据
	{
		if(m_nNodeCount != TcsyHead.nItemCount)      // 防扇区删断链
			return DEL_FAILURE;
		STcsyRegistItem tStartItem = PtrStart->ItemData, bNextItem;
		if(Delete(tStartItem.AddrSelf) == FALSE)     // 删除开始单元
			return DEL_FAILURE;

		STcsyRegistHead TempHead = TcsyHead;         // 临时注册标头
		BOOL bEmptyList = FALSE;                     // 是否已经删空
		STcsyRegistAddr eEmptyAddr;
		if(TempHead.nItemCount == 1)                 // 再删就没有啦
		{
			bEmptyList = TRUE;
			TempHead.AddrStart = TempHead.AddrEnd = eEmptyAddr;
		}
		else                                         // 还有很多的呢
		{
			STcsyRegistItem tNextItem = PtrStart->PtrNext->ItemData;
			tNextItem.AddrPrior = eEmptyAddr;
			TempHead.AddrStart = tNextItem.AddrSelf;
			if(SaveDiskItem(tNextItem) == FALSE)     // 不成功则恢复
			{
				SaveDiskItem(tStartItem); return DEL_FAILURE;
			}
			bNextItem = PtrStart->PtrNext->ItemData; // 写新的首内存
			PtrStart->PtrNext->ItemData = tNextItem;
		}

		TempHead.nItemCount--;                       // 减少一个成员
		if(SaveDiskHead(TempHead) == FALSE)
		{
			if(!bEmptyList) SaveDiskItem(bNextItem); // 不成功则恢复
			SaveDiskItem(tStartItem);
			if(!bEmptyList) PtrStart->PtrNext->ItemData = bNextItem;
			return DEL_FAILURE;
		}
		TcsyHead = TempHead;                         // 记录新的标头
		if(m_bUserRegisted && IsSameAddr(tStartItem.AddrSelf,
			AddrRegist))                             // 同步登陆注册
		{
			m_bUserRegisted = FALSE; AddrRegist.Set(0L, 0L);
		}
	}

	if((--m_nNodeCount) == 0) PtrEnd = NULL;         // 少了一个成员
	STcsyRegistNode *pNext = PtrStart->PtrNext;
	delete PtrStart; if(pNext) pNext->PtrPrior = NULL;// 删除内存节点
	PtrStart = PtrCurr = pNext;
	return DEL_SUCCESS;                              // 返回成功标志
}

// 移除节点:先从磁盘扇区移除数据(可选),再释放内存中的节点
LONG CTcsyRegistList::RemoveCurr(BOOL bDelItem)
{
	if(PtrCurr == NULL) return DEL_EMPTYLIST;        // 当前指针无效
	if(!PtrCurr->PtrNext) return DelEnd(bDelItem);   // 删除首和尾点
	else if(!PtrCurr->PtrPrior) return DelStart(bDelItem);

	if(bDelItem == TRUE)                             // 移除扇区数据
	{
		if(m_nNodeCount != TcsyHead.nItemCount)      // 防扇区删断链
			return DEL_FAILURE;
		STcsyRegistItem tCurrItem = PtrCurr->ItemData;
		if(Delete(tCurrItem.AddrSelf) == FALSE)      // 删除当前单元
			return DEL_FAILURE;

		STcsyRegistItem tPriorItem = PtrCurr->PtrPrior->ItemData;
		STcsyRegistItem tNextItem = PtrCurr->PtrNext->ItemData;
		tPriorItem.AddrNext = tNextItem.AddrSelf;    // 更新上下位置
		tNextItem.AddrPrior = tPriorItem.AddrSelf;

		if(SaveDiskItem(tPriorItem) == FALSE)        // 保存原上节点
		{
			SaveDiskItem(tCurrItem);
			return DEL_FAILURE;
		}
		if(SaveDiskItem(tNextItem) == FALSE)         // 保存原下节点
		{
			SaveDiskItem(tCurrItem);
			SaveDiskItem(PtrCurr->PtrPrior->ItemData);
			return DEL_FAILURE;
		}

		STcsyRegistHead TempHead = TcsyHead;         // 临时注册标头
		TempHead.nItemCount--;                       // 减少一个成员
		if(SaveDiskHead(TempHead) == FALSE)          // 保存注册标头
		{
			SaveDiskItem(tCurrItem);
			SaveDiskItem(PtrCurr->PtrPrior->ItemData);
			SaveDiskItem(PtrCurr->PtrNext->ItemData);
			return DEL_FAILURE;
		}
		TcsyHead = TempHead;                         // 记录新的标头
		PtrCurr->PtrPrior->ItemData = tPriorItem;
		PtrCurr->PtrNext->ItemData = tNextItem;      // 采用新的位置
		if(m_bUserRegisted && IsSameAddr(tCurrItem.AddrSelf,
			AddrRegist))                             // 同步登陆注册
		{
			m_bUserRegisted = FALSE; AddrRegist.Set(0L, 0L);
		}
	}

	m_nNodeCount--;                                  // 少了一个成员
	PtrCurr->PtrPrior->PtrNext = PtrCurr->PtrNext;
	PtrCurr->PtrNext->PtrPrior = PtrCurr->PtrPrior;
	STcsyRegistNode *pNext = PtrCurr->PtrNext;       // 记录下点指针
	delete PtrCurr; PtrCurr = pNext;
	return DEL_SUCCESS;                              // 返回删除成功
}

/////////////////////////////////////////////////////////////////////////////

// 注册对话框的窗口过程:SDK开发,系统回调函数
INT FAR PASCAL RegistDlgProc(HWND hWnd,              // 对话框窗口句柄
							 UINT uMsg,              // 收到的消息
							 WPARAM wParam,          // 第一消息参数
							 LPARAM lParam)          // 第二消息参数
{
	INT nSuccess = 1L, nLen = 0L, i = 0L;            // 处理结果标记
	static HBRUSH hBackBrush = NULL;                 // 窗体背景画刷
	static SckRegistExchange *pExch = NULL;          // 对话交换数据
	const int nID[4] = {IDC_REGISTERCODE1, IDC_REGISTERCODE2,
		IDC_REGISTERCODE3, IDC_REGISTERCODE4};       // 四个注册编辑
	char chReturn[100] = "";                         // 四分隔返回码
	int nWide = 0, nHigh = 0; RECT rect;             // 窗口的宽和高

	switch(uMsg)                                     // 消息分发处理
	{
	//------------------------------------------------------------//

	case WM_INITDIALOG:                              // 初始化对话框
		pExch = (SckRegistExchange *)lParam; if(!pExch) break;
		SetDlgItemText(hWnd, IDC_USERNAME, pExch->chNameID);
		SetDlgItemText(hWnd, IDC_PRODUCTNUM, pExch->chProduct);

		nLen = lstrlen(pExch->chReturn) / 4; i = 0;  // 分段显返回码
		memcpy(&chReturn[i], &pExch->chReturn[0 * nLen], nLen); i += nLen;
		chReturn[i++] = '-';
		memcpy(&chReturn[i], &pExch->chReturn[1 * nLen], nLen); i += nLen;
		chReturn[i++] = '-';
		memcpy(&chReturn[i], &pExch->chReturn[2 * nLen], nLen); i += nLen;
		chReturn[i++] = '-';
		memcpy(&chReturn[i], &pExch->chReturn[3 * nLen], nLen); i += nLen;
		chReturn[i] = '\0';                          // 四段显示字串
		SetDlgItemText(hWnd, IDC_RETURNCODE, chReturn);

		SendMessage(GetDlgItem(hWnd, IDC_USERNAME), EM_LIMITTEXT,
			sizeof(pExch->chNameID) - 1, 0);         // 最大允许长度
		for(i=0; i<4; i++) SendMessage(GetDlgItem(hWnd, nID[i]), \
			EM_LIMITTEXT, 8, 0);

		nWide = GetSystemMetrics(SM_CXSCREEN);       // 屏幕的宽和高
		nHigh = GetSystemMetrics(SM_CYSCREEN);
		GetWindowRect(hWnd, &rect);                  // 窗口的宽和高
		nWide = (nWide - (rect.right - rect.left + 1)) / 2;
		nHigh = (nHigh - (rect.bottom - rect.top + 1)) / 2;
		hBackBrush = CreateSolidBrush(RGB(0xA5, 0xCB, 0xF7));
		SetWindowPos(hWnd, HWND_TOPMOST, nWide, nHigh, 0, 0, SWP_NOSIZE);
		break;

	//------------------------------------------------------------//

	case WM_DESTROY:                                 // 释放画刷资源
		if(hBackBrush) DeleteObject(hBackBrush);
		break;

	//------------------------------------------------------------//

	case WM_COMMAND:                                 // 菜单按钮命令
		i = LOWORD(wParam);
		if(HIWORD(wParam) == EN_CHANGE && i >= nID[0] && i <= nID[3])
		{
			i = i - nID[0];                          // 移到下一单元
			nLen = SendMessage(GetDlgItem(hWnd, nID[i]), EM_LINELENGTH, 0, 0);
			if(nLen == 8) SetFocus(GetDlgItem(hWnd, nID[(i + 1) % 4]));
		}

		switch(LOWORD(wParam))                       // 用户选择取消
		{
		case IDCANCEL:
			EndDialog(hWnd, IDCANCEL);
			break;

		case IDOK:
			if(pExch != NULL)                        // 返回各类数据
			{
				nLen = GetDlgItemText(hWnd, IDC_USERNAME, pExch->chNameID,
					sizeof(pExch->chNameID));        // 提取用户名称
				if(nLen < 1) {SetFocus(GetDlgItem(hWnd, IDC_USERNAME)); break;}
				for(i=0; i<4; i++)                   // 检查注册码长
				{
					if(SendMessage(GetDlgItem(hWnd, nID[i]), EM_LINELENGTH, 0,
						0) != 8) {SetFocus(GetDlgItem(hWnd, nID[i])); break;}
				}
				if(i < 4) break;                     // 不足08字符长
				for(i=0; i<4; i++) GetDlgItemText(hWnd, nID[i], \
					&pExch->chRegist[i * 8], 9);     // 提取注册全码
			}
			EndDialog(hWnd, IDOK);
			break;

		default: nSuccess = 0L; break;               // 其它的不响应
		}
		break;

	//------------------------------------------------------------//

	case WM_CTLCOLORDLG:                             // 浅蓝背景画刷
		return (INT)hBackBrush;
		break;

	//------------------------------------------------------------//

	case WM_LBUTTONDOWN:                             // 点击移动窗体

⌨️ 快捷键说明

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