我正在将代码从 32 位 vs2012 迁移到 64 位 vs2015。
我在程序中遇到了以下函数调用:
CryptHashData(hHash,
(BYTE*)AUTH_ENCRYPTION_KEY,
wcslen(AUTH_ENCRYPTION_KEY) * sizeof(wchar_t),
0u))
其声明位于 c:\Program Files (x86)\Windows Kits\8.0\Include\um\wincrypt.h
中的 wincrypt.h
中(看起来像不可编辑)。
声明是:
WINADVAPI
BOOL
WINAPI
CryptHashData(
_In_ HCRYPTHASH hHash,
_In_reads_bytes_(dwDataLen) CONST BYTE *pbData,
_In_ DWORD dwDataLen,
_In_ DWORD dwFlags
);
DWORD dwFlags: Problem here is
0u
is unsigned int and the function needs aDWORD
.
为了解决这个错误,我做了:
c-style
在函数call(tried size_t, unsigned int)
中转换为(DWORD)(0U)
static_cast
- 尝试创建一个新变量并对其进行强制转换
但警告仍然存在
看来我必须改变函数调用
有人可以建议我如何解决这个问题吗?
请询问是否需要更多详细信息。
最佳答案
您认为 0u 是问题所在。
对我来说,问题似乎应该出在第三个参数上,其中 size_t 值用于提供双字参数。
正如SomeProgrammerDude所解释的,在新环境中size_t可能是64位,而DWORD是32位。这解释了新平台上的不匹配。
在 32 位平台上,您没有收到警告(我猜),可能是因为 size_t 是 32 位,没有丢失信息的风险。
您报告说转换避免了警告,这表明 0u
不是问题所在。
事实上,警告似乎与 0u
一致,可能是由于编译器提示整个函数调用并指向它的结尾,即结束 )
,它恰好与 0u
在同一行。
将所有 )
移动到单独的行的实验(结果可见两个屏幕截图之间的差异)已经证实了这一点。
请注意,强制转换只是避免了警告,这与解决问题不同。
(您明智地询问了类型转换的安全性,我建议在单独的问题中这样做。)
关于c++ - 警告 C4267 'argument' : conversion from 'size_t' to 'DWORD' , 可能丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750207/