我正在尝试实现一个功能,即通过我的程序自动检测USB存储设备。
我了解到需要监听 WM_DEVICECHANGE
,并已经使用 QAbstractNativeEventFilter
进行了处理,但这无法捕获特定情况,例如SD卡从读卡器中插入或拔出(或在我这种情况下按下“打开大容量存储”按钮)。
通过一些谷歌搜索,我找到了这篇文章:Detect insertion of media into a drive using windows messages ,它描述了我需要的内容,可以利用 SHCNE_MEDIAINSERTED
和 SHCNE_MEDIAREMOVED
。
我的问题是我的链接器似乎找不到SHChangeNotifyRegister
。在Qt Creator中,我得到了 slobj.h
的代码完成声明,但编译时出现以下错误:
error: undefined reference to `_imp__SHChangeNotifyRegister@24'
然后
ld
以退出码1失败。我不知道链接器找不到什么,QtCreator中的包含文件都很好 - 那么它找不到
shell32.dll
吗?我正在运行mingw4.8 32bit
,这是无法使用用不同编译器编译的dll的情况吗?我还尝试将win32: LIBS += -lshell32
添加到我的.pro文件中,但没有效果,并且将Windows 7 SDK的lib
文件夹添加到了我的路径变量中。我的代码如下(请注意,我对winapi一点也不了解,所以这段代码可能存在严重问题,因为我正在进行修改):
MainWindow w(deviceMgr);
w.show();
int sources = 0x0001 | 0x0002 | 0x8000; // Interupt, Shell, New Delivery Missing Defs
LONG events = SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED;
PIDLIST_ABSOLUTE pidl;
SHGetFolderLocation((HWND) w.winId(), CSIDL_DRIVES, NULL, 0, &pidl);
SHChangeNotifyEntry entries[] = { pidl, false };
ULONG code = SHChangeNotifyRegister(
(HWND) w.winId(),
sources,
events,
WM_APP + 1,
ARRAYSIZE(entries),
entries
);
欢迎提供评论,以帮助我更好地阐述这个问题。
更新:
根据 Carey 和 Michaels 在注释中的建议,我已经弄清楚了一些事情:
- I'm not using the shell32.lib from the Windows SDK because I think that is for MSVC.
mingw links against its own shell32.a
Having used
objdump -x shell32.a
from my mingw distribution I can find no reference to SHChangeNotifyRegister.Using
objdump -x shell32.lib
on theshell32.lib
from the windows SDK I can find the line:[ 3](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp__SHChangeNotifyRegister@24
因此,我认为我应该尝试使用更新版本的mingw(如果有的话),或者使用mingw链接WindowsSDK(这似乎是不可能的),或者使用MSVC进行我的Windows构建。
因此,我认为对我的问题的答案是:“它无法链接,因为您的shell32.a文件中没有包含.h文件中的所有内容”?
回答:
结果证明,mingw可以使用某些msvc .lib文件。所以这一次,我正确地链接到了Windows SDK版本的shell32.lib文件,一切似乎都工作正常。简而言之,这需要添加到我的
.pro
文件中:win32: LIBS += -L"C:/Path/To/Microsoft/Microsoft SDKs/Windows/v7.1/Lib/" -lshell32