首页 > 解决方案 > x64 转换后的指针截断

问题描述

我是 C++ 新手,我正在尝试编译一个小型遗留类库,我一直将它用作 x64 的 x86。

现在编译器显示一些警告:

            IUnknown* _p;
            // warning C4311: 'type cast': pointer truncation from 'IUnknown *' to 'int'
            // warning C4302: 'type cast': truncation from 'IUnknown *' to 'int'
            virtual int GetHashCode() override
            {
                return (int)_p;
            }

            // 1> warning C4311: 'type cast': pointer truncation from 'void *' to 'long'
            // 1> warning C4302: 'type cast': truncation from 'void *' to 'long'
            void MyMethod(IntPtr hwnd, String^ str)
            {
                CComBSTR bstrValue = (BSTR)Marshal::StringToBSTR(str).ToPointer();
                HRESULT result = SomeClass()->SomeMethod((long)hwnd.ToPointer(), bstrValue);
            }

其中 SomeMethod 定义为

#ifdef _X86_
typedef long CUSTOMHWND;
#else
typedef LONGLONG CUSTOMHWND;
#endif

        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SomeMethod( 
            /* [in] */ CUSTOMHWND hwndOwner,
            /* [in] */ __RPC__in BSTR pValue) = 0;

如何更改代码以使其 x64 安全?

标签: c++visual-c++64-bit

解决方案


https://docs.microsoft.com/en-us/cpp/build/common-visual-cpp-64-bit-migration-issues?view=vs-2019

更多迁移提示:https ://docs.microsoft.com/en-us/windows/desktop/WinProg64/migration-tips


推荐阅读