2010-10-28 31 views
0

字符串我有此需要的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

退房wcstoulhttp://msdn.microsoft.com/en-us/library/5k9xb7x1(v=VS.80).aspx HRESULT確實適合32位,但是您給它的例子使用了最重要的位,這被認爲是符號整數的符號位。使用wcstoul將使它適合一個無符號長整數。

LONG_MAX0x7FFFFFFF,可適合在至少31位顯著,留下頂部位清零最高,但ULONG_MAX上升到0xFFFFFFFF因爲它是無符號。

0

0x80048836比LONG_MAX爲您的系統(2147483647L),這是(0x7FFFFFFF的)更大。根據MSDN「的時候,表示將導致溢出,在這種情況下,它返回LONG_MAX或LONG_MIN」你的情況,你會得到LONG_MAX返回你的結果

左右。

實際函數的返回類型聲明爲長wcstol(...)。長不一定是32位,這取決於你的系統。

在這種情況下,返回類型是有符號和32位,因此最大的有符號整數,將適合在32位是7FFFFFFF。
00000000 7FFFFFFF是積極從0到LONG_MAX FFFFFFFF到8000001爲負從-1到LONG_MIN

順便說一句,我相信「HRESULT HR = wcstol ......」是不正確的,因爲wcstol的返回類型(有符號)長,但HRESULT是ULONG(無符號長)。這可能是一個問題,取決於你如何使用這些數據。