代码:
C/C++ code
//CEmuDevice继承自CCyUSBDevice,该类由CyUSB.lib导出
LRESULT CEmuDevice::SendCommand(COMMAND nCommand, WPARAM wParam/* =0 */, LPARAM lParam/* =0 */)
{
ASSERT(IsOpen());
WaitWorkerThreadExit();
PWORKITEM pWorkItem = new WORKITEM;
pWorkItem->wParam = wParam;
pWorkItem->lParam = lParam;
pWorkItem->pDevice = this;
switch(nCommand)
{
case CONFIG_EMULATOR:
{
LPCTSTR lpszConfigFile = (LPCTSTR)wParam;
LPTSTR lpszPathName = new TCHAR[_tcslen(lpszConfigFile)+1];
ZeroMemory(lpszPathName, (_tcslen(lpszConfigFile)+1)*sizeof(TCHAR));
_tcscpy_s(lpszPathName, (_tcslen(lpszConfigFile)+1)*sizeof(TCHAR), lpszConfigFile);
pWorkItem->wParam = (WPARAM)lpszPathName;
pWorkItem->uCmd = CONFIG_EMULATOR;
break;
}
……
}
if(pWorkItem != NULL)
{
if(m_hWorkerThread == NULL)
{
m_hWorkerThread = ::CreateThread(NULL, 0, CommandDispatchWorker, (LPVOID)pWorkItem, 0, &m_dwThreadID);//参数传入
if(m_hWorkerThread == NULL)
{
TRACE0("Create command dispatch worker thread failed.\n");
return 0;
}
}
}
//线程函数
DWORD WINAPI CEmuDevice::CommandDispatchWorker(LPVOID lpParameter)
{
ASSERT(lpParameter != NULL);
WORKITEM* pWorkItem = (WORKITEM*)lpParameter;
CEmuDevice* pDevice = pWorkItem->pDevice;
WPARAM wParam = pWorkItem->wParam;
LPARAM lParam = pWorkItem->lParam;
ASSERT(pDevice != NULL);
ASSERT(pDevice->m_hNeedStop != NULL);
if(!pDevice->IsOpen())
{
return 1;
}
switch(pWorkItem->uCmd)
{
/* Board level commands */
case CONFIG_EMULATOR:
{
LPTSTR lpszConfigFile = (LPTSTR)wParam;
pDevice->ConfigEmulator(lpszConfigFile);
delete[] lpszConfigFile; //<------------异常
break;
}
……
}
delete[] pWorkItem;
return 0;
} |