解决exe和DLL直接传递FILE 指针崩溃的问题
2017-02-15 18:24
661 查看
EXE程序和DLL之间可能传递FILE指针,但是可能会造成程序崩溃。这是由于_lock_file引起的
[cpp] view plain copy print?void __cdecl _lock_file (
FILE *pf
)
{
/*
* The way the FILE (pointed to by pf) is locked depends on whether
* it is part of _iob[] or not
*/
if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) )
{
/*
* FILE lies in _iob[] so the lock lies in _locktable[].
*/
_lock( _STREAM_LOCKS + (int)(pf - _iob) );
/* We set _IOLOCKED to indicate we locked the stream */
pf->_flag |= _IOLOCKED;
}
else
/*
* Not part of _iob[]. Therefore, *pf is a _FILEX and the
* lock field of the struct is an initialized critical
* section.
*/
EnterCriticalSection( &(((_FILEX *)pf)->lock) );
}
if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) ) 把fp和一个全局变量_iob比较,exe和DLL可能会有不同的全局变量,这导致fp不在_iob数组的范围内,导致出现错误。
解决的颁发是exe和DLL都动态连接到CRT,或者把DLL编译成静态库。
转自:http://blog.csdn.net/leechiyang/article/details/6873952
[cpp] view plain copy print?void __cdecl _lock_file (
FILE *pf
)
{
/*
* The way the FILE (pointed to by pf) is locked depends on whether
* it is part of _iob[] or not
*/
if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) )
{
/*
* FILE lies in _iob[] so the lock lies in _locktable[].
*/
_lock( _STREAM_LOCKS + (int)(pf - _iob) );
/* We set _IOLOCKED to indicate we locked the stream */
pf->_flag |= _IOLOCKED;
}
else
/*
* Not part of _iob[]. Therefore, *pf is a _FILEX and the
* lock field of the struct is an initialized critical
* section.
*/
EnterCriticalSection( &(((_FILEX *)pf)->lock) );
}
if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) ) 把fp和一个全局变量_iob比较,exe和DLL可能会有不同的全局变量,这导致fp不在_iob数组的范围内,导致出现错误。
解决的颁发是exe和DLL都动态连接到CRT,或者把DLL编译成静态库。
转自:http://blog.csdn.net/leechiyang/article/details/6873952
相关文章推荐
- 解决exe和DLL直接传递FILE 指针崩溃的问题。
- 在DLL间或者DLL与EXE之间传递vector对象或指针的问题
- QT信号槽的六个优点(虽然直接调用函数也可解决问题,但要在具体的函数中传递指针,多对一和解除关系也够麻烦的)
- 在DLL间或者DLL与EXE之间传递vector对象或指针的问题
- 在DLL与EXE之间传递STL容器对象的问题总结
- (转)FILE指针传递给DLL为何无法正确操作--隐式重复定义的陷阱
- Android 6.0系统中图片剪切空指针崩溃问题解决纪录
- 类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们的问题的解决方法 续集
- pb9.0 编绎成DLL类型时,提示"Error opening file 'c:/windows/system32/cgen/ent32.h" 问题的解决方法
- 解决Unity的 The file 'MemoryStream' is corrupted! Remove it and launch 崩溃问题
- VS2008资源视图打不开,编译提示 error PRJ0003 : 生成“mt.exe”出错rc.dll,rcdll.dll,mt.dll等问题的解决方法
- win10 9879补丁安装失败无法解决Explorer.exe频繁崩溃问题
- 【转】C++编程中用指针直接调用类成员函数问题及其解决方法
- 类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们的问题的解决方法
- 多个DLL(exe)之间通过指针或者引用传递STL对象
- 在EXE程序中调用DLL文件后出现_CrtIsValidHeapPointer(pUserData)问题的解决方法
- 关于ACE.DLL : fatal error LNK1136: invalid or corrupt file问题的解决
- 用C#调用C++DLL时的字符串指针参数传递问题
- 微信平台中get传递跳转链接-get值为网址-出现not find file等问题解决方法。
- 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法