我需要将HRESULT值作为命令行参数传递给程序。我打算通过传递十六进制值来实现,例如:
>receiver.exe 0x80048836
我正在尝试使用wcstol
将此字符串表示形式转换回HRESULT,例如:
HRESULT hr = wcstol(argv[2], NULL, 16);
但是,原始HRESULT的值通常大于LONG_MAX
,因此在hr
上方的行中最终为0x7fffffff
。
所以,有两个问题:
我认为HRESULTS只是32位整数?所以我不确定我是如何获得大于LONG_MAX
的HRESULT。它似乎在原始程序中工作正常(即HRESULT不会溢出)。
有没有办法解决LONG_MAX
wcstol
的限制?也许该函数的另一个版本与HRESULT实际上的任何大小整数相匹配?
谢谢!
答案 0 :(得分:3)
结帐wcstoul
。 http://msdn.microsoft.com/en-us/library/5k9xb7x1(v=VS.80).aspx
HRESULT确实适合32位,但是你给它的例子使用最高有效位,它被认为是有符号整数的符号位。使用wcstoul
会使其符合无符号长整数。
LONG_MAX
是0x7FFFFFFF
,最高可以容纳31个最低有效位,最高位清零,但ULONG_MAX
上升到0xFFFFFFFF
,因为它是{{1}}无符号的。
答案 1 :(得分:0)
0x80048836大于系统的LONG_MAX(2147483647L),即(0x7FFFFFFF)。根据msdn“当表示会导致溢出时,在这种情况下它会返回LONG_MAX或LONG_MIN”
因此,在您的情况下,您会收到LONG_MAX作为结果。
实际函数返回类型声明为long wcstol(...)。 long不一定是32位大小,这取决于你的系统。
在这种情况下,返回类型是有符号的32位,因此适合32位的最大有符号整数是7FFFFFFF。
00000000到7FFFFFFF从0到LONG_MAX为正
FFFFFFFF到8000001从-1到LONG_MIN
顺便提一下,我认为“HRESULT hr = wcstol ...”会不正确,因为wcstol的返回类型是(签名)long,但HRESULT是ULONG(无符号长整数)。这可能是一个问题,具体取决于您使用该数据的方式。