1
注意:本文内容来自Windows Mobile Team Blog。代码部分经过测试(在上海移动网络,易通卡),未能获取到电话号码,可能是服务商不提供该服务。感兴趣的朋友可以参考一下。
2
#include "stdafx.h"
3
#include "windows.h"
4
#include "tapi.h"
5
#include "tsp.h"
6
#pragma comment(lib,"cellcore.lib")
7![]()
8
#define EXIT_ON_NULL(_p) \
9
if (_p == NULL) \
10
{ \
11
hr = E_OUTOFMEMORY; \
12
goto FuncExit; \
13
}
14![]()
15
#define EXIT_ON_FALSE(_f) \
16
if (!(_f)) \
17
{ \
18
hr = E_FAIL; \
19
goto FuncExit; \
20
}
21![]()
22
#define MAX(i, j) ((i) > (j) ? (i) : (j))
23![]()
24
#define TAPI_API_LOW_VERSION 0x00020000
25
#define TAPI_API_HIGH_VERSION 0x00020000
26![]()
27
#define CAPS_BUFFER_SIZE 512
28![]()
29
30![]()
31
HRESULT SHReadLineAddressCaps(LPTSTR szNumber, UINT cchNumber, PDWORD pdwCallFwdModes, UINT nLineNumber)
32
{
33
HRESULT hr = E_FAIL;
34
LRESULT lResult = 0;
35
HLINEAPP hLineApp;
36
DWORD dwNumDevs;
37
DWORD dwAPIVersion = TAPI_API_HIGH_VERSION;
38
LINEINITIALIZEEXPARAMS liep;
39![]()
40
DWORD dwTAPILineDeviceID;
41
const DWORD dwAddressID = nLineNumber - 1;
42![]()
43
liep.dwTotalSize = sizeof(liep);
44
liep.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
45![]()
46
if (SUCCEEDED(lineInitializeEx(&hLineApp, 0, 0, TEXT("ExTapi_Lib"), &dwNumDevs, &dwAPIVersion, &liep)))
47
{
48![]()
49
BYTE* pCapBuf = NULL;
50
DWORD dwCapBufSize = CAPS_BUFFER_SIZE;
51
LINEEXTENSIONID LineExtensionID;
52
LINEDEVCAPS* pLineDevCaps = NULL;
53
LINEADDRESSCAPS* placAddressCaps = NULL;
54![]()
55
pCapBuf = new BYTE[dwCapBufSize];
56
EXIT_ON_NULL(pCapBuf);
57![]()
58
pLineDevCaps = (LINEDEVCAPS*)pCapBuf;
59
pLineDevCaps->dwTotalSize = dwCapBufSize;
60![]()
61
// Get TSP Line Device ID
62
dwTAPILineDeviceID = 0xffffffff;
63
for (DWORD dwCurrentDevID = 0 ; dwCurrentDevID < dwNumDevs ; dwCurrentDevID++)
64
{
65
if (0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, TAPI_API_LOW_VERSION, TAPI_API_HIGH_VERSION,
66
&dwAPIVersion, &LineExtensionID))
67
{
68
lResult = lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, pLineDevCaps);
69![]()
70
if (dwCapBufSize < pLineDevCaps->dwNeededSize)
71
{
72
delete[] pCapBuf;
73
dwCapBufSize = pLineDevCaps->dwNeededSize;
74
pCapBuf = new BYTE[dwCapBufSize];
75
EXIT_ON_NULL(pCapBuf);
76![]()
77
pLineDevCaps = (LINEDEVCAPS*)pCapBuf;
78
pLineDevCaps->dwTotalSize = dwCapBufSize;
79![]()
80
lResult = lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, pLineDevCaps);
81
}
82![]()
83
if ((0 == lResult) &&
84
(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset), CELLTSP_LINENAME_STRING)))
85
{
86
dwTAPILineDeviceID = dwCurrentDevID;
87
break;
88
}
89
}
90
}
91![]()
92
placAddressCaps = (LINEADDRESSCAPS*)pCapBuf;
93
placAddressCaps->dwTotalSize = dwCapBufSize;
94![]()
95
lResult = lineGetAddressCaps(hLineApp, dwTAPILineDeviceID, dwAddressID, dwAPIVersion, 0, placAddressCaps);
96![]()
97
if (dwCapBufSize < placAddressCaps->dwNeededSize)
98
{
99
delete[] pCapBuf;
100
dwCapBufSize = placAddressCaps->dwNeededSize;
101
pCapBuf = new BYTE[dwCapBufSize];
102
EXIT_ON_NULL(pCapBuf);
103![]()
104
placAddressCaps = (LINEADDRESSCAPS*)pCapBuf;
105
placAddressCaps->dwTotalSize = dwCapBufSize;
106![]()
107
lResult = lineGetAddressCaps(hLineApp, dwTAPILineDeviceID, dwAddressID, dwAPIVersion, 0, placAddressCaps);
108
}
109![]()
110
if (0 == lResult)
111
{
112
if (szNumber)
113
{
114
szNumber[0] = _T('\0');
115![]()
116
EXIT_ON_FALSE(0 != placAddressCaps->dwAddressSize);
117![]()
118
// A non-zero dwAddressSize means a phone number was found
119
ASSERT(0 != placAddressCaps->dwAddressOffset);
120
PWCHAR tsAddress = (WCHAR*)(((BYTE*)placAddressCaps)+placAddressCaps->dwAddressOffset);
121![]()
122
StringCchCopy(szNumber, cchNumber, tsAddress);
123
}
124![]()
125
// Record the allowed forwarding modes
126
if (pdwCallFwdModes)
127
{
128
*pdwCallFwdModes = placAddressCaps->dwForwardModes;
129
}
130![]()
131
hr = S_OK;
132
}
133![]()
134
delete[] pCapBuf;
135
} // End if ()
136![]()
137
FuncExit:
138
lineShutdown(hLineApp);
139![]()
140
return hr;
141
}
142![]()
143
144![]()
145
// szNumber - Out Buffer for the phone number
146![]()
147
//cchNumber - size of sznumber in characters
148![]()
149
// nLineNumber - which phone line (1 or 2) to get the number for
150
HRESULT SHGetPhoneNumber(LPTSTR szNumber, UINT cchNumber, UINT nLineNumber)
151
{
152
return SHReadLineAddressCaps(szNumber, cchNumber, NULL, nLineNumber);
153
}
154![]()
155![]()
156
int WINAPI WinMain( HINSTANCE hInstance,
157
HINSTANCE hPrevInstance,
158
LPTSTR lpCmdLine,
159
int nCmdShow)
160
{
161
TCHAR tcNum[MAX_PATH]={0};
162
SHGetPhoneNumber(tcNum,MAX_PATH,1);
163![]()
164
MessageBox(NULL,tcNum,_T("Number"),MB_OK);
165
166
return 0;
167
}
168![]()
169![]()
注意:本文内容来自Windows Mobile Team Blog。代码部分经过测试(在上海移动网络,易通卡),未能获取到电话号码,可能是服务商不提供该服务。感兴趣的朋友可以参考一下。2
#include "stdafx.h"3
#include "windows.h"4
#include "tapi.h"5
#include "tsp.h"6
#pragma comment(lib,"cellcore.lib")7

