如何在C ++中使用Windows DLL(后期绑定)方法?

在过去的几天里,我基本上一直在试图使这个工作,但我所有的尝试和所有在网上find的例子/build议都失败了。 我试图使用微软的“setupapi.dll”方法来实现我自己的.dll来访问我创build的外围设备。

现在我只是试图使用“setupapi.dll”中find的“SetupDiGetClassDevs”方法来检索我的电脑上连接的HID设备列表。 我已经尝试了从“AfxLoadLibrary”到“__declspec(dllimport)”的所有内容,以及我在网上find的其他一切都无济于事。

我在C#中find了一些工作示例,但是没有发现任何可以在C ++中编译的东西。 我正在Windows 7 64位上运行Microsoft Visual C ++ 2010 express,如果这有所作为(理想情况下,我希望它是独立于操作系统的 – 至less在更新版本的Windows中)。 任何可以成功导入/使用此方法的代码示例将不胜感激。 (也不要忘记提及任何configuration设置/资源文件/等,因为我需要弄清楚一个整体过程,使之工作。)

更新!!!:

所以我终于得到了我的代码编译使用这里给出的答复的build议+一些更多的使用googlesearch。 我现在的代码如下(并且这里的主要问题是“L”必须以引号中的.dll作为前缀):

GUID InterfaceClassGuid = {0x4d1e55b2,0xf16f,0x11cf,0x88,0xcb,0x00,0x11,0x11,0x00,0x00,0x30};

HDEVINFO hDevInfo = INVALID_HANDLE_VALUE; PSP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA; SP_DEVINFO_DATA DevInfoData; DWORD InterfaceIndex = 0; DWORD StatusLastError = 0; DWORD dwRegType; DWORD dwRegSize; DWORD StructureSize = 0; PBYTE PropertyValueBuffer; bool MatchFound = false; DWORD ErrorStatus; BOOL BoolStatus = FALSE; DWORD LoopCounter = 0; HINSTANCE dllHandle = LoadLibrary(L"setupapi.dll"); if(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); FreeLibrary(dllHandle); 

不幸的是,我不能使用提到的“safeloadlibrary”函数来获得这个工作。 而我其他论坛的印象是标准的“loadlibrary”function是不理想的。 所以我想知道什么是需要实现它(头文件等),或者如果有另一种更好的方式来做到这一点。 显然也有一些问题,可能会出现使用“loadlibrary”在DLL(特别是在DLLMain入口点),但鉴于我缺乏使用.dll的经验,我不知道他们是什么。

您的代码失败,因为您将错误的函数名称传递给GetProcAddress() 。 像大多数具有字符串参数的API函数一样, SetupDiGetClassDevs()具有单独的Ansi和Unicode风格( SetupDiGetClassDevsA()SetupDiGetClassDevsW() ),API头文件透明地隐藏了这些细节。 所以你需要调整你的字符串值,根据你真正想要使用的口味,例如:

 HINSTANCE dllHandle = SafeLoadLibrary("setupapi.dll"); if (dllHandle) { typedef HDEVINFO WINAPI (*pFUNC)(LPGUID, PCTSTR, HWND, DWORD); pFUNC SetupDiGetClassDevs = (pFUNC) GetProcAddress(dllHandle, #ifdef UNICODE "SetupDiGetClassDevsW" #else "SetupDiGetClassDevsA" #endif ); if (SetupDiGetClassDevs) hDevInfo = SetupDiGetClassDevs(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); FreeLibrary(dllHandle); } 

如果您有多个动态加载的函数,下面是一个简单的技巧,使映射更容易处理:

 #if defined(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"));