64位Windows API编程类型转换问题

问题描述 投票:0回答:1

(对不起,我的英语不好。)我对64位C编程有2个问题。

我的代码运行良好,但今天出现错误(没有编译器或代码分析)。及其随机。例如,有时代码有效,有时则无效。当我在WinDbg中打开可执行文件时,我的代码总是出错。我认为它是64位类型转换问题。

代码示例:

DWORD hash_string_len = 0;
hash_string_len = (DWORD)strlen(hash_string); //hash_string is 32 character hash (A998B0FE08AB295072965B5A4B0C835E)
if (hash_string_len != (DWORD)(MD5_DIGEST_LENGTH * 2)) //MD5_DIGEST_LENGTH (#define MD5_DIGEST_LENGTH 16)
{
   debug_this(); //printf("%d\n",__LINE__)
   HeapFree(GetProcessHeap(), 0, ENGINE_HASHLIST_MD5_ENTRY);
   return FALSE;
}

没有WinDbg代码不会打印错误(通过debug_this()),但是在WinDbg代码内部打印行号(原因是hash_string_len!= 32),但是我知道hash_string_len = 32,所以我认为它是64位的截断问题。有人可以帮我吗?

我的第二个问题是:

它能给我64位编程错误吗?

DWORD a = 0;

some_func(&a);


some_func(PDWORD pA)
{
 *pA = 1;
}

因为我在项目中使用了很多这样的代码。这样。

LZMA库

SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);

我这样称呼此函数。

DWORD destLen = 0;
PBYTE dest = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(SIZE_T)1024);
LzmaDec_DecodeToBuf(...,dest,&destLen,...)

所以我在64位编程中确实遇到功能问题。感谢您的阅读

c visual-studio winapi 64-bit
1个回答
0
投票

假设SizeTSIZE_T

我这样称呼此函数。

DWORD destLen = 0;
PBYTE dest = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(SIZE_T)1024);
LzmaDec_DecodeToBuf(...,dest,&destLen,...)

将DWORD的地址(在32位窗口以及64位窗口上传递32位宽)传递到SIZE_T的地址(在64位窗口上为64位宽度,在32位窗口上为32位宽度)位窗口)是坏的。

DWORD投射到SIZE_T 在获取其地址之前像这样:

LzmaDec_DecodeToBuf(..., dest, &((SIZE_T) destLen), ...)

有关在Windows上使用VC将代码从32位迁移到64位的更多问题,请点击https://docs.microsoft.com/en-us/cpp/build/common-visual-cpp-64-bit-migration-issues?view=vs-2019

© www.soinside.com 2019 - 2024. All rights reserved.