Archive for the ‘平台’ Category

MCI参考资料

星期一, 3 8 月, 2009

http://baike.baidu.com/view/396376.htm

http://www.leadbbs.com/a/a.asp?B=205&ID=1655937

文件多选修改

星期一, 3 8 月, 2009

编写MusicPlayer时,对文件多选进行了修改。
void OpenFiles(HWND hwnd)
{
OPENFILENAME ofn;
TCHAR szOpenFileNames[80*MAX_PATH];//文件路径
TCHAR szPath[MAX_PATH];//基路径
TCHAR* p;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szOpenFileNames;
ofn.lpstrFile[0] = ‘\0’;
ofn.nMaxFile = sizeof(szOpenFileNames);
ofn.lpstrFilter = TEXT(“音乐文件(mp3、wma、wav)\0*.mp3;*.wma;*.wav\0所有文件(*.*)\0*.*\0″);
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn))
{
//单个文件的保存形式为:绝对路径\0
//多个文件的保存形式为:基路径\000文件一\000文件二\0
//注意路径”\”的转义为”\\”
//把路径复制到szPath
//参考资料:http://blog.csdn.net/xuminggang/archive/2009/05/21/4206010.aspx
lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset+1);
//根据单个和多个文件不同的保存形式,多文件基路径需加”\\”。
szPath[ofn.nFileOffset-1] = ‘\\’;
//把指针移到第一个文件
p = szOpenFileNames + ofn.nFileOffset;
int iPlayListIndex = iNum;//加入的第一个文件
while(*p)
{
lstrcat(szFileName[iNum], szPath); //基路径
lstrcat(szFileName[iNum], p); //基路径+文件=绝对路径
//加入列表
SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_ADDSTRING, 0, (LPARAM)p);
p += lstrlen(p) +1; //移至下一个文件
iNum++; //增加音乐数,移动准备接收下一个文件路径。
}
//设置选中项
SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_SETCURSEL, (WPARAM)iPlayListIndex, 0);
//播放选中项
Play(hwnd, iPlayListIndex);
SetVolume(hwnd);
bPlay = TRUE;
SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), “暂停”);
}
}

基于Socket的授时程序

星期五, 24 7 月, 2009

#include <windowsx.h>
#include <winsock2.h>

#define HIGHTIME 21968699 // 21968708 // Jan 1, 1900 FILETIME.highTime
#define LOWTIME 4259332096 // 1604626432 // Jan 1, 1900 FILETIME.lowtime