8
#define EXIT_ON_NULL(_p) \9
if (_p == NULL) \10
{ \11
hr = E_OUTOFMEMORY; \12
goto FuncExit; \13
} 14

15
#define EXIT_ON_FALSE(_f) \16
if (!(_f)) \17
{ \18
hr = E_FAIL; \19
goto FuncExit; \20
} 21

22
#define MAX(i, j) ((i) > (j) ? (i) : (j))23

24
#define TAPI_API_LOW_VERSION 0x0002000025
#define TAPI_API_HIGH_VERSION 0x0002000026

27
#define CAPS_BUFFER_SIZE 51228

29
30

31
HRESULT SHReadLineAddressCaps(LPTSTR szNumber, UINT cchNumber, PDWORD pdwCallFwdModes, UINT nLineNumber)32
{33
HRESULT hr = E_FAIL;34
LRESULT lResult = 0;35
HLINEAPP hLineApp;36
DWORD dwNumDevs;37
DWORD dwAPIVersion = TAPI_API_HIGH_VERSION;38
LINEINITIALIZEEXPARAMS liep;39

40
DWORD dwTAPILineDeviceID;41
const DWORD dwAddressID = nLineNumber - 1;42

43
liep.dwTotalSize = sizeof(liep);44
liep.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;45

46
if (SUCCEEDED(lineInitializeEx(&hLineApp, 0, 0, TEXT("ExTapi_Lib"), &dwNumDevs, &dwAPIVersion, &liep)))47
{48

49
BYTE* pCapBuf = NULL;50
DWORD dwCapBufSize = CAPS_BUFFER_SIZE;51
LINEEXTENSIONID LineExtensionID;52
LINEDEVCAPS* pLineDevCaps = NULL;53
LINEADDRESSCAPS* placAddressCaps = NULL;54

55
pCapBuf = new BYTE[dwCapBufSize];56
EXIT_ON_NULL(pCapBuf);57

58
pLineDevCaps = (LINEDEVCAPS*)pCapBuf;59
pLineDevCaps->dwTotalSize = dwCapBufSize;60

61
// Get TSP Line Device ID62
dwTAPILineDeviceID = 0xffffffff;63
for (DWORD dwCurrentDevID = 0 ; dwCurrentDevID < dwNumDevs ; dwCurrentDevID++)64
{65
if (0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, TAPI_API_LOW_VERSION, TAPI_API_HIGH_VERSION,66
&dwAPIVersion, &LineExtensionID))67
{68
lResult = lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, pLineDevCaps);69

70
if (dwCapBufSize < pLineDevCaps->dwNeededSize)71
{72
delete[] pCapBuf;73
dwCapBufSize = pLineDevCaps->dwNeededSize;74
pCapBuf = new BYTE[dwCapBufSize];75
EXIT_ON_NULL(pCapBuf);76

77
pLineDevCaps = (LINEDEVCAPS*)pCapBuf;78
pLineDevCaps->dwTotalSize = dwCapBufSize;79

80
lResult = lineGetDevCaps(hLineApp, dwCurrentDevID, dwAPIVersion, 0, pLineDevCaps);81
}82

83
if ((0 == lResult) &&84
(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset), CELLTSP_LINENAME_STRING)))85
{86
dwTAPILineDeviceID = dwCurrentDevID;87
break;88
}89
} 90
} 91

