1

为了从我的桌面应用程序访问 Windows CE 设备,我使用了自写的 DLL。该 DLL 使用 RAPI 在设备端调用必要的函数。多年来,一切都运行良好。

但现在我想在 Windows 服务中使用这个 DLL。它失败了。调试显示失败的是 CeRapiInitEx() 函数。在失败之前它会阻塞大约 5 秒,尽管 MSDN 说它是一个异步非阻塞函数。GetLastError() 给我 1444L“无效的线程标识符”。

互联网上有人提到 RAPI 在 ActiveSync 4 中的服务线程中不起作用。尽管信息很差而且很杂乱。

有没有人有同样的问题或只是有话要说?是否确实无法从 Windows 服务访问 RAPI?如果是这样,是否有任何解决方法?

4

1 回答 1

1

此问题的可能解决方案:

  1. 将 ActiveSync 降级到 3.8 版并授予服务与桌面交互的权限(为此使用系统服务小程序)。
  2. 生成另一个用户进程(CreateProcessAsUser)并将其用作服务和 RAPI 之间的中间层(即,在此进程中进行所有 RAPI 调用)。
  3. 创建另一个用户(非服务)应用程序,并将其用作服务和 RAPI 之间的中间层(即,在此应用程序中进行所有 RAPI 调用)。
  4. 像往常一样运行服务代码(例如,控制台)应用程序。
  5. 从 RAPI 切换到另一个接口与设备通信,例如 TCP。

我个人选择了第一个,因为它最适合我的情况。

于 2010-02-19T15:36:27.870 回答