每當有新的 USB 設備連接到我的 PC 時,我都會嘗試列印一條訊息,但我不想創建一個僅捕獲和處理由 Windows 內核觸發的事件的應用程式。所以我使用了一些特定的功能來列印活動的 USB 設備,然后,每當插入新設備時,信號就會產生一些東西(彈出視窗或類似的東西)。因此,首先,我嘗試列舉所有 USB 設備,但我沒有成功,只要我收到代表特定 USB 設備的一行文本,而不是所有連接的 USB 設備。這是代碼
#pragma comment(lib, "Cfgmgr32")
#include <iostream>
#include <Windows.h>
#include <cfgmgr32.h>
#include <initguid.h>
#include <Usbiodef.h>
#define MAX 1024
int main()
{
ULONG length;
auto eroare1 = CM_Get_Device_Interface_List_SizeA(
&length,
(LPGUID)&GUID_DEVINTERFACE_USB_DEVICE,
NULL,
CM_GET_DEVICE_INTERFACE_LIST_PRESENT
);
if (eroare1 != CR_SUCCESS)
{
std::cout << "eroare 1";
}
PSZ buffer;
buffer = new char[MAX];
auto eroare2 = CM_Get_Device_Interface_ListA(
(LPGUID)&GUID_DEVINTERFACE_USB_DEVICE,
NULL,
buffer
length,
CM_GET_DEVICE_INTERFACE_LIST_PRESENT
);
if (eroare2 != CR_SUCCESS)
{
std::cout << "eroare";
}
std::cout << buffer << std::endl;
}
uj5u.com熱心網友回復:
CM_Get_Device_Interface_ListA用于回傳專案串列的格式是雙空終止串列(有關基本原理,另請參見為什么使用雙空終止字串而不是指向字串的指標陣列?)。這在檔案中沒有明確說明,但可以從Buffer:的引數型別推斷出來PZZSTR。
它在winnt.h中宣告如下:
typedef _NullNull_terminated_ CHAR *PZZSTR;
這實際上只是一個char*但帶有_NullNull_terminated_ SAL 注釋。它允許靜態代碼分析器了解 的附加語意PZZSTR,并作為對開發人員的提示。
有問題的代碼只列印第一個 NUL 字符之前的字符,即它最多顯示串列中的一個專案。要顯示所有專案,您必須遍歷字串,直到找到一個空字串:
char const* current{ buffer };
while (*current != '\0') {
std::cout << current << std::endl;
current = strlen(current) 1;
}
這解決了眼前的問題。要使代碼實際作業,您必須修復潛在的記憶體損壞錯誤。在對您的呼叫中,CM_Get_Device_Interface_ListA您告訴 APIbuffer指向length記憶體位元組,但您分配了MAX位元組。
Buffer和的引數BufferLen必須與實際分配相匹配。說到這一點,你從來沒有真正清理過那段記憶。使用 astd::vector解決了這兩個問題:
std::vector<char> buffer(length);
auto eroare2 = CM_Get_Device_Interface_ListA(
(LPGUID)&GUID_DEVINTERFACE_USB_DEVICE,
NULL,
buffer.data(),
buffer.size(),
CM_GET_DEVICE_INTERFACE_LIST_PRESENT
);
// ...
char const* current{ buffer.data() };
// ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/452664.html
標籤:C 视觉工作室 温纳皮 视觉-C windows-api-代码包
上一篇:如何從禁用按鈕中洗掉黑色邊框?
