找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 560|回复: 0

[每日一码] 实现磁盘驱动器相关(序列号等)信息返回给LISP使用

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-1-17 11:09:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. #include "StdAfx.h"
  2. #include "VolumeManagement.h"

  3. #pragma region //DriveTypeFlags

  4. struct // DriveType
  5. {
  6.   UINT type;                        // return code from GetDriveType
  7.   LPCTSTR name;                // ascii name
  8. }

  9. DriveTypeFlags [] =
  10. {
  11.   { DRIVE_UNKNOWN,     _T("Unknown") },
  12.   { DRIVE_NO_ROOT_DIR, _T("Invalid path") },
  13.   { DRIVE_REMOVABLE,   _T("Removable") },
  14.   { DRIVE_FIXED,       _T("Fixed") },
  15.   { DRIVE_REMOTE,      _T("Network drive") },
  16.   { DRIVE_CDROM,       _T("CD-ROM") },
  17.   { DRIVE_RAMDISK,     _T("RAM disk") },
  18.   { 0, NULL}
  19. };

  20. #pragma endregion

  21. #pragma region //driveserialno
  22. //(crpdriveserialno "c")
  23. int DriveSerialNo(void)
  24. {
  25.   //Declare string variables
  26.   CString str;
  27.   struct resbuf *pArgs =acedGetArgs ();

  28.   if(pArgs == NULL)
  29.     str = _T("C");
  30.   else
  31.   {
  32.     if(pArgs->restype == RTSTR)
  33.       str = pArgs->resval.rstring;
  34.     else
  35.       str = _T("C");
  36.   }
  37.   str.Truncate(1);
  38.   str = str + _T(":\\");
  39.   DWORD VolumeSerialNumber = 0;
  40.   GetVolumeInformation(str, NULL, 0, (DWORD *)&VolumeSerialNumber, NULL, NULL, NULL, 0 );
  41.   if (VolumeSerialNumber != 0)
  42.   {
  43.     TCHAR Result[10] = {0};
  44.     _sntprintf(Result , sizeof(TCHAR)*10 , _T("%X") , VolumeSerialNumber );
  45.     acedRetStr(Result);
  46.   }
  47.   else
  48.     acedRetNil();

  49.   return (RSRSLT) ;
  50. }
  51. #pragma endregion

  52. #pragma region //filesystem
  53. //(crpfilesystem "c")
  54. int FileSystem(void)
  55. {
  56.   CString str;
  57.   struct resbuf *pArgs =acedGetArgs () ;
  58.   //get the resbuf from lisp, test validity
  59.   if(pArgs == NULL)
  60.     str = _T("C");
  61.   else
  62.   {
  63.     if(pArgs->restype == RTSTR)
  64.       str = pArgs->resval.rstring;
  65.     else
  66.       str = _T("C");
  67.   }
  68.   str.Truncate(1);
  69.   str = str + _T(":\\");
  70.   TCHAR FileSystem[MAX_PATH] = {0};
  71.   GetVolumeInformation(str, NULL, 0, NULL, NULL, NULL, FileSystem, sizeof(TCHAR)*MAX_PATH);
  72.   if (_tcsclen(FileSystem) != NULL)
  73.     acedRetStr(FileSystem);
  74.   else
  75.     acedRetNil();
  76.   return (RSRSLT) ;
  77. }
  78. #pragma endregion

  79. #pragma region //drivetype
  80. //(crpdrivetype "c")
  81. int DriveType(void)
  82. {

  83.   //
  84.   CString str;
  85.   CString DriveType;

  86.   //
  87.   struct resbuf *rb = NULL;

  88.   //
  89.   struct resbuf *pArgs =acedGetArgs () ;
  90.   if(pArgs == NULL)
  91.     str = _T("C");
  92.   else
  93.   {
  94.     if(pArgs->restype == RTSTR)
  95.       str = pArgs->resval.rstring;
  96.     else
  97.       str = _T("C");
  98.   };
  99.   //
  100.   str.Truncate(1);
  101.   str += _T(":\\");
  102.   UINT uDriveType = GetDriveType(str);

  103.   for (int i=0; DriveTypeFlags.name; i++)
  104.   {
  105.     if (uDriveType == DriveTypeFlags.type)
  106.     {
  107.       DriveType = DriveTypeFlags.name;
  108.       break;
  109.     }
  110.   }

  111.   //
  112.   if (!DriveType.IsEmpty())
  113.     acedRetStr(DriveType);
  114.   else
  115.     acedRetNil();
  116.   return (RSRSLT) ;
  117. }
  118. #pragma endregion

  119. #pragma region //drives
  120. //(crpdrives)
  121. int Drives(void)
  122. {
  123.   struct resbuf* pRbRet = acutNewRb(RTT);
  124.   struct resbuf* pRbTail;
  125.   pRbTail = pRbRet;

  126.   TCHAR szBuffer[1024] = {0};
  127.   GetLogicalDriveStrings(1024, szBuffer);
  128.   TCHAR *drv = szBuffer;
  129.   while (*drv)
  130.   {
  131.     pRbTail = pRbTail->rbnext = acutBuildList(RTSTR,drv,RTNONE);
  132.     drv = &drv[_tcslen(drv) + 1];
  133.   }
  134.   acedRetList(pRbRet->rbnext);
  135.   acutRelRb(pRbRet);

  136.   return (RSRSLT) ;
  137. }
  138. #pragma endregion


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-29 21:17 , Processed in 0.161877 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表