最近做了一个ATL控件, 封装了串口通讯和使用的通讯协议解析。 我用的VC++6 创建的控件。 写好后发给同事放到C#。net中使用,一直有点问题,  在别的机器上调用其中一个方法, 一点就卡死。 方法是用来关闭串口资源的。 代码如下,  [id(14), helpstring("method DestroyTTYInfo")] HRESULT DestroyTTYInfo();STDMETHODIMP CProtocol::DestroyTTYInfo()
{
// TODO: Add your implementation code here
if (NULL == npTTYInfo)// 
      return ( FALSE ) ;   // force connection closed (if not already closed)
   if (CONNECTED( npTTYInfo ))
      CloseConnection(  ) ;   // clean up event objects
   CloseHandle( READ_OS( npTTYInfo ).hEvent ) ;
   CloseHandle( WRITE_OS( npTTYInfo ).hEvent ) ;   CoTaskMemFree( npTTYInfo) ;    return S_OK;
}而在我的机器上一直用的很好, 不能理解是为什么。 
今天把系统重新装了, 重装了VC6 和 VS2005, 
1。把原来的ATL控件编译, 通过, 
2。使用C# 创建一个新项目,引用控件, 调用方法,编译调试。 在调用到 DestroyTTYInfo()的时候 出现卡死情况。 
3。在VC6 中, ATL控件项目中设置 Executable for debug session 使用新建的C# 项目exe  debug, 调试, 呵呵, 居然又通过了, 调用DestroyTTYInfo()也未出现卡死情况。 
4。再回到C#中调试刚才的项目, OK , 一切正常, DestroyTTYInfo也正常。 
5。再次用C#新建项目, 插入控件, 直接调试, 一切正常, DestroyTTYInfo也正常。我真是不明白, 在第3步, 使用VC 调用Exe 调试DLL, 为什么会改变了一切?? 到底改变了什么??
请各位大侠指点!!!!!!

解决方案 »

  1.   

    调试时,是否会修改什么你的配置等
    其次,对应的函数中增加一些log,看具体死在哪一行代码
      

  2.   

    /*
    3。在VC6 中, ATL控件项目中设置 Executable for debug session 使用新建的C# 项目exe debug, 调试, 呵呵, 居然又通过了, 调用DestroyTTYInfo()也未出现卡死情况。  
    */
    发现, 这里是因为,VC调试使用了Debug版本, 进一步发现, Debug版本的dll没问题, ReleaseMinsize版本的Dll会在 DestroyTTYInfo()卡死。 
      

  3.   

    那应该是DLL的问题,跟编译器无关。
    DLL在Debug下能正常运行,Release下不行的缘故。
    是否因为有内存的操作越界原因导致?
      

  4.   


    最近又做了些调试, 发现Debug版本, 和ReleaseMindependency 版本都可以用。
      

  5.   

    我之前在调用时进行调试,经常不知道在哪就卡死了。后来改用写log方法,才通过。
    当时他们说可能跟编译器有关。
      

  6.   

    我曾经遇到过结束线程的时候,因为串口处于等待数据状态(waitforsingleobject),所以结束的时候会一直等在那不知根楼主的有没有关系?
      

  7.   


     最近又做了改动。 在结束的时候加了点处理。 
    以前是:
    while(THREADID(npTTYInfo) != 0)
    {

    改为while(THREADID(npTTYInfo) != 0)
       {
       int m=324; 
          int n =698;
       m=m*n;
       wsprintf( szError, "\n>>>>>IN THE->while(THREADID(npTTYInfo) != 0);\n" ) ;   
           OutputDebugString(szError);
       }
    感觉要流畅些,