Về cơ bản, tôi đã cố gắng làm cho nó hoạt động trong vài ngày qua, nhưng mọi nỗ lực của tôi cũng như tất cả các ví dụ/đề xuất tôi tìm thấy trên mạng đều thất bại. Tôi đang cố gắng sử dụng phương pháp "setupapi.dll" của Microsoft để triển khai .dll của riêng mình nhằm truy cập vào thiết bị ngoại vi mà tôi đã tạo.
Bây giờ tôi chỉ đang thử sử dụng phương thức "SetupDiGetClassDevs" trong "setupapi.dll" để truy xuất danh sách các thiết bị HID được kết nối trên máy tính của tôi. Tôi đã thử mọi thứ từ "AfxLoadLibrary" đến "__declspec(dllimport)" và gần như mọi thứ khác mà tôi tìm thấy trên mạng nhưng không có kết quả.
Tôi đã tìm thấy các ví dụ hoạt động trong C#, nhưng chưa tìm thấy bất kỳ ví dụ nào thậm chí biên dịch trong C++. Tôi đang chạy Microsoft visual C++ 2010 express trên Windows 7 64 bit, nếu điều đó tạo ra sự khác biệt (lý tưởng nhất là tôi muốn nó độc lập với hệ điều hành - ít nhất là trong các phiên bản Windows mới hơn). Bất kỳ ví dụ mã nào có thể nhập/sử dụng thành công phương pháp này sẽ được đánh giá rất cao. (Cũng đừng quên đề cập đến bất kỳ cài đặt cấu hình/tệp tài nguyên/v.v. nào, vì tôi cần tìm ra một quy trình tổng thể để thực hiện công việc này.)
gia hạn!!!:
Vì vậy, cuối cùng tôi đã biên dịch được mã của mình bằng cách sử dụng kết hợp các đề xuất từ các phản hồi được đưa ra ở đây + một số thông tin khác trên Google. Mã hiện tại của tôi như sau (FYI, vấn đề chính ở đây là chữ "L" phải nằm trong dấu ngoặc kép làm tiền tố cho .dll):
GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30};
HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
PSP_DEVICE_INTERFACE_DATA InterfaceDataStructure = SP_DEVICE_INTERFACE_DATA mới;
SP_DEVINFO_DATADữ liệu DevInfo;
Chỉ số giao diện DWORD = 0;
Trạng thái DWORDLastError = 0;
DWORD dwRegType;
DWORD dwRegSize;
Kích thước cấu trúc DWORD = 0;
Bộ đệm thuộc tính PBYTE;
bool MatchFound = sai;
Trạng thái lỗi DWORD;
BOOL BoolStatus = FALSE;
Bộ đếm vòng lặp DWORD = 0;
HINSTANCE dllHandle = LoadLibrary(L"setupapi.dll");
nếu(dllHandle)
{
typedef HDEVINFO (WINAPI *pFUNC)(LPGUID, PCTSTR, HWND, DWORD);
pFUNC SetupDiGetClassDevs = (pFUNC) GetProcAddress(dllHandle,
#ifdef UNICODE
"SetupDiGetClassDevsW"
#else
"SetupDiGetClassDevsA"
#endif
);
if(SetupDiGetClassDevs)
hDevInfo = SetupDiGetClassDevsW(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
Thư viện miễn phí (dllHandle);
Thật không may, tôi không thể đạt được điều đó bằng cách sử dụng chức năng "thư viện an toàn" được đề cập bởi remy. Ấn tượng của tôi từ các diễn đàn khác là chức năng "tải thư viện" tiêu chuẩn không lý tưởng. Vì vậy, tôi muốn biết những gì cần thiết để triển khai nó (tệp tiêu đề, v.v.) hoặc liệu có cách nào khác tốt hơn để triển khai nó hay không. Rõ ràng có thể có một số vấn đề khi sử dụng "loadlibrary" trong một DLL (cụ thể là ở điểm nhập DLLMain), nhưng do tôi thiếu kinh nghiệm với .dll nên tôi không chắc chúng là gì.
Mã của bạn không thành công vì bạn đang hỏi GetProcAddress()
Tên chức năng sai đã được thông qua. Giống như hầu hết các hàm API lấy tham số chuỗi,SetupDiGetClassDevs()
Có hương vị Ansi và Unicode riêng biệt (tương ứng SetupDiGetClassDevsA()
Và SetupDiGetClassDevsW()
) ) và các tệp tiêu đề API ẩn chi tiết này khỏi bạn một cách rõ ràng. Vì vậy, bạn cần điều chỉnh giá trị chuỗi của mình theo kiểu bạn thực sự muốn sử dụng, ví dụ:
HINSTANCE dllHandle = SafeLoadLibrary("setupapi.dll");
nếu(dllHandle)
{
typedef HDEVINFO WINAPI (*pFUNC)(LPGUID, PCTSTR, HWND, DWORD);
pFUNC SetupDiGetClassDevs = (pFUNC) GetProcAddress(dllHandle,
#ifdef UNICODE
"SetupDiGetClassDevsW"
#else
"SetupDiGetClassDevsA"
#endif
);
nếu (SetupDiGetClassDevs)
hDevInfo = SetupDiGetClassDevs(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
Thư viện miễn phí (dllHandle);
}
Nếu bạn có nhiều hàm cần tải động thì đây là một thủ thuật đơn giản giúp việc lập bản đồ dễ sử dụng hơn:
#if được xác định (UNICODE)
#define _MAP_WINNAME_STR(n) n "W"
#else
#define _MAP_WINNAME_STR(n) n "A"
#endif
pFUNC SetupDiGetClassDevs = (pFUNC) GetProcAddress(dllHandle, _MAP_WINNAME_STR("SetupDiGetClassDevs"));
Tôi là một lập trình viên xuất sắc, rất giỏi!