#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 ,沒分了,請諒解
uj5u.com熱心網友回復:
#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;
}
代碼測驗沒問題,你自己檢查下~~
uj5u.com熱心網友回復:
...不要噴我,這是COPY妖哥的一段代碼...黑的漂亮!贊一個。
用API:EnumPorts 來搞吧。用現在的眼光看,以前列舉注冊表的方式有點LOW了。
uj5u.com熱心網友回復:
這個問題的關鍵點不是 C++ Buidler 版本問題,是注冊表權限問題,Win8 之后的系統 "HARDWARE\\DEVICEMAP\\SERIALCOMM" 對于普通用戶來說是只讀的,如果 OpenKey 的第二個引數是 true 需要獲取寫入權限,這樣會導致 OpenKey 執行失敗,后面的代碼都無效了,只需要把 OpenKey 的第二個引數改成 false 就會成功,這樣不需要獲取寫入權限。reg->OpenKey(_T("HARDWARE\\DEVICEMAP\\SERIALCOMM"),false);
uj5u.com熱心網友回復:
妖哥,我用以下代碼,會漏掉兩個串口,反而把早已拔掉的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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/50659.html
標籤:VCL組件使用和開發
上一篇:modbus TCP
下一篇:求時間復雜度
