C++Builder获取串口资源问题

八部浮屠 2017-08-21 05:15:59
#include <registry.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TRegistry *reg = new TRegistry;

reg->RootKey = HKEY_LOCAL_MACHINE;
reg->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM", true);
cbxComlist->Sorted = false;
reg->GetValueNames(cbxComlist->Items);

cbxComlist->Items->BeginUpdate();
for (int i=0; iItems->Count; i++)
cbxComlist->Items->Strings[i] =
reg->ReadString(cbxComlist->Items->Strings[i]);
cbxComlist->Items->EndUpdate();

delete reg;

cbxComlist->Sorted = true;
}
不要喷我,这是COPY妖哥的一段代码,我的环境是XE8 C++Builder,但是GetValueNames之后cbxComlist->iItems->Count
为0,求大神解惑?PS ,没分了,请谅解
...全文
916 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
华山沦贱 2018-01-06
  • 打赏
  • 举报
回复
引用 2 楼 ccrun 的回复:
...不要喷我,这是COPY妖哥的一段代码... 黑的漂亮!赞一个。 用API:EnumPorts 来搞吧。用现在的眼光看,以前枚举注册表的方式有点LOW了。
妖哥,我用以下代码,会漏掉两个串口,反而把早已拔掉的usb串口“找回来”了,感觉还是没有注册表可靠。
      const LPTSTR pName = NULL;    // 此处为空,就是本机  
      const DWORD Level = 2;        // 指定端口类型结构体,即PORT_INFO_2  
      LPBYTE port=0;         // 接收端口信息结构体数组指针  
      DWORD  pcbNeeded=0;    // 缓冲区字节指针(必需)  
      DWORD  pcReturned=0;   // 返回结果PORT_INFO_* 结构体缓冲区数量  
  
      if (EnumPorts(NULL,Level,port,0,&pcbNeeded,&pcReturned))  
      {  
          return ;//同一函数,第一次执行获取所需缓冲区大小pcbNeeded
      }  
      port = new BYTE[pcbNeeded];  
      if (!EnumPorts(pName,Level,port,pcbNeeded,&pcbNeeded,&pcReturned))  
      {  
          return ;//同一函数,第二次执行获取端口个数pcReturned
      }  
  
      PORT_INFO_2  ArrPort[100] = {0};  
      memcpy(ArrPort,port,pcbNeeded);//取出端口信息放入数组  
  
      for(int i=0;i<pcReturned;i++)  
      {
          //printf("%s \r\n",ArrPort[i].pPortName); //返回端口名称
          Memo1->Lines->Add(ArrPort[i].pPortName);
      }  
      delete port;
  • 打赏
  • 举报
回复
这个问题的关键点不是 C++ Buidler 版本问题,是注册表权限问题,Win8 之后的系统 "HARDWARE\\DEVICEMAP\\SERIALCOMM" 对于普通用户来说是只读的,如果 OpenKey 的第二个参数是 true 需要获取写入权限,这样会导致 OpenKey 执行失败,后面的代码都无效了,只需要把 OpenKey 的第二个参数改成 false 就会成功,这样不需要获取写入权限。 reg->OpenKey(_T("HARDWARE\\DEVICEMAP\\SERIALCOMM"),false);
ccrun.com 2017-09-06
  • 打赏
  • 举报
回复
...不要喷我,这是COPY妖哥的一段代码... 黑的漂亮!赞一个。 用API:EnumPorts 来搞吧。用现在的眼光看,以前枚举注册表的方式有点LOW了。
hongss 2017-08-22
  • 打赏
  • 举报
回复
#include <registry.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TRegistry *reg = new TRegistry;

    reg->RootKey = HKEY_LOCAL_MACHINE;
    reg->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM", true);
    cbxComlist->Sorted = false;
    reg->GetValueNames(cbxComlist->Items);

    cbxComlist->Items->BeginUpdate();
    for (int i=0; i<cbxComlist->Items->Count; i++)      //这里你自己手误?
        cbxComlist->Items->Strings[i] =
                reg->ReadString(cbxComlist->Items->Strings[i]);
    cbxComlist->Items->EndUpdate();
     
    delete reg;

    cbxComlist->Sorted = true;
}
代码测试没问题,你自己检查下~~

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