天天看點

擷取系統序列槽号

原來C++Builder6在XP下擷取序列槽的方法:

<code>void</code> <code>TTools::GetSystemPortList(TStringList * pList)</code>

<code>{</code>

<code>        </code><code>TRegistry *regkey=</code><code>new</code> <code>TRegistry();</code>

<code>        </code><code>pList-&gt;Clear();</code>

<code>        </code><code>regkey-&gt;RootKey=HKEY_LOCAL_MACHINE;</code>

<code>        </code><code>TStringList *KeyNames;</code>

<code>        </code><code>KeyNames=</code><code>new</code> <code>TStringList();</code>

<code>        </code><code>regkey-&gt;OpenKey(</code><code>"HARDWARE\\DEVICEMAP\\SERIALCOMM"</code><code>,</code><code>false</code><code>);</code>

<code>        </code><code>regkey-&gt;GetValueNames(KeyNames);</code>

<code>        </code><code>for</code><code>(</code><code>int</code> <code>i=0;i&lt;=(KeyNames-&gt;Count-1);i++)</code>

<code>        </code><code>{</code>

<code>           </code><code>AnsiString a = regkey-&gt;ReadString(KeyNames-&gt;Strings[i]);</code>

<code>           </code><code>pList-&gt;Add(a);</code>

<code>        </code><code>}</code>

<code>       </code> 

<code>        </code><code>regkey-&gt;CloseKey();</code>

<code>        </code><code>delete</code> <code>KeyNames;</code>

<code>        </code><code>delete</code> <code>regkey;</code>

<code>}</code>

這種方法,編譯好的程式,在Win10下無效,需要管理者權限執行才行.

在Win10直接用API讀系統資料庫擷取,代碼如下:

<code>void</code> <code>TTools::GetSystemAllPort(TStringList * pList)</code>

<code>    </code><code>HKEY</code> <code>hKey;</code>

<code>    </code><code>DWORD</code> <code>result;</code>

<code>    </code><code>TCHAR</code> <code>valueName[255];</code>

<code>    </code><code>TCHAR</code> <code>data[255];</code>

<code>    </code><code>DWORD</code> <code>valueNameSize,dataSize;</code>

<code>    </code><code>DWORD</code> <code>i;</code>

<code>    </code><code>result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, </code><code>"Hardware\\DeviceMap\\SerialComm"</code><code>, </code>

<code>             </code><code>NULL, KEY_READ, &amp;hKey);</code><code>//讀取系統資料庫序列槽資訊</code>

<code>    </code><code>if</code><code>(ERROR_SUCCESS == result)</code>

<code>    </code><code>{</code>

<code>        </code><code>for</code><code>(i=0;i&lt;256 ;i++)</code>

<code>            </code><code>valueNameSize = dataSize = </code><code>sizeof</code><code>(valueName) / </code><code>sizeof</code><code>(</code><code>TCHAR</code><code>);</code>

<code>            </code><code>result = RegEnumValue(hKey, i, valueName, &amp;valueNameSize, NULL, NULL, </code>

<code>                     </code><code>(</code><code>LPBYTE</code><code>)data, &amp;dataSize);</code>

<code>            </code><code>if</code><code>(ERROR_NO_MORE_ITEMS == result )</code>

<code>            </code><code>{</code>

<code>                </code><code>break</code><code>;</code>

<code>            </code><code>}</code>

<code>            </code><code>else</code>

<code>               </code><code>pList-&gt;Add((</code><code>char</code><code>*)data);</code>

<code>    </code><code>}</code>

<code>    </code><code>else</code>

<code>        </code><code>::MessageBox(0,</code><code>"PORT ERROR!"</code><code>,</code><code>"Error"</code><code>,0);</code>

<code>    </code><code>RegCloseKey(hKey);</code>

<code></code>

本文轉自Chinayu201451CTO部落格,原文連結: http://blog.51cto.com/9233403/2067175,如需轉載請自行聯系原作者