2016-11-17 4 views
0

ファイルコンテンツからmd5ハッシュを作成するための無料の例を理解しようとしています。CreateFileAの引数1を互換性のないポインタ型から構文解析します(ファイルコンテンツからハッシュを作成しようとしています)

しかし、イムは、互換性のないポインタ型からCreateFileAの引数1を渡し警告」を取得。あなたが問題になることができるか知っていますか?

はたぶんファイル名.txtがある場所で、私はデスクトップでそれを持っていますそれが問題になることができますか?また、コードのOSが、これは

#include <stdio.h> 
#include <windows.h> 
#include <Wincrypt.h> 

#define BUFSIZE 1024 
#define MD5LEN 16 

DWORD main() 
{ 
    DWORD dwStatus = 0; 
    BOOL bResult = FALSE; 
    HCRYPTPROV hProv = 0; 
    HCRYPTHASH hHash = 0; 
    HANDLE hFile = NULL; 
    BYTE rgbFile[BUFSIZE]; 
    DWORD cbRead = 0; 
    BYTE rgbHash[MD5LEN]; 
    DWORD cbHash = 0; 
    CHAR rgbDigits[] = "abcdef"; 
    LPCWSTR filename=L"filename.txt"; 
    // Logic to check usage goes here. 

    hFile = CreateFile(filename, 
     GENERIC_READ, 
     FILE_SHARE_READ, 
     NULL, 
     OPEN_EXISTING, 
     FILE_FLAG_SEQUENTIAL_SCAN, 
     NULL); 

    if (INVALID_HANDLE_VALUE == hFile) 
    { 
     dwStatus = GetLastError(); 
     printf("Error opening file %s\nError: %d\n", filename, 
      dwStatus); 
     return dwStatus; 
    } 

    // Get handle to the crypto provider 
    if (!CryptAcquireContext(&hProv, 
     NULL, 
     NULL, 
     PROV_RSA_FULL, 
     CRYPT_VERIFYCONTEXT)) 
    { 
     dwStatus = GetLastError(); 
     printf("CryptAcquireContext failed: %d\n", dwStatus); 
     CloseHandle(hFile); 
     return dwStatus; 
    } 

    if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) 
    { 
     dwStatus = GetLastError(); 
     printf("CryptAcquireContext failed: %d\n", dwStatus); 
     CloseHandle(hFile); 
     CryptReleaseContext(hProv, 0); 
     return dwStatus; 
    } 

    while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, 
     &cbRead, NULL)) 
    { 
     if (0 == cbRead) 
     { 
      break; 
     } 

     if (!CryptHashData(hHash, rgbFile, cbRead, 0)) 
     { 
      dwStatus = GetLastError(); 
      printf("CryptHashData failed: %d\n", dwStatus); 
      CryptReleaseContext(hProv, 0); 
      CryptDestroyHash(hHash); 
      CloseHandle(hFile); 
      return dwStatus; 
     } 
    } 

    if (!bResult) 
    { 
     dwStatus = GetLastError(); 
     printf("ReadFile failed: %d\n", dwStatus); 
     CryptReleaseContext(hProv, 0); 
     CryptDestroyHash(hHash); 
     CloseHandle(hFile); 
     return dwStatus; 
    } 

    cbHash = MD5LEN; 
    if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) 
    { 
     DWORD i; 
     printf("MD5 hash of file %s is: ", filename); 
     for (i = 0; i < cbHash; i++) 
     { 
      printf("%c%c", rgbDigits[rgbHash[i] >> 4], 
       rgbDigits[rgbHash[i] & 0xf]); 
     } 
     printf("\n"); 
    } 
    else 
    { 
     dwStatus = GetLastError(); 
     printf("CryptGetHashParam failed: %d\n", dwStatus); 
    } 

    CryptDestroyHash(hHash); 
    CryptReleaseContext(hProv, 0); 
    CloseHandle(hFile); 

    return dwStatus; 
} 

答えて

1

CreateFile問題であるかどうかを確認するために探していることはCreateFileAのいずれかに別名マクロであることを、現在のディレクトリをチェックするには、yesであれば、どの場合。あなたは知っていますか(1バイト)またはCreateFileW(マルチバイト)のバージョンです。シングルバイト文字タイプの場合、ファイル名としてワイド文字列を指定しています。それを修正するために

一つの方法は次のとおりです。

LPCSTR filename = "filename.txt"; 

またはワイド文字バージョンCreateFileWを使用しています。これは、Windowsファイルシステムがユニコードのファイル名を処理するという不幸な方法のために望ましいかもしれません。

それともあなたも全体の悲惨な「T」キャラクターデザインをマイクロソフトに従事することができます

LPCTSTR filename = _T("filename.txt"); 

ウエッ。

+0

あなたの答えをありがとう。今私は何もエラーが発生していませんが、私はメッセージを取得しています "ファイルfiename.txtを開くエラー:2プロセスは2を返しました(0x2)"。コードがファイルを探している現在のパスを確認する方法を知っていますか? – Ozzy

関連する問題