最近做了一个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, 为什么会改变了一切?? 到底改变了什么??
请各位大侠指点!!!!!!
{
// 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, 为什么会改变了一切?? 到底改变了什么??
请各位大侠指点!!!!!!
其次,对应的函数中增加一些log,看具体死在哪一行代码
3。在VC6 中, ATL控件项目中设置 Executable for debug session 使用新建的C# 项目exe debug, 调试, 呵呵, 居然又通过了, 调用DestroyTTYInfo()也未出现卡死情况。
*/
发现, 这里是因为,VC调试使用了Debug版本, 进一步发现, Debug版本的dll没问题, ReleaseMinsize版本的Dll会在 DestroyTTYInfo()卡死。
DLL在Debug下能正常运行,Release下不行的缘故。
是否因为有内存的操作越界原因导致?
最近又做了些调试, 发现Debug版本, 和ReleaseMindependency 版本都可以用。
当时他们说可能跟编译器有关。
最近又做了改动。 在结束的时候加了点处理。
以前是:
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);
}
感觉要流畅些,