我封装了一个dll,在这个dll中不断读取数据,然后把数据发送给主程序。问题是,有时候dll中数据已经发送出去了,但在OnCopyData中没收数据。读取数据:UINT ReadDataProc( LPVOID param )
{
COPYDATASTRUCT cds;
char cCompletedCmd[100] = "";
ULONG ulReadLen = 0; // Data read actually
ULONG ulReadBytes = 0;
int nPos = 0;

while( g_bIsDeviceOpen )
{
EnterCriticalSection( &g_cs );

memset( g_cRecvBuffer, 0, g_ulLength );
ulReadLen = g_ulLength;
CH341ReadData( g_m_Index, &g_cRecvBuffer[ulReadBytes], &ulReadLen );
g_sRecvBuffer += g_cRecvBuffer;

LeaveCriticalSection( &g_cs );

while( ( nPos = g_sRecvBuffer.find( 10 ) ) != -1 )
{
strcpy( cCompletedCmd, g_sRecvBuffer.substr( 0, nPos + 1 ).c_str() );
g_sRecvBuffer = g_sRecvBuffer.substr( nPos + 1, g_sRecvBuffer.length() - nPos);

cds.dwData = sizeof( COPYDATASTRUCT );
cds.cbData = strlen( g_cRecvBuffer );
cds.lpData = cCompletedCmd;
SendMessage( g_hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds );
}
Sleep( g_unInterval );
}
return 0;
}
接受数据:BOOL CUSBMFCDEMODlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
// TODO: Add your message handler code here and/or call default char Buffer[100] = "";
CString strBuffer = "";
int nPos = 0;
strncpy( Buffer, (char*)pCopyDataStruct->lpData, pCopyDataStruct->cbData );
Buffer[pCopyDataStruct->cbData] = '\0';
strBuffer = Buffer;
nPos = strBuffer.Find( 13, 0 );
strBuffer = strBuffer.Left( nPos );
if( strBuffer.GetLength() )
m_LstRecv.AddString( ( LPCSTR )strBuffer ); return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
不知什么原因,接受端有时候会出现收不到数据的情况。ReadDataProc()函数在OnTimer中调用,50ms调用一次。

解决方案 »

  1.   

    你的发送部分是不是有问题啊?发送的参数不对吧?
    除了目标的句柄,还需要本地的句柄。其它参数也看一下,记得如果有参数类型或值不对,是接受不到的
    我以前做过一个,你比较下:
    发送:
    void CMyQQDlg::SendMsgToQD(CString str)
    {
    CWnd *wnd=FindWindow("QingDaoAssignedClass",NULL);//目标窗口句柄
    if(wnd)
    { COPYDATASTRUCT   cpd; 
    memset(&cpd,0,sizeof(cpd));   
    cpd.dwData   =   1; //该值为类型定义
    cpd.cbData   =   str.GetLength()+1;   
    cpd.lpData   =   (void *)str.GetBuffer(cpd.cbData);
    wnd->SendMessage(WM_COPYDATA,(WPARAM)(HWND)AfxGetMainWnd()->m_hWnd,(LPARAM)(LPVOID)&cpd);   
    str.ReleaseBuffer();
    }}