C 從32位系統遷移到64位系統的問題

2021-06-05 22:17:09 字數 1082 閱讀 1957

前段用c#做了個程式,現在要把程式支援64位系統。

首先是把該程式支援到 windows server 2003 和 windows server 2008兩個系統,由於我的程式是在xp上測試編譯的,直接拿過去不會出什麼問題吧。

但是在執行的時候,老是報錯。沒辦法,在server 2003上裝了vs,一步步除錯,發現每當我執行到呼叫c++的dll時候,其中有一句就會報錯:

「嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞」

但是我之前的幾句呼叫dll的都執行通過了,而且在xp上也執行良好啊。

試了n久也不行,換引數等等方法也都以失敗告終。

先不管了,用最笨的方法,你執行不通過我就繞過,還好可以用其他的方法實現目的。這樣,32平台下都通過了。

按理說,一般32位的程式64位系統都是可以執行的。但是,真正移植的時候,卻還是出了問題。還是在呼叫c++的dll時候報

「嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞」

的錯誤,而且這次還變本加利,一句都通過不了,真是費解。

這到底是怎麼回事呢?用64位的庫也不行,難道是記憶體機制的差異?

最終搜了n久,就在我最終絕望的時候,看到了一篇文章,講的時在從32位系統移植到64位系統時候的一些問題,那篇文章裡特意把編譯時候的platform設定為「x86」。咦,既然是要在64位下執行,為什麼還要設定為「x86」呢?

不報希望的我試了下,結果竟然通過了。

問題的原因就在這裡啊。然後查了點資料,簡單的放在這裡。

vs編譯目標platform有3個選項:anycpu,x86和x64.如果乙個程式被編譯成anycpu,那麼程式將包含2套相同邏輯的程式,一套在32位系統上用,另一套在64位系統上用。問題的原因就在這裡。

當然,這裡我把編譯時候的platform設定為「x86」,只是生成了特定於32位intel x86相容處理器平台的**,所生成的程式集是基於pe32格式,可執行與wow64子系統中,所以當然也就可以在64位系統下執行了。

要想寫原生的64位系統下的程式還得花很大功夫才行。

64位的ie,32位的ie,64位和32位的.net。

64位的包含總共46m多,包含兩個32位系統那麼大,安裝時自動安裝32位環境。

32位系統和64位系統

前言 眾所周知,我們通常說作業系統是32位還是64位說的其實是32位處理器 cpu 還是64位處理器 cpu windows系統有32位和64位之分,下面我們來總結一下32位系統和64位系統的原理 區別以及如何判斷。我們現在所稱的計算機系統是32位或64位主要依據的是cpu解析的字組大小 字組大小 ...

c 判斷系統32位還是64位

判斷系統是否是64位的方法有很多。對於c 來說,呼叫wmi是一種簡單易行的方式。我們可以用win32 processor類裡面的addresswidth屬性來表示系統的位寬。addresswidth的值受cpu和作業系統的雙重影響。具體的值如下面的 所示 32bit os 64bit os 32bi...

32位 和 64位系統區別

1.32位系統cpu一次可處理32位資料,即一次處理4個位元組。64位系統cpu一次可處理64位資料,即一次處理8個位元組。通俗一點說 32位,就相當於你擁有32個工人,每次能完成32個工人的工作量 64位,就相當於你擁有64個工人,每次能完成64個工人的工作量 總結 由32位系統過渡到64位系統,...