小弟最近突发奇想,想用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的时候会报错呢?
不知道各位大大是否也遇到过类似问题
还请各位大大指点指点~~

解决方案 »

  1.   

    可能你上面已经delete过了,所有最下面delete pQs就错了,建议,你delete pQs;以后,设置pQs = NULL;
      

  2.   

    To VisualEleven:
    对于pQs的delete,上面的代码中只出现三次
    第一次delete后就返回
    第二次delete后有pQs = NULL;
    所以我也很奇怪为什么会这样
    如果把第三次delete屏蔽掉
    程序不报错,但是我再次点击按钮后居然出现Out of memory消息框
    郁闷ing~~
      

  3.   

    小弟怀疑是WSALookupServiceBegin等函数中改变pQs的某个指针
    所以导致释放的时候出错
    现在换另外一种方法解决这个问题了,代码如下:BYTE *pStrck = new BYTE[1024 * 10];
    WSAQUERYSET* pQs = (WSAQUERYSET*)pStrck;这样只需delete pStrck就可以了
    并且重复扫描工作也没有出现Out of memory消息框
    非常感谢VisualEleven的回答