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

📄 harddiskview.cpp

📁 小的取硬盘信息的程序
💻 CPP
字号:
// harddiskView.cpp : implementation of the CHarddiskView class
//

#include "stdafx.h"
#include "harddisk.h"

#include "harddiskDoc.h"
#include "harddiskView.h"

#include "harddiskInfo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHarddiskView

IMPLEMENT_DYNCREATE(CHarddiskView, CFormView)

BEGIN_MESSAGE_MAP(CHarddiskView, CFormView)
	//{{AFX_MSG_MAP(CHarddiskView)
	ON_BN_CLICKED(IDC_BUTTON_GET, OnButtonGet)
	ON_BN_CLICKED(IDC_BUTTON_GETMAC, OnButtonGetmac)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()
using   System.Runtime.InteropServices;
using System.Management;
using namespace std;
//命令行输出缓冲大小
const long MAX_COMMAND_SIZE = 10000;

//获取MAC命令行
char szFetCmd[] = "ipconfig /all";
//网卡MAC地址的前导信息
const string str4Search = "Physical Address. . . . . . . . . : ";

/////////////////////////////////////////////////////////////////////////////
// CHarddiskView construction/destruction

CHarddiskView::CHarddiskView()
	: CFormView(CHarddiskView::IDD)
{
	//{{AFX_DATA_INIT(CHarddiskView)
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CHarddiskView::~CHarddiskView()
{
}

void CHarddiskView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CHarddiskView)
	DDX_Control(pDX, IDC_RICHEDIT_OUT, m_editOut);
	//}}AFX_DATA_MAP
}

BOOL CHarddiskView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void CHarddiskView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

}

/////////////////////////////////////////////////////////////////////////////
// CHarddiskView printing

BOOL CHarddiskView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CHarddiskView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CHarddiskView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CHarddiskView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// CHarddiskView diagnostics

#ifdef _DEBUG
void CHarddiskView::AssertValid() const
{
	CFormView::AssertValid();
}

