szTif="c:\\aaaa\aaaaaaaa\aa\a.tif";
以下为源代码的一段的一部分,在执行完sprintf以后,hTif值自动变化,导致错误。如果我改变路径以后,别处的sprintf语句执行完后,相应句柄值也发生变化导致错误。 求教各位高手指点, hTif = CreateFileA(szTif,
                          GENERIC_WRITE,
                          FILE_SHARE_READ,
                          NULL,
                          CREATE_ALWAYS,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL);
        }
        
        if(hTif == INVALID_HANDLE_VALUE)
        {
          sprintf(buf,"Create File (%s)Failed. %d",szTif,GetLastError());
          writelog( buf );
          return 0 ;
        }
        
        sprintf(buf,"Create File(%s) Succeed. %d",szTif,GetLastError());
        writelog( buf );
          
        init_stream_data(&sdata);        i=sr_create_tiff_header(hTif);void writelog(char *buf)
{
log = fopen("c:\\pt.log","a+");
if(log==NULL)
{
return;
} fprintf( log, "%s\n", buf );
fclose( log );
return;
}

解决方案 »

  1.   

    buf 和 hTif 在相邻的地方定义。 buf 不够大,sprintf 导致堆栈溢出,覆写了hTif。
      

  2.   

    everandforever的说法正确,这是无意中导致的缓冲区溢出。
      

  3.   

    HANDLE hTif;
            HGLOBAL hMem = NULL;
            DWORD dwSize = 0, cbRead = 0;
            unsigned char *TTMxBuffer = NULL;
            char buf[32];
    多谢everandforever兄的提示,以上是我在文件中buf的定义.的确应该是缓冲区太小的缘故,麻烦能不能把这些变量在内存中的位置讲得更详细些,在程序的下半段出现过hMem变化的情况。
      

  4.   

    变量在内存中的位置与编译器相关,不同的编译器有细微差别。如果想看到具体位置建议用内核级调试工具查看,例如SOFTICE、WinDBG等,VC等应用级调试器比较麻烦一些。sprintf是不检查缓冲区溢出的,它内部实现只是简单拷贝。
      

  5.   

    The File path should like this : c:\\aaaa\(\)aaaaaaaa\(\)aa\(\)a.tif " Use Dobule \
      

  6.   

    这是打印机驱动程序上的,不知如何用softice进行调试,所以靠打印日志来找错误,实在是太麻烦了。效果也不是很好
      

  7.   

    sprintf(buf,"Create File (%s)Failed. %d",szTif,GetLastError());
    writelog( buf );把buf开的足够大。另外可以用 fprintf 的。
      

  8.   

    softice自己有帮助手册,可以看看。一般步骤是先用它的symbol loader把你的打印机驱动装入,然后再用softice设置断点,即可查看变量了,就当作一个字符界面的调试器来看吧。
    另外,你的日志不要写到文件中,驱动里面直接调用DbgPrint,应用层调用OutDebugString即可,然后到www.sysinternals.com去下载Dbgview工具看日志输出。
      

  9.   

    多谢ultralzl(自然)的提醒,用OutDebugString输出日志的确方便了许多,