void WinSocket()
{
 WSADATA wsaData; 
 WSAStartup(MAKEWORD(2, 0), &wsaData);//初始化Socket库,“2,0”为版本号。
 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//套接字,即连接线。
 SOCKADDR_IN sa;
 sa.sin_family = AF_INET; 
 sa.sin_port = htons(IPPORT_TIMESERVER);//设置连接服务器端端口
 sa.sin_addr.S_un.S_addr = inet_addr(“210.72.145.8”);//ping www.time.ac.cn
 //客户端端口动态分配、自动生成。
 if(connect(sock, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
 {
  ShowError();
  return;
 }
    //
    // Add code here
    //
 unsigned long ulTime;
 //接收时间消息
 recv(sock, (char*)&ulTime, sizeof(unsigned long), 0);
 ulTime = ntohl(ulTime);//从网络字节顺序转换为主机字节顺序
 SYSTEMTIME st;
 UINT64 uiCurTime, uiBaseTime, uiResult;
 uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;
 uiCurTime = (UINT64)ulTime * (UINT64)10000000;
 uiResult = uiBaseTime + uiCurTime;
 FileTimeToSystemTime((LPFILETIME)&uiResult, &st);
 TCHAR cBuffer[256];
 ZeroMemory(cBuffer, sizeof(cBuffer));
 wsprintf(cBuffer, TEXT(“当前准确时间为:%d年%d月%d日 %d时:%d分:%d秒”), st.wYear, st.wMonth, st.wDay, st.wHour+8, st.wMinute, st.wSecond);
 //由于授时服务器返回的是格林尼治时间,中国在东八区,故st.wHour+8。
 MessageBox(NULL, cBuffer, “准确时间”, MB_OK);
 SetSystemTime(&st);
 MessageBox(NULL, TEXT(“授时成功”), TEXT(“授时成功”), MB_OK);
 closesocket(sock);
 WSACleanup();
}

void ShowError()
{
 TCHAR* lpMsgBuf;
 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |//自动分配消息缓冲区
 FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息
 NULL, GetLastError(), //获取错误信息标识
 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //使用系统缺省语言
 (LPTSTR)&lpMsgBuf, //消息缓冲区
 0, NULL);
 MessageBox(NULL, lpMsgBuf, TEXT(“错误信息”), MB_ICONERROR);
}

电脑准确对时

可能会因缺少MSVCIRTD.DLL文件报错,将该文件下载并放入WINDOWS/system32文件夹下即可。

Socket网络编程基础

星期日, 19 7 月, 2009

#include <winsock2.h>

添加连接库wsock32

void WinSocket()
{
 WSADATA wsaData; 
 WSAStartup(MAKEWORD(2, 0), &wsaData);//初始化Socket库,“2,0”为版本号。
 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//套接字,即连接线。
 SOCKADDR_IN sa;
 sa.sin_family = AF_INET; 
 sa.sin_port = htons(IPPORT_SMTP);//设置连接服务器端端口
 sa.sin_addr.S_un.S_addr = inet_addr(“123.125.50.135”);//123.125.50.135是ping smtp.163.com出来的,后面会讲使用gethostbyname来直接从主机名得到ip地址。
 //客户端端口动态分配、自动生成。
 if(connect(sock, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
 {
  ShowError();
  return;
 }
    //
    // Add code here
    //
 TCHAR cBuffer[256];
 ZeroMemory(cBuffer, sizeof(cBuffer));
 //接收登录消息
 recv(sock, cBuffer, 256, 0);
 MessageBox(NULL, cBuffer, “”, 0);
 //注意不要忘了末尾的回车
 TCHAR cQuit[] = “QUIT\n”;
 send(sock, cQuit, lstrlen(cQuit), 0);
 ZeroMemory(cBuffer, sizeof(cBuffer));
 //接收退出消息
 recv(sock, cBuffer, 256, 0);
 MessageBox(NULL, cBuffer, “”, 0);
 
 closesocket(sock);
 WSACleanup();
}

void ShowError()
{
 TCHAR* lpMsgBuf;
 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |//自动分配消息缓冲区
 FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息
 NULL, GetLastError(), //获取错误信息标识
 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //使用系统缺省语言
 (LPTSTR)&lpMsgBuf, //消息缓冲区
 0, NULL);
 MessageBox(NULL, lpMsgBuf, TEXT(“错误信息”), MB_ICONERROR);
}

Windows优化大师V1.0

星期六, 18 7 月, 2009

全局变量:

int MB = 1024*1024;//为什么用#define MB 1024*1024不对?
int GB = 1024*1024*1024;

对话框初始化:

    TCHAR cUserName[256];//用户名字符数组。注意:此处不能使用字符指针,nSize得不到正确值。
    DWORD nSize = sizeof(cUserName);//用户名数组大小
    GetUserName(cUserName, &nSize);//获取用户名
    SetDlgItemText(hwnd, IDC_EDT1, cUserName);//显示
    GetOSVersion(hwnd, IDC_EDT2);//获取操作系统版本
 GetUserLogicalDrives(hwnd, IDC_EDT3);//获取可用逻辑驱动器
 AddComboBoxItem(hwnd, IDC_EDT4);//添加磁盘信息ComboBox项
 SetTimer(hwnd, 1, 1000, GetDiskInfo);//设置定时器,处理相应ComboBox的选中项。
 GetMemoryInfo(hwnd, IDC_EDT5); //获取内存信息

自定义函数:

void GetOSVersion(HWND hwnd, int id)
{
    OSVERSIONINFO OSVersion;//操作系统版本结构体
    TCHAR* cOSVersion;//输出操作系统版本字符串
    ZeroMemory(&OSVersion, sizeof(OSVersion));//初始化结构体
    OSVersion.dwOSVersionInfoSize = sizeof(OSVersion);//结构体大小
    GetVersionEx(&OSVersion);//获取操作系统版本
    switch(OSVersion.dwPlatformId)//根据结构体dwPlatformId字段判断是NT架构还是旧架构
    {
     case VER_PLATFORM_WIN32_NT:
         if(OSVersion.dwMajorVersion == 5 && OSVersion.dwMinorVersion == 0)//根据主版本号和小版本号判断操作系统版本
         {
             cOSVersion = TEXT(“Windows 2000”);
         }
         else if(OSVersion.dwMajorVersion == 5 && OSVersion.dwMinorVersion == 1)
         {
             cOSVersion = TEXT(“Windows XP”);
         }
         else if(OSVersion.dwMajorVersion == 6 && OSVersion.dwMinorVersion == 0)  
         {
           cOSVersion = TEXT(“Windows Vista”); 
         }
         else if(OSVersion.dwMajorVersion == 4 && OSVersion.dwMinorVersion == 0)
         {
             cOSVersion = TEXT(“Windows NT”);
         }
         else
         {
          cOSVersion = TEXT(“未知操作系统”);
         }
         break;
     case  VER_PLATFORM_WIN32_WINDOWS:
         if(OSVersion.dwMajorVersion == 4 && OSVersion.dwMinorVersion == 10)
         {
             cOSVersion = TEXT(“Windows 98”);
         }
         else if(OSVersion.dwMajorVersion == 4 && OSVersion.dwMinorVersion == 90)
         {
             cOSVersion = TEXT(“Windows ME”);
         }
         else
         {
             cOSVersion = TEXT(“Windows 95”);
         }
         break;
     default:
         break;
 }
  SetDlgItemText(hwnd, id, cOSVersion);//显示
}

void GetUserLogicalDrives(HWND hwnd, int id)
{
 DWORD dwUserLogicalDrives = GetLogicalDrives();//获取逻辑驱动器
 TCHAR cUserLogicalDrives[256];//输出可用逻辑驱动器字符数组
 ZeroMemory(cUserLogicalDrives, sizeof(cUserLogicalDrives));//初始化字符数组
 TCHAR cTemp[3];//字符临时数组
 cTemp[2] = ‘\0’;//调试发现cTemp数组初始均为’\0’,但对大的数组如cUserLogicalDrives只有部分为’\0’。
 int counter = 0;//计数器
 while(dwUserLogicalDrives > 0)//循环右移一位,按位&1,获取可用逻辑驱动器。
 {
  if(dwUserLogicalDrives & 1)
   {
    cTemp[0] = ‘A’+counter;//获取可用逻辑驱动器名称
    cTemp[1] = 32;//空格的ASCII码
    strncat(cUserLogicalDrives, cTemp, 2);
   }
   counter++;
   dwUserLogicalDrives = dwUserLogicalDrives >> 1;
 }
 SetDlgItemText(hwnd, id, cUserLogicalDrives);//显示
}

void AddComboBoxItem(HWND hwnd, int id)
{
 TCHAR cUserLogicalDrives[256];//输出可用逻辑驱动器字符数组
 ZeroMemory(cUserLogicalDrives, sizeof(cUserLogicalDrives));//初始化字符数组
 TCHAR cTemp[2];//字符临时变量
 cTemp[1] = ‘\0’;
 GetDlgItemText(hwnd, IDC_EDT3, cUserLogicalDrives, sizeof(cUserLogicalDrives));//获取GetUserLogicalDrives后的可用逻辑驱动器名称
 int nLength = strlen(cUserLogicalDrives);//可用逻辑驱动器字符串长度
 for(int i = 0; i < nLength; i += 2)//添加ComboBox项
 {
  cTemp[0] = cUserLogicalDrives[i];
  SendDlgItemMessage(hwnd, IDC_CBO1, CB_ADDSTRING, 0, (LPARAM)&cTemp);
 }
}

void CALLBACK GetDiskInfo(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)//定时器处理函数的参数形式是一定的,这是因为操作系统会填写这些参数。
{
 TCHAR cDisk[3];//盘符
 cDisk[2] = ‘\0’;//初始化
 TCHAR cDiskInfo[256];//输出磁盘信息字符数组
 ZeroMemory(cDiskInfo, sizeof(cDiskInfo));//初始化
 int iIndex = SendDlgItemMessage(hwnd, IDC_CBO1, CB_GETCURSEL, 0, 0);//获取ComboBox选中项索引
 HWND hIDC_CBO1 = GetDlgItem(hwnd, IDC_CBO1);//获取ComboBox句柄
 if(iIndex != CB_ERR)//选中
 {
  SendMessage(hIDC_CBO1, CB_GETLBTEXT, iIndex, (LPARAM)cDisk);
  cDisk[1] = ‘:’;//获取ComboBox选中项盘符
  UINT uType = GetDriveType(cDisk);//获取磁盘类型               
   switch(uType)
  {
   case DRIVE_UNKNOWN:
    lstrcpy(cDiskInfo, “未知磁盘类型\r\n”);
    break;
   case DRIVE_NO_ROOT_DIR:
    lstrcpy(cDiskInfo, “磁盘名无效\r\n”);
    break;
      case DRIVE_REMOVABLE:
       lstrcpy(cDiskInfo, “可移动磁盘\r\n”);
    break;
   case DRIVE_FIXED:
    lstrcpy(cDiskInfo, “固定磁盘\r\n”);
      break;
   case DRIVE_REMOTE:
    lstrcpy(cDiskInfo, “网络磁盘\r\n”);
     break;
   case DRIVE_CDROM:
    lstrcpy(cDiskInfo, “光驱\r\n”);
    break;
   case DRIVE_RAMDISK:
    lstrcpy(cDiskInfo, “RAM\r\n”);
    break;
   default:
    lstrcpy(cDiskInfo, “GetDriveType的非法返回值\r\n”);
    break;
  }
     ULARGE_INTEGER nFreeBytesAvailableToCaller;//可用磁盘空间
     ULARGE_INTEGER nTotalNumberOfBytes;//磁盘总大小
     ULARGE_INTEGER nTotalNumberOfFreeBytes;//空闲磁盘空间
  TCHAR cDiskInfo2[256];//输出磁盘信息字符数组
  ZeroMemory(cDiskInfo2, sizeof(cDiskInfo2));//初始化   
     if(GetDiskFreeSpaceEx(cDisk, &nFreeBytesAvailableToCaller, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes))//获取磁盘信息  
      wsprintf(cDiskInfo2, TEXT(“磁盘%s总大小:%I64dGB 空闲空间:%I64dGB 可用空间:%I64dGB”), cDisk, nTotalNumberOfBytes.QuadPart/GB, nTotalNumberOfFreeBytes.QuadPart/GB, nFreeBytesAvailableToCaller.QuadPart/GB);
     else
      lstrcpy(cDiskInfo2, “获取磁盘信息失败”);
  lstrcat(cDiskInfo, cDiskInfo2);
  SetDlgItemText(hwnd, IDC_EDT4, cDiskInfo); 
 }
 /*注意字符串、字符串赋值、字符串连接问题
 **字符串有以’\0’和NULL为终止符的字符串
 **两种字符串的赋值与连接都有区别
 **字符串指针赋值是字符串常量
 **字符串数组声明后赋值,要使用strcpy。
 */
}

void GetMemoryInfo(HWND hwnd, int id)
{
 MEMORYSTATUS memStatus;//内存状态
 TCHAR cMemoryInfo[256];//输出内存状态字符串
 GlobalMemoryStatus(&memStatus);//获取内存状态
 wsprintf(cMemoryInfo,
 TEXT(“内存使用率:%u%%MB\r\n总物理内存:%uMB\t可用物理内存:%uMB\r\n总虚拟内存:%uMB\t可用虚拟内存:%uMB\r\n总页面文件:%uMB\t可用页面文件:%uMB\r\n”),//此处不能换行是因为未设置控件MultiLine属性为true。
 memStatus.dwMemoryLoad,
 memStatus.dwTotalPhys/MB,
 memStatus.dwAvailPhys/MB,
 memStatus.dwTotalVirtual/MB,
 memStatus.dwAvailVirtual/MB,
 memStatus.dwTotalPageFile/MB,
 memStatus.dwAvailPageFile/MB);//格式化输出。%%为输出%。
 SetDlgItemText(hwnd, id, cMemoryInfo);
}

ComboBox参考:http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/caf20d4ecdc90c0fb2de055a.html

Windows优化大师V1.0

修正:

使用#define MB 1024*1024,在计算如memStatus.dwTotalPhys/MB时结果出错,是因为运算顺序的关系。使用#define MB 1024*1024和memStatus.dwTotalPhys/(MB)或使用#define MB (1024*1024)和memStatus.dwTotalPhys/MB计算时,结果正确。

内存信息也应该是实时显示:

SetTimer(hwnd, 2, 1000, GetMemoryInfo);//设置定时器,动态获取内存信息。

void CALLBACK GetMemoryInfo(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
 MEMORYSTATUS memStatus;//内存状态
 TCHAR cMemoryInfo[256];//输出内存状态字符串
 GlobalMemoryStatus(&memStatus);//获取内存状态
 wsprintf(cMemoryInfo,
 TEXT(“内存使用率:%u%%MB\r\n总物理内存:%uMB\t可用物理内存:%uMB\r\n总虚拟内存:%uMB\t可用虚拟内存:%uMB\r\n总页面文件:%uMB\t可用页面文件:%uMB\r\n”),//此处不能换行是因为未设置控件MultiLine属性为true。
 memStatus.dwMemoryLoad,
 memStatus.dwTotalPhys/MB,
 memStatus.dwAvailPhys/MB,
 memStatus.dwTotalVirtual/MB,
 memStatus.dwAvailVirtual/MB,
 memStatus.dwTotalPageFile/MB,
 memStatus.dwAvailPageFile/MB);//格式化输出。%%为输出%。
 SetDlgItemText(hwnd, IDC_EDT5, cMemoryInfo);
}

Windows优化大师V1.0修正