void CHarddiskView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CHarddiskDoc* CHarddiskView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHarddiskDoc)));
	return (CHarddiskDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHarddiskView message handlers

void CHarddiskView::OnButtonGet() 
{
	// TODO: Add your control notification handler code here
	GetDiskInfo();
}

void CHarddiskView::GetDiskInfo()
{
	CHardDiskInfo MyVariable;
	CString strSerialNumber="HDDSerialNumber:  ";
	strSerialNumber +=MyVariable.GetHDDSerialNumber();
	strSerialNumber += "\n";
	Out(strSerialNumber);
	CString strHDDType = "HDDType:   ";
	strHDDType+=MyVariable.GetHDDType();
	strHDDType += "\n";
	Out(strHDDType);
	CString strHDDRevisionNumber = "HDDRevisionNumber:   ";
	strHDDRevisionNumber+=MyVariable.GetHDDRevisionNumber();
	strHDDRevisionNumber += "\n";
	Out(strHDDRevisionNumber);
	CString strHDDModel = "HDDModel:   ";
	strHDDModel+=MyVariable.GetHDDModel();
	strHDDModel += "\n";
	Out(strHDDModel);
	CString strHDDMasterSlave = "HDDMasterSlave:   ";
	strHDDMasterSlave+=MyVariable.GetHDDMasterSlave();
	strHDDMasterSlave += "\n";
	Out(strHDDMasterSlave);
	unsigned long uHDDBufferSizeOnDrive;
	uHDDBufferSizeOnDrive=MyVariable.GetHDDBufferSizeOnDrive();
	Out("HDDBufferSizeOnDrive:   %d\n",uHDDBufferSizeOnDrive);
	unsigned long uHDDCylinders;
	uHDDCylinders=MyVariable.GetHDDCylinders();
	Out("HDDCylinders:   %d\n",uHDDCylinders);
	unsigned long uHDDBytesperSector;
	uHDDBytesperSector=MyVariable.GetHDDBytesperSector();
	Out("HDDBytesperSector:   %d\n",uHDDBytesperSector);
	unsigned long uHDDHeads;
	uHDDHeads=MyVariable.GetHDDHeads();
	Out("HDDHeads:   %d\n",uHDDHeads);
	unsigned long uHDDSectorsperTrack;
	uHDDSectorsperTrack=MyVariable.GetHDDSectorsperTrack();
	Out("HDDSectorsperTrack:   %d\n",uHDDSectorsperTrack);
	unsigned long uHDDTrackperCylinders;
	uHDDTrackperCylinders=MyVariable.GetHDDTrackperCylinders();
	Out("HDDTrackperCylinders:   %d\n",uHDDTrackperCylinders);
	__int64 bHDDCapacity;
	bHDDCapacity = MyVariable.GetHDDCapacity();
	Out("HDDCapacity:   %d\n",bHDDCapacity);
}

void CHarddiskView::Out(const char *fmt, ...)
{
	char buf[0x1000];
	va_list va;
	va_start( va, fmt );/*初始化可变的链表*/
	vsprintf( buf, fmt, va );
	va_end( va );/* Reset variable arguments.*/
	TRACE(buf);
	int nRELen = m_editOut.GetTextLength();
	int nNewLen = nRELen + strlen(buf);
	int nMaxLen = RE_WRAP_LEN;
	if(nNewLen >= nMaxLen)
	{ //wrap buffer
		m_editOut.SetSel(0, nRELen);
		m_editOut.ReplaceSel("");
		nRELen =m_editOut.GetTextLength();
	}
	m_editOut.SetSel(nRELen, nRELen);
	m_editOut.ReplaceSel(buf);
	m_editOut.SetModify(TRUE); // don't adk to save CRichEditView	
}

////////////////////////////////////////////////////////////////////////////
// 函数名: GetMacByCmd(char *lpszMac)
// 参数:
//      输入: void
//      输出: lpszMac,返回的MAC地址串
// 返回值:
//      TRUE:  获得MAC地址。
//      FALSE: 获取MAC地址失败。
// 过程:
//      1. 创建一个无名管道。
//      2. 创建一个IPCONFIG 的进程,并将输出重定向到管道。
//      3. 从管道获取命令行返回的所有信息放入缓冲区lpszBuffer。
//      4. 从缓冲区lpszBuffer中获得抽取出MAC串。
//
//  提示:可以方便的由此程序获得IP地址等其他信息。
//        对于其他的可以通过其他命令方式得到的信息只需改变strFetCmd 和 
//        str4Search的内容即可。
///////////////////////////////////////////////////////////////////////////

BOOL CHarddiskView::GetMacByCmd(char *lpszMac)
{
	 //初始化返回MAC地址缓冲区
	 memset(lpszMac, 0x00, sizeof(lpszMac));
	 BOOL bret; 

	 SECURITY_ATTRIBUTES sa; 
	 HANDLE hReadPipe,hWritePipe; 

	 sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
	 sa.lpSecurityDescriptor = NULL; 
	 sa.bInheritHandle = TRUE; 
 
	 //创建管道
	 bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
	 if(!bret)
	 {
		 return FALSE;
	 }

	 //控制命令行窗口信息
	 STARTUPINFO si; 
	 //返回进程信息
	 PROCESS_INFORMATION pi; 
	 si.cb = sizeof(STARTUPINFO); 
	 GetStartupInfo(&si); 
	 si.hStdError = hWritePipe; 
	 si.hStdOutput = hWritePipe; 
	 si.wShowWindow = SW_HIDE; //隐藏命令行窗口
	 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

	 //创建获取命令行进程
	 bret = CreateProcess (NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, 
		  NULL, &si, &pi ); 
 
	 char szBuffer[MAX_COMMAND_SIZE+1]; //放置命令行输出缓冲区
	 string strBuffer;

	 if (bret) 
	 {
		 WaitForSingleObject (pi.hProcess, INFINITE); 
		 unsigned long count;
		 CloseHandle(hWritePipe);
		 memset(szBuffer, 0x00, sizeof(szBuffer));
		 bret  =  ReadFile(hReadPipe,  szBuffer,  MAX_COMMAND_SIZE,  &count,  0);
		 if(!bret)
		 {
			 //关闭所有的句柄
			 CloseHandle(hWritePipe);
			 CloseHandle(pi.hProcess); 
			 CloseHandle(pi.hThread); 
			 CloseHandle(hReadPipe);
			 return FALSE;
		 }
		 else
		 {
			 strBuffer = szBuffer;
			 long ipos;
			 ipos = strBuffer.find(str4Search);
     		   //提取MAC地址串
			 strBuffer = strBuffer.substr(ipos+str4Search.length());
			 ipos = strBuffer.find("\n");
			 strBuffer = strBuffer.substr(0, ipos);
		 }  
	 }

	 memset(szBuffer, 0x00, sizeof(szBuffer));
	 strcpy(szBuffer, strBuffer.c_str());

	 //去掉中间的“00-50-EB-0F-27-82”中间的'-'得到0050EB0F2782
	 int j = 0;
	 for(int i=0; i<strlen(szBuffer); i++)
	 {
		 if(szBuffer[i] != '-')
		 {
			 lpszMac[j] = szBuffer[i];
			 j++;
		 }
	 }

	 //关闭所有的句柄
	 CloseHandle(hWritePipe);
	 CloseHandle(pi.hProcess); 
	 CloseHandle(pi.hThread); 
	 CloseHandle(hReadPipe);
	 return TRUE;

}

void CHarddiskView::OnButtonGetmac() 
{
	// TODO: Add your control notification handler code here
	 char lpszMac[128];
	 memset(lpszMac, 0x00, sizeof(lpszMac));

	 //获取MAC
	 GetMacByCmd(lpszMac);
	 Out(lpszMac);
	//写入文件
/*
	 FILE *fp = NULL;
	 fp = fopen("e:\\1.txt", "w");
	 fwrite(lpszMac, sizeof(char), strlen(lpszMac), fp);
	 fclose(fp);
*/	 
}

⌨️ 快捷键说明

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