在命令行上将HRESULT作为字符串传递

时间:2010-10-28 20:39:32

标签: c++ windows hresult

我需要将HRESULT值作为命令行参数传递给程序。我打算通过传递十六进制值来实现,例如:

>receiver.exe 0x80048836

我正在尝试使用wcstol将此字符串表示形式转换回HRESULT,例如:

HRESULT hr = wcstol(argv[2], NULL, 16);

但是,原始HRESULT的值通常大于LONG_MAX,因此在hr上方的行中最终为0x7fffffff

所以,有两个问题:

  1. 我认为HRESULTS只是32位整数?所以我不确定我是如何获得大于LONG_MAX的HRESULT。它似乎在原始程序中工作正常(即HRESULT不会溢出)。

  2. 有没有办法解决LONG_MAX wcstol的限制?也许该函数的另一个版本与HRESULT实际上的任何大小整数相匹配?

  3. 谢谢!

2 个答案:

答案 0 :(得分:3)

结帐wcstoulhttp://msdn.microsoft.com/en-us/library/5k9xb7x1(v=VS.80).aspx HRESULT确实适合32位,但是你给它的例子使用最高有效位,它被认为是有符号整数的符号位。使用wcstoul会使其符合无符号长整数。

LONG_MAX0x7FFFFFFF,最高可以容纳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(无符号长整数)。这可能是一个问题,具体取决于您使用该数据的方式。