92
placAddressCaps = (LINEADDRESSCAPS*)pCapBuf;93
placAddressCaps->dwTotalSize = dwCapBufSize;94

95
lResult = lineGetAddressCaps(hLineApp, dwTAPILineDeviceID, dwAddressID, dwAPIVersion, 0, placAddressCaps);96

97
if (dwCapBufSize < placAddressCaps->dwNeededSize)98
{99
delete[] pCapBuf;100
dwCapBufSize = placAddressCaps->dwNeededSize;101
pCapBuf = new BYTE[dwCapBufSize];102
EXIT_ON_NULL(pCapBuf);103

104
placAddressCaps = (LINEADDRESSCAPS*)pCapBuf;105
placAddressCaps->dwTotalSize = dwCapBufSize;106

107
lResult = lineGetAddressCaps(hLineApp, dwTAPILineDeviceID, dwAddressID, dwAPIVersion, 0, placAddressCaps);108
}109

110
if (0 == lResult)111
{112
if (szNumber)113
{114
szNumber[0] = _T('\0');115

116
EXIT_ON_FALSE(0 != placAddressCaps->dwAddressSize);117

118
// A non-zero dwAddressSize means a phone number was found119
ASSERT(0 != placAddressCaps->dwAddressOffset);120
PWCHAR tsAddress = (WCHAR*)(((BYTE*)placAddressCaps)+placAddressCaps->dwAddressOffset);121

122
StringCchCopy(szNumber, cchNumber, tsAddress);123
}124

125
// Record the allowed forwarding modes126
if (pdwCallFwdModes)127
{128
*pdwCallFwdModes = placAddressCaps->dwForwardModes;129
}130

131
hr = S_OK;132
} 133

134
delete[] pCapBuf;135
} // End if ()136

137
FuncExit:138
lineShutdown(hLineApp);139

140
return hr;141
}142

143
144

145
// szNumber - Out Buffer for the phone number146

147
//cchNumber - size of sznumber in characters148

149
// nLineNumber - which phone line (1 or 2) to get the number for150
HRESULT SHGetPhoneNumber(LPTSTR szNumber, UINT cchNumber, UINT nLineNumber)151
{152
return SHReadLineAddressCaps(szNumber, cchNumber, NULL, nLineNumber);153
}154

155

156
int WINAPI WinMain( HINSTANCE hInstance,157
HINSTANCE hPrevInstance,158
LPTSTR lpCmdLine,159
int nCmdShow)160
{161
TCHAR tcNum[MAX_PATH]={0};162
SHGetPhoneNumber(tcNum,MAX_PATH,1);163

164
MessageBox(NULL,tcNum,_T("Number"),MB_OK);165
166
return 0;167
}168

169
