gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:37:31 31 4
gpt4 key购买 nike

过去几天我基本上一直在努力让它工作,但我的所有尝试和网上找到的所有示例/建议都失败了。我正在尝试使用 Microsoft 的“setupapi.dll”方法来实现我自己的 .dll 来访问我创建的外围设备。

现在我只是尝试使用“setupapi.dll”中的方法“SetupDiGetClassDevs”来检索我计算机上连接的 HID 设备的列表。我已经尝试了从“AfxLoadLibrary”到“__declspec(dllimport)”的所有方法以及我在网上找到的几乎所有其他方法都无济于事。

我已经在 C# 中找到了工作示例,但还没有找到任何甚至可以在 C++ 中编译的示例。我在 Windows 7 64 位上运行 Microsoft visual C++ 2010 express,如果这有所不同(理想情况下我希望它独立于操作系统——至少在较新版本的 Windows 中)。任何可以成功导入/使用此方法的代码示例将不胜感激。 (另外不要忘记提及任何配置设置/资源文件/等,因为我需要找出一个整体过程来完成这项工作。)

更新!!!:

所以我终于得到了我的代码来编译使用这里给出的响应的建议组合 + 一些更多的谷歌搜索。我当前的代码如下(仅供引用,这里的主要问题是“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);

不幸的是,我无法使用 remy 提到的“safeloadlibrary”函数来实现它。我对其他论坛的印象是标准的“loadlibrary”功能并不理想。所以我想知道实现它需要什么(头文件等),或者是否有另一种更好的方法来实现它。显然,在 DLL(特别是在 DLLMain 入口点)中使用“loadlibrary”可能会出现一些问题,但鉴于我缺乏使用 .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"));

关于c++ - 如何在 C++ 中使用 Windows DLL(后期绑定(bind))方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7600590/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com