在Windows Mobile下,应用程序如果需要网络去附着一般需要调用RIL函数RIL_UnregisterFromNetwork(调用扩展TAPI函数lineUnregister的很少见)。但是,由于该函数是异步的,如果想通过result callback获知网络去附着是否成功的话就比较麻烦了。
因此,笔者在此介绍一个未归档的函数UnregisterFromNetwork,该函数亦可实现网络去附着功能,其函数原型如下:
// *************************************************************************
// UnregisterFromNetwork
//
// Purpose:
// Unregisters the radio module from the network if it is
// possible to do so, and waits for that operation to complete.
//
// Returns:
// HRESULT
//
// *************************************************************************
HRESULT WINAPI UnregisterFromNetwork();
开发者如果要链接该函数需要使用导入库ccoreutl.lib。
以下是根据笔者反汇编所得,改用C/C++描述的UnregisterFromNetwork函数实现:
该函数实现较为简单,依次调用了RIL_Initialize、RIL_UnregisterFromNetwork和RIL_Deinitialize。由于RIL_UnregisterFromNetwork是异步的,为了等待去附着过程完成就用到了一个Event内核对象,不过这里的WaitForSingleObject函数调用传入的第二个参数是INFINITE,很可能造成主调线程挂起。这个Event内核对象则是通过回调函数RIL_RESULT_Callback在去附着操作完成时设置成signaled状态。
PS: 如果微软在实现该函数时给出一个timeout参数就完美了。