我有一个在Windows移动设备上运行的Java应用程序。我需要能够打开和关闭蓝牙,以便它执行一些本机代码来执行此操作。问题是我正在新设备(HTC HD2)上试用它,而本机代码不起作用。原因是HD2设备正在使用Widcomm蓝牙堆栈,而另一台设备正在使用Microsoft堆栈。

我现在找到了一种使用Widcomm SDK在HD2设备上激活蓝牙的方法。但是,此本机代码必须能够在任何设备上运行,因此我需要能够在运行时做出决定,根据存在的蓝牙堆栈来运行哪个代码。

问题1:如何以编程方式确定存在哪个堆栈?

问题2:如果我包含Widcomm堆栈所需的头文件,并尝试在不使用它的设备上运行它,则代码将失败。我如何编译dll,以便如果Widcomm dll存在,则仅包含该头文件?

最佳答案

我猜测您可能必须动态地完成所有操作:


在您自己的代码中声明必要的Widcomm函数的原型。
使用LoadLibrary加载Widcomm dll。
如果LoadLibrary调用失败,则表明您在Microsoft堆栈上,并且可以运行标准的Microsoft堆栈功能。
如果LoadLibrary成功,则说明您位于Widcomm堆栈上,可以使用Widcomm函数。


根据Widcomm标头中需要多少个函数,可能会有些混乱,但是您不能静态地编译对这些函数的引用,因为它将尝试加载并找不到它(这可能就是为什么看到崩溃)。

Windows Mobile上也存在蓝牙堆栈疯狂,这真是太可怕了。认为仅限于桌面。

09-12 17:22