这两天写一个程序,其中想判断当前PPC 是否 Protect PC Phone, 在MSDN 上找到一篇文章,应该有所帮助,只是尚未测试,先记下
如何维护用于 Pocket PC 和 Smartphone 的单一二进制文件
上面这片文章揭示的是如何通过程序来区分当前的系统是Protect PC 还是 SmartPhone, 如果是Protect PC ,那想进一步区分是普通的PPC 还是 Protect PC Phone 呢?
在 Mobile 5.0 Protect PC SDK 中有个 "GetPhoneNumber" 的 sample, 在Protect PC模拟器,取出的号码是空,在 Protect PC Phone模拟器上取出了号码,原以为可以把这个函数照搬拿来用,但在我的多普达P800上竟然也取出个空号,实在有点出乎意料。
反复跟踪以后(只能不停的弹 MessageBox 在我的P800上),sample里取号码的那段代码兼容性肯定有问题,他是判断 LINEADDRESSCAPS.dwAddressSize 是否是0,不是0 就 (WCHAR*)(((BYTE*)placAddressCaps)+placAddressCaps->dwAddressOffset 就以这个为PhoneNumber 了,但是在P800 上 LINEADDRESSCAPS.dwAddressSize 就是 0 !同样 dwAddressOffset 也是 0 ,究竟怎样才能取的号码这个只能以后再研究了。
其实只要 sample的前半段代码就足够用来判断Protect PC 是否带 Phone 了,只要判断 LINEADDRESSCAPS+pLineDevCaps->dwLineNameOffset 是否是 CELLTSP_LINENAME_STRING ,是的话那就应该是有Phone 了 。 CELLTSP_LINENAME_STRING 在 tsp.h 中定义
#define CELLTSP_LINENAME_STRING (L"Cellular Line")
代码如下:
... {
const DWORD TAPI_API_LOW_VERSION = 0x00020000;
const DWORD TAPI_API_HIGH_VERSION = 0x00020000;
bool bResult = false;
HRESULT hr = E_FAIL;
LRESULT lResult = 0;
HLINEAPP hLineApp;
DWORD dwNumDevs; //number of line devices
DWORD dwAPIVersion = TAPI_API_HIGH_VERSION;
LINEINITIALIZEEXPARAMS liep;
DWORD dwTAPILineDeviceID;
const DWORD dwAddressID = 0;
liep.dwTotalSize = sizeof(liep);
liep.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
if(SUCCEEDED(lineInitializeEx(&hLineApp, 0, 0, TEXT("ExTapi_Lib"), &dwNumDevs, &dwAPIVersion, &liep)))
...{
BYTE* pCapBuf = NULL;
DWORD dwCapBufSize = 512;
LINEEXTENSIONID LineExtensionID;
LINEDEVCAPS* pLineDevCaps = NULL;
pCapBuf = new BYTE[dwCapBufSize];
pLineDevCaps = (LINEDEVCAPS*)pCapBuf;
pLineDevCaps->dwTotalSize = dwCapBufSize;
// Get TSP Line Device ID
dwTAPILineDeviceID = 0xffffffff;
for (DWORD dwCurrentDevID = 0 ; dwCurrentDevID < dwNumDevs ; dwCurrentDevID++)
...{
//ensure TAPI, service provider, and application are all using the same versions
if (0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, TAPI_API_LOW_VERSION, TAPI_API_HIGH_VERSION,
&dwAPIVersion, &LineExtensionID))
...{
lResult = lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, pLineDevCaps);
//increase buffer size if too small to hold the device capabilities
if (dwCapBufSize < pLineDevCaps->dwNeededSize)
...{
delete[] pCapBuf;
dwCapBufSize = pLineDevCaps->dwNeededSize;
pCapBuf = new BYTE[dwCapBufSize];
pLineDevCaps = (LINEDEVCAPS*)pCapBuf;
pLineDevCaps->dwTotalSize = dwCapBufSize;
lResult = lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, pLineDevCaps);
}
//lResult of 0 means the device capabilities were successfully returned
if ((0 == lResult) &&
(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset), CELLTSP_LINENAME_STRING)))
...{
dwTAPILineDeviceID = dwCurrentDevID;
bResult = true;
break;
}
}
}
delete [] pCapBuf;
}
lineShutdown(hLineApp);
return bResult;
}