c++ - 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 安全?
解决方案
https://docs.microsoft.com/en-us/cpp/build/common-visual-cpp-64-bit-migration-issues?view=vs-2019
- 引用指针时使用 DWORD_PTR 和 LONG_PTR 而不是 long、int 等(大多数 Windows 句柄都是指针)
- 当应用程序不使用 LARGEADDRESSAWARE ( https://docs.microsoft.com/en-us/cpp/build/reference/largeaddressaware-handle-large-addresses?view=vs-2019 ) 链接器选项时,所有指针都受到限制到较低的 4GB,因此截断不会造成伤害。这是为了节省您修复所有警告的时间。
更多迁移提示:https ://docs.microsoft.com/en-us/windows/desktop/WinProg64/migration-tips
推荐阅读
- openshift - 在预先存在的虚拟机上安装 Openshift 4.1
- kubernetes - 在 kubernetes kubeconfig yaml 文件中渲染 env-var
- swift - 如何获得两个锚点之间的距离?
- python - Django:具有 DESC 顺序索引的唯一约束
- python - Python代码不执行主函数和后续函数调用
- svg - Flutter 在 CustomPaint (Canvas) 中绘制 SVG
- android - 查看到图像(更高分辨率)
- xlsx - 使单元格中的 x 等于 8 和总计
- point-cloud-library - PCL 对应分组识别转换详细信息
- transactions - 仅 SELECT 上的 Redshift 可序列化违规错误