gpt4 book ai didi

c - 从不兼容的指针类型解析 CreateFileA 的参数 1(尝试从文件内容创建哈希)

转载 作者:行者123 更新时间:2023-11-30 15:03:40 34 4
gpt4 key购买 nike

我正在尝试了解一个免费示例,可用于从文件内容创建 md5 哈希值。

但是我收到警告“从不兼容的指针类型传递 CreateFileA 的参数 1。您知道可能出现什么问题吗?

也许是filename.txt所在的位置,我在桌面上有它。你知道这是否是问题所在吗?如果是,如何检查代码操作系统正在查找的当前目录以检查这是否是问题

#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[] = "0123456789abcdef";
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;
}

最佳答案

CreateFile 是一个宏,别名为 CreateFileA(单字节)或 CreateFileW(多字节)版本。显然您正在使用单字节字符类型进行编译,但您为其提供了一个宽字符串作为文件名。

解决这个问题的一种方法是:

LPCSTR filename = "filename.txt";

或者使用宽字符版本CreateFileW。这可能是更好的选择,因为 Windows 文件系统处理 unicode 文件名的方式很不幸。

或者您甚至可以让 Microsoft 参与整个灾难性的“T”角色设计:

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

恶心。

关于c - 从不兼容的指针类型解析 CreateFileA 的参数 1(尝试从文件内容创建哈希),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40644848/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com