小弟最近突发奇想,想用Mobile手机通过蓝牙控制PC
于是乎上网找蓝牙编程资料
在编写PC端程序时
搜索蓝牙设备出现一个很神奇的问题
代码如下:void CBlueToothDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
HANDLE hHandle;
DWORD dwBufLen = 0;
DWORD dwFlags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
WSAQUERYSET* pQs = new WSAQUERYSET; ZeroMemory(pQs, sizeof(WSAQUERYSET));
pQs->dwSize = sizeof(WSAQUERYSET);
pQs->dwNameSpace = NS_BTH;
dwBufLen = sizeof(WSAQUERYSET); if (SOCKET_ERROR == WSALookupServiceBegin(pQs, dwFlags, &hHandle))
{
CString s;
s.Format("%d", GetLastError());
AfxMessageBox(s);
if (pQs)
{
delete pQs;
}
return;
} BOOL fDone = FALSE;
while(!fDone)
{
if (SOCKET_ERROR != WSALookupServiceNext(hHandle, dwFlags, &dwBufLen, pQs))
{
char szText[64] = {0};
DWORD dwSize = 64;
WSAAddressToString(
pQs->lpcsaBuffer->RemoteAddr.lpSockaddr,
sizeof(SOCKADDR_BTH),
NULL,
szText,
&dwSize
);
szText[dwSize] = 0;
CString s;
strcat(szText, "--");
strcat(szText, pQs->lpszServiceInstanceName);
SetWindowText(szText);
}
else
{
switch(WSAGetLastError())
{
case WSAEFAULT:
delete pQs;
pQs = NULL;
pQs = new WSAQUERYSET;
ZeroMemory(pQs, sizeof(WSAQUERYSET));
pQs->dwSize = sizeof(WSAQUERYSET);
pQs->dwNameSpace = NS_BTH;
break;
default :
fDone = TRUE;
break;
}
}
}
WSALookupServiceEnd(hHandle);
if (pQs)
{
delete pQs; //释放结构体时报Unhandled exception
}
}代码是模仿Bluetooth Essentials for Programmers这本书上的
通过下断点,发现已经能找到我的Mobile手机
但是为什么在最后释放pQs的时候会报错呢?
不知道各位大大是否也遇到过类似问题
还请各位大大指点指点~~
于是乎上网找蓝牙编程资料
在编写PC端程序时
搜索蓝牙设备出现一个很神奇的问题
代码如下:void CBlueToothDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
HANDLE hHandle;
DWORD dwBufLen = 0;
DWORD dwFlags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
WSAQUERYSET* pQs = new WSAQUERYSET; ZeroMemory(pQs, sizeof(WSAQUERYSET));
pQs->dwSize = sizeof(WSAQUERYSET);
pQs->dwNameSpace = NS_BTH;
dwBufLen = sizeof(WSAQUERYSET); if (SOCKET_ERROR == WSALookupServiceBegin(pQs, dwFlags, &hHandle))
{
CString s;
s.Format("%d", GetLastError());
AfxMessageBox(s);
if (pQs)
{
delete pQs;
}
return;
} BOOL fDone = FALSE;
while(!fDone)
{
if (SOCKET_ERROR != WSALookupServiceNext(hHandle, dwFlags, &dwBufLen, pQs))
{
char szText[64] = {0};
DWORD dwSize = 64;
WSAAddressToString(
pQs->lpcsaBuffer->RemoteAddr.lpSockaddr,
sizeof(SOCKADDR_BTH),
NULL,
szText,
&dwSize
);
szText[dwSize] = 0;
CString s;
strcat(szText, "--");
strcat(szText, pQs->lpszServiceInstanceName);
SetWindowText(szText);
}
else
{
switch(WSAGetLastError())
{
case WSAEFAULT:
delete pQs;
pQs = NULL;
pQs = new WSAQUERYSET;
ZeroMemory(pQs, sizeof(WSAQUERYSET));
pQs->dwSize = sizeof(WSAQUERYSET);
pQs->dwNameSpace = NS_BTH;
break;
default :
fDone = TRUE;
break;
}
}
}
WSALookupServiceEnd(hHandle);
if (pQs)
{
delete pQs; //释放结构体时报Unhandled exception
}
}代码是模仿Bluetooth Essentials for Programmers这本书上的
通过下断点,发现已经能找到我的Mobile手机
但是为什么在最后释放pQs的时候会报错呢?
不知道各位大大是否也遇到过类似问题
还请各位大大指点指点~~
对于pQs的delete,上面的代码中只出现三次
第一次delete后就返回
第二次delete后有pQs = NULL;
所以我也很奇怪为什么会这样
如果把第三次delete屏蔽掉
程序不报错,但是我再次点击按钮后居然出现Out of memory消息框
郁闷ing~~
所以导致释放的时候出错
现在换另外一种方法解决这个问题了,代码如下:BYTE *pStrck = new BYTE[1024 * 10];
WSAQUERYSET* pQs = (WSAQUERYSET*)pStrck;这样只需delete pStrck就可以了
并且重复扫描工作也没有出现Out of memory消息框
非常感谢VisualEleven的回答