• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 101,  comments - 57,  trackbacks - 0
            http://www.codeguru.com/forum/showthread.php?t=431298

            This problem arises when A 64-bit pointer was truncated to a 32-bit int or 32-bit long.

            This warning is only issued when /Wp64 is used.

            From MSDN

            Quote:

            Error Message
            'variable' : pointer truncation from 'type' to 'type'

            This warning detects 64-bit portability issues. For example, if code is compiled on a 64-bit platform, the value of a pointer (64 bits) will be truncated if it is assigned to an int (32 bits).


            See /Wp64

            Quote:

            Detects 64-bit portability problems on types that are also marked with the __w64 keyword.
            /Wp64

            /Wp64 is off by default in the Visual C++ 32-bit compiler and on by default in the Visual C++ 64-bit compiler.

            Variables of the following types are tested on a 32-bit operating system as if they were being used on a 64-bit operating system:
            • int
            • long
            • pointer
            If you regularly compile your application with a 64-bit compiler, you may want to disable /Wp64 in your 32-bit compilations, as the 64-bit compiler will detect all issues. For more information about targeting a Windows 64-bit operating system, see 64-Bit Programming with Visual C++.

            To set this compiler option in the Visual Studio development environment
            1. Open the project's Property Pages dialog box. For details, see How to: Open Project Property Pages.
            2. Click the C/C++ folder.
            3. Click the General property page.
            4. Modify the Detect 64-bit Portability Issues property.
            To set this compiler option programmatically
            • use Detect64BitPortabilityProblems.

            Also, Have a look Rules for Using Pointers.


            Quote:
            Rules for Using Pointers

            Porting your code to compile for both 32- and 64-bit Microsoft® Windows® is straightforward. You need only follow a few simple rules about casting pointers, and use the new data types in your code. The rules for pointer manipulation are as follows.

            1. Do not cast pointers to int, long, ULONG, or DWORD. If you must cast a pointer to test some bits, set or clear bits, or otherwise manipulate its contents, use the UINT_PTR or INT_PTR type. These types are integral types that scale to the size of a pointer for both 32- and 64-bit Windows (for example, ULONG for 32-bit Windows and _int64 for 64-bit Windows). For example, assume you are porting the following code:



              ImageBase = (PVOID)((ULONG)ImageBase | 1);

              As a part of the porting process, you would change the code as follows:



              ImageBase = (PVOID)((ULONG_PTR)ImageBase | 1);

              Use UINT_PTR and INT_PTR where appropriate (and if you are uncertain whether they are required, there is no harm in using them just in case). Do not cast your pointers to the types ULONG, LONG, INT, UINT, or DWORD.



              Note that HANDLE is defined as a void*, so typecasting a HANDLE value to a ULONG value to test, set, or clear the low-order 2 bits is an error on 64-bit Windows.
            2. Use the PtrToLong or PtrToUlong function to truncate pointers. If you must truncate a pointer to a 32-bit value, use the PtrToLong or PtrToUlong function (defined in Basetsd.h). These functions disable the pointer truncation warning for the duration of the call.



              Use these functions carefully. After you convert a pointer variable using one of these functions, never use it as a pointer again. These functions truncate the upper 32 bits of an address, which are usually needed to access the memory originally referenced by pointer. Using these functions without careful consideration will result in fragile code.
            3. Be careful using OUT parameters. For example, suppose you have a function defined as follows:

              void func( OUT PULONG *PointerToUlong );

              Do not call this function as follows:


              ULONG ul;

              PULONG lp;

              func((PULONG *)&ul);

              lp = (PULONG)ul;

              Instead, use the following call:



              PULONG lp;

              func(&lp);

              Typecasting &ul to PULONG* prevents a compiler error, but the function will write a 64-bit pointer value into the memory at &ul. This code works on 32-bit Windows, but will cause data corruption on 64-bit Windows—and it will be subtle, hard-to-find corruption. The bottom line: Do not play tricks with the C code—straightforward and simple is better.
            4. Be careful with polymorphic interfaces. Do not create functions that accept DWORD parameters for polymorphic data. If the data can be a pointer or an integral value, use the UINT_PTR or PVOID type.



              For example, do not create a function that accepts an array of exception parameters typed as DWORD values. The array should be an array of DWORD_PTR values. Therefore, the array elements can hold addresses or 32-bit integral values. (The general rule is that if the original type is DWORD and it needs to be pointer width, convert it to a DWORD_PTR value. That is why there are corresponding pointer-precision types.) If you have code that uses DWORD, ULONG, or other 32-bit types in a polymorphic way (that is, you really want the parameter or structure member to hold an address), use UINT_PTR in place of the current type.
            5. Use the new window class functions. If you have window or class private data that contains pointers, your code will need to use the following new functions:
              • GetClassLongPtr
              • GetWindowLongPtr
              • SetClassLongPtr
              • SetWindowLongPtr
              These functions can be used on both 32- and 64-bit Windows, but they are required on 64-bit Windows. Prepare for the transition by using these functions now.

              Additionally, you must access pointers or handles in class private data using the new functions on 64-bit Windows. To aid you in finding these cases, the following indexes are not defined in Winuser.h during a 64-bit compile:

              • GWL_WNDPROC
              • GWL_HINSTANCE
              • GWL_HWDPARENT
              • GWL_USERDATA
              Instead, Winuser.h defines the following new indexes:

              • GWLP_WNDPROC
              • GWLP_HINSTANCE
              • GWLP_HWNDPARENT
              • GWLP_USERDATA
              • GWLP_ID
              For example, the following code does not compile:

              SetWindowLong(hWnd, GWL_WNDPROC, (LONG)MyWndProc);
              It should be changed as follows:

              SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)MyWndProc);
              When setting the cbWndExtra member of the WNDCLASS structure, be sure to reserve enough space for pointers. For example, if you are currently reserving sizeof(DWORD) bytes for a pointer value, reserve sizeof(DWORD_PTR) bytes.
            6. Access all window and class data using FIELD_OFFSET. It is common to access window data using hard-coded offsets. This technique is not portable to 64-bit Windows. To make your code portable, access your window and class data using the FIELD_OFFSET macro. Do not assume that the second pointer has an offset of 4.
            7. The LPARAM, WPARAM, and LRESULT types change size with the platform. When compiling 64-bit code, these types expand to 64 bits, because they typically hold pointers or integral types. Do not mix these values with DWORD, ULONG, UINT, INT, int, or long values. Examine how you use these types and ensure that you do not inadvertently truncate values.
            posted on 2010-07-07 16:28 margin 閱讀(2208) 評論(2)  編輯 收藏 引用

            FeedBack:
            # re: vs2005把默認使用64編譯器,所以指針是64位的。
            2010-07-08 12:51 | 陳梓瀚(vczh)
            這只是compatible,用警告告訴你“如果換成64位就會有這些錯誤”而已。默認還是32的。  回復(fù)  更多評論
              
            # re: vs2005把默認使用64編譯器,所以指針是64位的。
            2010-07-14 11:12 | margin
            @陳梓瀚(vczh)
            多謝指出...  回復(fù)  更多評論
              
            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            收藏夾

            常去的壇子

            • CVC電腦病毒論壇
            • 很多人說我是AV,我告訴他們:別瞧不起人,我們也能創(chuàng)造價值
            • 安全焦點
            • 黑客聚集的地方,一般是好酒最多的地方...
            • 看雪論壇
            • 國內(nèi)最強的加密解密論壇,成醉其中經(jīng)常夜不歸宿
            • 驅(qū)動開發(fā)論壇
            • 厭倦了啤的朋友們,來我們來整點白的...痛痛快快的BSOD也好過隔鞋瘙癢!

            我的朋友

            • Sen的blog
            • IDE方面資深的受害者...經(jīng)常為一個變量的定義找不著北的痛苦程序員(深表同情)
            • 老羅的blog
            • 良師益友,千年水牛,引擎猛男,分析怪獸,墨鏡酷哥,臺球高手....

            搜索

            •  

            最新評論

            亚洲综合日韩久久成人AV| 久久国产成人午夜aⅴ影院| 亚洲综合久久夜AV | 免费一级欧美大片久久网| 欧美亚洲国产精品久久| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 精品国际久久久久999波多野| 久久久久亚洲av无码专区喷水 | 精品无码久久久久国产动漫3d| 国産精品久久久久久久| 日韩亚洲国产综合久久久| 免费一级做a爰片久久毛片潮| 久久国产色av免费看| 久久久久久国产精品免费无码| 99久久精品国产麻豆| 久久免费小视频| 国产精品久久久久久久人人看| 麻豆一区二区99久久久久| 国产∨亚洲V天堂无码久久久| 色婷婷久久久SWAG精品| 一本色道久久HEZYO无码| 丁香久久婷婷国产午夜视频| 97精品伊人久久久大香线蕉| 久久久精品视频免费观看| 99久久精品日本一区二区免费| 久久人人爽人人爽人人片av麻烦| 婷婷五月深深久久精品| 久久精品视频网| 久久亚洲sm情趣捆绑调教| 色综合久久综精品| 亚洲AV日韩精品久久久久久久| 国产巨作麻豆欧美亚洲综合久久| 亚洲第一极品精品无码久久| 99久久精品免费看国产一区二区三区 | 一本综合久久国产二区| 精品久久久久久久无码 | 伊人久久大香线蕉综合Av| 日本久久久精品中文字幕| 久久福利青草精品资源站| 性做久久久久久久久老女人| 国产精品久久午夜夜伦鲁鲁|