none
64位环境下 用WriteFile() 的问题 !!! 怎样避免溢出 ??? RRS feed

  • 问题

  • 请教一下各位, 64位环境下, 以下代码的问题 !!!

    wchar_t szBuff[MAX_PATH];

     

    GetSystemDirectory(szBuff, MAX_PATH);

     

    HANDLE hFile = CreateFile( … …);

     

    DWORD dwByteToWrite;

     

    WriteFile(hFile, szBuff, wcslen(szBuff), &dwByteToWrite, NULL);

     ///   第三个参数的隐式转换可能造成溢出.

     

    ////////////////////////////////////////////////////////////////////////////////////////////////////

    _WIN64 环境下 wcslen() 返回的 size_t类型是 UINT64, WriteFile要求的 DWORD更大 !

    64位环境下有好的方法避免这个溢出么 ?  

               我想在64位环境下写Unicode数据到文件里.
    2011年12月16日 3:07

答案

  • 你这样写法是错误的,WriteFile参数是字节算的而不是wchar_t,一个wchat_t = 2字节。

    这和主机是多少位没太大关系,你该这样写 

    WriteFile(hFile, (LPBYTE)szBuff, wcslen(szBuff) * sizeof(wchar_t), ...)


    0xBAADF00D
    • 已标记为答案 Rob Pan 2011年12月21日 9:02
    2011年12月16日 10:10
    版主

全部回复

  • buffer只有MAX_PATH这么大,如果有缓冲区溢出也是在WriteFile之前。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年12月16日 3:59
    版主
  • 你这样写法是错误的,WriteFile参数是字节算的而不是wchar_t,一个wchat_t = 2字节。

    这和主机是多少位没太大关系,你该这样写 

    WriteFile(hFile, (LPBYTE)szBuff, wcslen(szBuff) * sizeof(wchar_t), ...)


    0xBAADF00D
    • 已标记为答案 Rob Pan 2011年12月21日 9:02
    2011年12月16日 10:10
    版主