C++ 使用MingW编译的程序如何使用Windows便携式设备(WPD)API?

C++ 使用MingW编译的程序如何使用Windows便携式设备(WPD)API?,c++,windows,wpd,C++,Windows,Wpd,我正在编写一个程序,当检测到可移动设备时,自动执行一些必须完成的任务。最初只使用文件流。当我意识到并非所有可移动设备都可以通过这种方式访问时,我开始使用SHFileOperation,但现在我意识到,即使通过这种方法也无法访问某些设备 我想使用WPDAPI,但我的程序是使用MingW编译的,它使用的库也是使用MingW编译的。我看到的唯一两种可能是重新编译Visual C++的所有内容(如果可能的话,我想避免这种情况)或者编写一个小型的打包库,它将作为DLL编译,只导出函数,并且可以很容易地与M

我正在编写一个程序,当检测到可移动设备时,自动执行一些必须完成的任务。最初只使用文件流。当我意识到并非所有可移动设备都可以通过这种方式访问时,我开始使用SHFileOperation,但现在我意识到,即使通过这种方法也无法访问某些设备

我想使用WPDAPI,但我的程序是使用MingW编译的,它使用的库也是使用MingW编译的。我看到的唯一两种可能是重新编译Visual C++的所有内容(如果可能的话,我想避免这种情况)或者编写一个小型的打包库,它将作为DLL编译,只导出函数,并且可以很容易地与MingW编译的程序链接,即使DLL本身是用VisualC++编写的(因此它可以使用WPDAPI)。
例如,如果有人知道一个库已经包装了WPD,这将节省我很多时间。

我认为你不会找到任何WPD的通用包装,因为API公开了可以直接从MinGW访问的COM接口。问题是没有与MinGW兼容的头声明接口和相关类型。很少有可能的解决方案不涉及使用Microsoft编译器:

  • 编写自己的与MinGW兼容的标题。如果您可以仅从文档中执行此操作,而不引用Microsoft的标题,那么您可以将它们提交到w32api包中,以便其他人可以使用它们
  • 复制头的Windows SDK版本,并删除所有阻止它们使用GCC编译的垃圾。来自旧SDK的旧版本的标题将有更少的垃圾要删除
  • 创建包装SDK标头的标头,并使用宏消除垃圾
  • 将OLE自动化接口用于WPD。MinGW支持执行此操作所需的所有COM接口(主要是
    IDispatch
    )。Windows SDK文档支持此选项

考虑到每种方法可能需要的时间,我认为1是最好的。我试试看。OLE自动化是否适用于XP?即使现在不支持,使用该程序的人也不会很快更新到7或8。我在Windows SDK lib文件夹中看到一个PortableDeviceGUIDs.lib文件。同样,MinGW编译程序应该链接哪个dll?没有需要链接的WPD dll。由于WPD专门使用COM接口,您需要使用带有适当WPD类id的
CoCreateInstance
(例如
CLSID_PortableDeviceManager
)来获取创建WPD对象并获取其接口。因此,您应该能够获得其他接口和/或创建其他对象。MinGW支持此函数的
CoCreateInstance
,链接到
-lole32
。回到Windows 95的所有版本的Windows都支持OLE自动化。请注意,WPD不是Windows XP的一部分,用户需要先安装它。明白。如果1花费太多时间,我将尝试1或4。