wcstombs_s(&CharactersConverted, file,FileName.GetLength()+1,FileName, _TRUNCATE);在unicode模式编译通过...但由于某种原因我没有用unicode模式...编译失败...请教各位大大要怎么修改

解决方案 »

  1.   


    int CalculateMD5(CString FileName, CString &MD5)
    {
        const size_t StringSize = FileName.GetLength() + 1;
        size_t CharactersConverted = 0;    char *file = new char[StringSize];
        //char file[1024];
    //file=FileName.GetBuffer(FileName.GetLength());    wcstombs_s(&CharactersConverted, file,FileName.GetLength()+1, FileName, _TRUNCATE);    int i, j;
        FILE *fInput;
        MD5Context md5Hash;
        unsigned char bBuffer[4096];
        unsigned char b;
        char c;
        
        if(!CryptStartup())
        {
            MessageBoxW(0, L"Could not start crypto library", 
                        L"MD5", MB_ICONERROR);
            return 0;
        }
        
        fInput = fopen(file, "rb");
        if(!fInput)
    {
           MessageBoxW(0, L"Failed to open - Invalid File", 
                       L"MD5", MB_ICONERROR);
            CryptCleanup();
            return 0;
        }
        
        memset(&md5Hash, 0, sizeof(MD5Context));
        MD5Init(&md5Hash);
        while(!feof(fInput)){
            unsigned int nCount = fread(bBuffer, sizeof(unsigned char), 
                                        4096, fInput);
            MD5Update(&md5Hash, bBuffer, nCount);
        }
        MD5Final(&md5Hash);
        
        fclose(fInput);
        //printf("\nChecksum of '%s' is: ", argv[1]);
        char *Value = new char[1024];int k = 0;
        for(i = 0; i < 16; i++)
    {
            b = md5Hash.digest[i];
            for(j = 4; j >= 0; j -= 4)
    {
                c = ((char)(b >> j) & 0x0F);
                if(c < 10) c += '0';
                else c = ('a' + (c - 10));
                //printf("%c", c);
    Value[k] = c;
    k++;
            }
        }
        Value[k] = '\0';
        CryptCleanup();

        //CString cString;
        MD5 = CString(Value);
        //MessageBox(cString);

        delete file;
        delete Value;
        return 1;
    }
    原始代码....我代码能力很差请直接帮忙改下可用的3Q
      

  2.   

    如果工程的字符集是多字节的,那就可以不用转换,直接用
    int CalculateMD5(CString FileName, CString &MD5)
    {
        const size_t StringSize = FileName.GetLength() + 1;
        size_t CharactersConverted = 0;    int i, j;
        FILE *fInput;
        MD5Context md5Hash;
        unsigned char bBuffer[4096];
        unsigned char b;
        char c;
        
        if(!CryptStartup())
        {
            MessageBoxW(0, L"Could not start crypto library", 
                        L"MD5", MB_ICONERROR);
            return 0;
        }
        
        fInput = fopen(FileName.GetBuffer(), "rb");
        if(!fInput)
        {
           MessageBoxW(0, L"Failed to open - Invalid File", 
                       L"MD5", MB_ICONERROR);
            CryptCleanup();
            return 0;
        }
        
        memset(&md5Hash, 0, sizeof(MD5Context));
        MD5Init(&md5Hash);
        while(!feof(fInput)){
            unsigned int nCount = fread(bBuffer, sizeof(unsigned char), 
                                        4096, fInput);
            MD5Update(&md5Hash, bBuffer, nCount);
        }
        MD5Final(&md5Hash);
        
        fclose(fInput);
        //printf("\nChecksum of '%s' is: ", argv[1]);
        char *Value = new char[1024];int k = 0;
        for(i = 0; i < 16; i++)
        {
            b = md5Hash.digest[i];
            for(j = 4; j >= 0; j -= 4)
            {
                c = ((char)(b >> j) & 0x0F);
                if(c < 10) c += '0';
                else c = ('a' + (c - 10));
                //printf("%c", c);
                Value[k] = c;
                k++;
            }
        }
        Value[k] = '\0';
        CryptCleanup();
        
        //CString cString;
        MD5 = CString(Value);
        //MessageBox(cString);
        
        delete Value;
        return 1;
    }
      

  3.   

    晕啊...为什么我这样不行file=FileName.GetBuffer(FileName.GetLength());
     fopen(FileName.GetBuffer()这样就行....晕晕晕..
    谢谢楼上的...