簡體   English   中英

Windows開發:x86到x64的過渡

[英]Windows development: x86 to x64 transition

是否有任何指導如何盡可能少地轉移到x64?

假設,我有一個用C ++編寫的windows native x86可執行文件。 EXE本身工作正常,但也有由前兩個EXE和外部x64進程托管的DLL。 使用這樣的設置,我需要重寫哪些部分?

我希望得到更一般的答案,或者可能是參考文獻的鏈接,其中給出了一些理論背景。 謝謝

一般來說,我推薦的方法是對它進行單元測試。 構建測試,以便它們全部傳遞32位實現,然后開始構建和測試64位。 值得特別注意您執行以下任何操作的代碼的任何部分:

  • 通過網絡流式傳輸數據(特別是對於size_t這樣的類型,現在將是不同的大小。通過此代碼並將size_tlong更改為顯式32或64位typedef)
  • 將二進制數據加載/保存到文件(ditto re:size_t / long)
  • 使用硬編碼值(例如0xFFFFFFFF)進行比特操作

除了測試盡可能多的代碼路徑之外,確實沒有快捷方式。 這項工作的簡單程度取決於編寫代碼的可移植性。 你可能很幸運......

SDK文章列出了64位Windows的注意事項。 此處列出了 MSVC ++特定注意事項。 通常,只編譯代碼將清除大多數問題。 我不能評論你的具體情況,它不夠詳細。

我發現清除錯誤的最佳方法是審核代碼中的任何代碼,執行以下任何操作並在32位世界中修復它,然后啟動端口。

  • 使用無類型容器和強制轉換而不是正確的容器。
  • 無論出於何種原因,使用強制轉換以DWORD格式存儲指針,通常作為存儲在容器中的最終前奏
  • 歸檔時進行轉換

對於您確實必須執行DWORD / ptr操作的情況,請將類型更改為DWORD_PTR。

我已經看到很多代碼使用CStringToPtr而不是具有適當類型的CMap <>。

所有這些東西都可能在64位上編譯(由於演員陣容沒有警告),然后在他們的臉上掉下來。 如果他們使用了正確的類型而沒有強制轉換,則代碼將首次運行。

還要檢查設置WndProc的任何子類代碼 - 您需要一個不同的標志來在64位Windows上設置它。

如果使用MFC,您也會(無益地)發現容器大小現在返回64位大小而不是32位大小計數,這意味着您的32位/ 64位存檔將被破壞。 你必須在你去的時候解決這個問題。 我們使用一些聰明的技巧創建了我們自己的自定義MFC實現,以允許我們在64位盒上反序列化32位存檔,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM