7/26/2008 12:17:30 AM

x64 programming #2: ASP.NET + ODBC (讀取 CSV)

Microsoft.NET | ASP.NET | x64 | 小技巧 | 技術隨筆

今天的範例超簡單,簡單到很沒水準的地步... 難道本 columns 的水準降低了嘛? 咳咳... 不多說,今天的例子也不需要解釋,直接來看 sample code:

 

Default.aspx.cs 程式碼[copy code]
   1:  using System;
   2:  using System.Data;
   3:  using System.Web.UI.WebControls;
   4:  using System.Data.Odbc;
   5:   
   6:  public partial class _Default : System.Web.UI.Page 
   7:  {
   8:      protected void Page_Load(object sender, EventArgs e)
   9:      {
  10:          DataSet ds = new DataSet();
  11:          OdbcConnection conn = new OdbcConnection("Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" + Server.MapPath("~/App_Data"));
  12:          OdbcDataAdapter adpt = new OdbcDataAdapter("select * from [database.txt]", conn);
  13:          adpt.Fill(ds);
  14:   
  15:          this.DataGrid1.DataSource = ds.Tables[0];
  16:          this.DataGrid1.DataBind();
  17:      }
  18:  }

 

真的是沒什麼特別的 code, 連 exception 都沒處理... 難道 .aspx 有什麼特別的嘛? 來看看:

Default.aspx[copy code]
   1:  <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
   2:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   3:  <html xmlns="http://www.w3.org/1999/xhtml">
   4:  <head runat="server">
   5:      <title>Untitled Page</title>
   6:  </head>
   7:  <body>
   8:      <form id="form1" runat="server">
   9:      <div>
  10:      <asp:DataGrid ID="DataGrid1" runat="server" />
  11:      </div>
  12:      </form>
  13:  </body>
  14:  </html>

 

真的沒啥特別的,再來看看 CSV 檔的內容好了,看看有沒有什麼特別的...

~/App_Data/database.txt[copy code]
   1:  name,email
   2:  chicken,chicken@chicken-house.net
   3:  peter,peter@chicken-house.net
   4:  annie,annie@chicken-house.net
   5:  nancy,nancy@chicken-house.net

 

咳,想扁我的忍一下... 這支程式大概只比 "Hello World" 好一點,會看本 BLOG 的大概用看的就知道結果是什麼了吧? 不就把所有的內容套到 DataGrid 裡顯示出來? 像這樣:

image

 

真是沒營養的內容... 現在要開始進入主題了。執行環境是 Vista x64 + Visual Studio 2008,這個 web site 是透過 DevWeb 來執行的,不是透過 IIS... 反正都一樣嘛,測完可以 RUN (這種程式應該不會有什麼 BUG,頂多打錯字編譯錯誤..) 後就收工了,把它 DEPLOY 到 IIS 上面 ( windows 2003 x64, IIS6 ) 跑看看:

 

image

 

掛了... 當然... 不然這篇是要討論什麼? 老實說這是我親身碰到的例子,從這錯誤訊息還真摸不著頭腦,完全搞不懂發生什麼事。該裝的都裝了,也都沒錯,為什麼會這樣?  二話不說,先確定系統的 ODBC 是正常的,最好的方式就是找現成的程式試看看,就可以初步判定是我的問題 OR 系統的問題。到控制台的 ODBC Data Source Administrator 看看,先建個同樣的 ODBC data source...

 

image

真是見鬼了,我的 windows 95 vpc 能用的 odbc driver 都比這裡多... 看來真的是沒有 ODBC driver,那我裝的 ADODB 是裝到那裡去了?

科學的實驗都講求先假設,再控制變因,然後證明假設是正確的... 不過現在一點線索都沒有,只能靠運氣了。會有這篇也真的是運氣好,聯想到是不是 x64 的問題? 用我謹有的知識: x64 / x86 兩種模式的程式不能同時出現在單一 process, 為了證明這件事,就特地在 SERVER 安裝了 excel, 用 excel 來開啟 odbc, 竟然可以?

解這問題,裝 office 是一年多前的事了,現在也沒畫面好抓,就跳過去... 想到 x64 一堆東西都有兩種版本,控制台是不是也有? 真該好好拿箱仙草蜜,拜一拜交大門口的土地公... Bingo! 執行了32位元版的 ODBC Data source Administrator (c:\Windows\SysWOW64\odbccp32.cpl), 結果出現了這畫面:

image

真是好狗運,如果沒矇對的話,不知道還要搞多久... 這時才恍然大悟,原來 x64 要求所有的 driver 都要是 64 位元版,加上單一 process 不能混用 x86 / x64 兩種模式的 code,就是指這個... driver 不只是 "硬體" 的 driver,連各種軟體的都算。廣義一點來說,ODBC driver, OleDB Provider 也都算 driver 的一種,各種 Plug-Ins,甚至是各種 COM 元件 (只要是 In-Process 的都算),到 COM 的延伸... IE ActiveX Control,Media Player 用的 Codec ... 通通都算...

我終於體會到要轉移到 x64 有多麻煩了。在 DOS 年代或是 WIN 3.1 年代,每個軟體都很獨立,換到 WIN32 沒什麼問題。現在的軟體就不一樣,轉到 x64 都可以跑,不過要用到的各種共用元件就不一定了。拿掉 COM 的話,VB / ASP 大概就什麼都不剩了吧...

回題,來看看這問題怎麼解。雖然搞清楚原因,但是我的程式還是不能動。CSV 其實還可以用文字檔硬解,不過我實際工作上碰到的例子是要解讀上傳的 EXCEL 檔的內容... EXCEL 我可沒辦法硬搞... 不過現在方向清楚了,只要有辦法把程式從 64 位元模式改成 32 位元模式執行,就可以抓的到 32 位元模式下的 ODBC Data Source, 程式就正常了。不過該怎麼告訴 IIS6,我的程式需要的執行環境是 32 位元?

 

上網查了一下 x64 版的 IIS 如何執行 x86 模式的程式? 找到這篇:

http://support.microsoft.com/kb/894435/zh-tw

IIS 6.0 同時支援 32 位元模式及 64 位元模式。但是,IIS 6.0 不支援同時在 64 位元版的 Windows 上執行兩種模式。ASP.NET 1.1 只能在 32 位元模式中執行。ASP.NET 2.0 可以在 32 位元模式或 64 位元模式中執行。因此,如果要同時執行 ASP.NET 1.1 和 ASP.NET 2.0,您必須在 32 位元模式中執行 IIS。

實際切換的動作在這篇也有寫...

ASP.NET 2.0 的 32 位元版本
如果要執行 32 位元版的 ASP.NET 2.0,請依照下列步驟執行: 1. 按一下 [開始],再按一下 [執行],輸入 cmd,然後按一下 [確定]。
2. 輸入下列命令以啟用 32 位元模式:
cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
3. 輸入下列命令以安裝 ASP.NET 2.0 (32 位元) 的版本,以及在 IIS 根目錄和下列位置底下安裝指令碼對應:
%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.40607\aspnet_regiis.exe -i
4. 請確定在 Internet Information Services Manager 的 Web Service Extension 清單中,將 ASP.NET 2.0.40607 版 (32 位元) 的狀態設定為 Allowed。

 

切換過後,再重新執行一次,一切就正常了:

image

 

雖然在 x64 下執行 x86 的程式,也是有一堆額外的好處,不過看起來就是不大爽... IIS6 只能二選一,兩種模式只能挑一種。這個問題到了 IIS7 就獲得解決了。 IIS7 允許同時存在這兩種模式的 Application ..

其實在 x64 下的問題還很多,不過大都不外乎這模式,x64 / x86 的 dll 不能混用。現今軟體都用一堆元件,你得確保每一個用到的元件都有 x64 版,如果有一個沒有? 乖乖的切回 x86 來執行吧...。類似的小狀況其實還蠻多的,下回多列幾種我碰到的狀況,以免各位跟我一樣碰釘子還試個老半天... 敬請期帶第三集 :D



7/25/2008 2:56:47 AM

x64 programming #1: 環境變數及特殊目錄..

Microsoft.NET | x64 | 技術隨筆

被 X64 折騰了這麼久,總要留些戰蹟下來... 先從每個人都會碰到的目錄路徑調整開始吧...

有些目錄大家都耳熟能詳,像是 c:\Program Files\ 之類的,不過如果你的程式把這種路徑寫死了,你就要注意了... 因為到了 x64 位元下的 x86 相容模式,路徑就完全不一樣了... 先來看這一段程式執行結果是啥? 別急著看解答,猜一下..

印出所有 SpecialFolder[copy code]
   1:  Console.WriteLine("Spacial Folder(s):");
   2:  foreach (Environment.SpecialFolder value in Enum.GetValues(typeof(Environment.SpecialFolder)))
   3:  {
   4:      Console.WriteLine("{0}: {1}", value, Environment.GetFolderPath(value));
   5:  }

 

 

Visual Studio Platform 設定為 x86,在 Vista x64 下執行的結果是:

Spacial Folder(s):
Desktop: D:\HomeDisk\chicken\Desktop
Programs: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Personal: D:\HomeDisk\chicken\Documents
Personal: D:\HomeDisk\chicken\Documents
Favorites: D:\HomeDisk\chicken\Favorites
Startup: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Recent: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Recent
SendTo: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\SendTo
StartMenu: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Start Menu
MyMusic: D:\HomeDisk\chicken\Music
DesktopDirectory: D:\HomeDisk\chicken\Desktop
MyComputer:
Templates: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Templates
ApplicationData: C:\Users\chicken\AppData\Roaming
LocalApplicationData: C:\Users\chicken\AppData\Local
InternetCache: C:\Users\chicken\AppData\Local\Microsoft\Windows\Temporary Internet Files
Cookies: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Cookies
History: C:\Users\chicken\AppData\Local\Microsoft\Windows\History
CommonApplicationData: C:\ProgramData
System: C:\Windows\system32
ProgramFiles: C:\Program Files (x86)
MyPictures: D:\HomeDisk\chicken\Pictures
CommonProgramFiles: C:\Program Files (x86)\Common Files

 

 

改成 x64 / Any CPU,在 Vista x64 下執行的結果是:

Spacial Folder(s):
Desktop: D:\HomeDisk\chicken\Desktop
Programs: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Start Menu\Programs Personal: D:\HomeDisk\chicken\Documents
Personal: D:\HomeDisk\chicken\Documents
Favorites: D:\HomeDisk\chicken\Favorites
Startup: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Recent: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Recent
SendTo: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\SendTo
StartMenu: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Start Menu
MyMusic: D:\HomeDisk\chicken\Music
DesktopDirectory: D:\HomeDisk\chicken\Desktop
MyComputer:
Templates: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Templates
ApplicationData: C:\Users\chicken\AppData\Roaming
LocalApplicationData: C:\Users\chicken\AppData\Local
InternetCache: C:\Users\chicken\AppData\Local\Microsoft\Windows\Temporary Internet Files
Cookies: C:\Users\chicken\AppData\Roaming\Microsoft\Windows\Cookies
History: C:\Users\chicken\AppData\Local\Microsoft\Windows\History
CommonApplicationData: C:\ProgramData
System: C:\Windows\system32
ProgramFiles: C:\Program Files
MyPictures: D:\HomeDisk\chicken\Pictures
CommonProgramFiles: C:\Program Files\Common Files

 

 

再來看一段 code, 把所有的環境變數印出來:

印出所有的環境變數..[copy code]
   1:  Console.WriteLine("Environment Variable(s):");
   2:  IDictionary evs = Environment.GetEnvironmentVariables();
   3:  foreach (string key in evs.Keys)
   4:  {
   5:      Console.WriteLine("{0}: {1}", key, evs[key]);
   6:  }

 

 

x86:

 

Environment Variable(s):
Path: C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\Intel\DMIX
TEMP: C:\Users\chicken\AppData\Local\Temp
SESSIONNAME: Console
PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
USERDOMAIN: CHICKEN-PC
PROCESSOR_ARCHITECTURE: x86
ProgramW6432: C:\Program Files
TRACE_FORMAT_SEARCH_PATH: \\NTREL202.ntdev.corp.microsoft.com\34FB5F65-FFEB-4B61-BF0E-A6A76C450FAA\TraceFormat
APPDATA: C:\Users\chicken\AppData\Roaming
windir: C:\Windows
LOCALAPPDATA: C:\Users\chicken\AppData\Local
CommonProgramW6432: C:\Program Files\Common Files
TMP: C:\Users\chicken\AppData\Local\Temp
USERPROFILE: C:\Users\chicken
ProgramFiles: C:\Program Files (x86)
CommonProgramFiles(x86): C:\Program Files (x86)\Common Files
FP_NO_HOST_CHECK: NO
HOMEPATH: \Users\chicken
COMPUTERNAME: CHICKEN-PC
ProgramData: C:\ProgramData
PROCESSOR_ARCHITEW6432: AMD64
USERNAME: chicken
NUMBER_OF_PROCESSORS: 4
PROCESSOR_IDENTIFIER: Intel64 Family 6 Model 23 Stepping 7, GenuineIntel
WecVersionForRosebud.1054: 2
SystemRoot: C:\Windows
ComSpec: C:\Windows\system32\cmd.exe
LOGONSERVER: \\CHICKEN-PC
DFSTRACINGON: FALSE
ProgramFiles(x86): C:\Program Files (x86)
VisualStudioDir: D:\HomeDisk\chicken\Documents\Visual Studio 2008
SystemDrive: C:
CommonProgramFiles: C:\Program Files (x86)\Common Files
PROCESSOR_LEVEL: 6
PROCESSOR_REVISION: 1707
PROMPT: $P$G
ALLUSERSPROFILE: C:\ProgramData
VS90COMNTOOLS: C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
PUBLIC: C:\Users\Public
OS: Windows_NT
HOMEDRIVE: C:

 

 

 

x64:

Environment Variable(s):
COMPUTERNAME: CHICKEN-PC
VisualStudioDir: D:\HomeDisk\chicken\Documents\Visual Studio 2008
HOMEPATH: \Users\chicken
LOCALAPPDATA: C:\Users\chicken\AppData\Local
USERNAME: chicken
PROCESSOR_ARCHITECTURE: AMD64
Path: C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\Intel\DMIX
CommonProgramFiles(x86): C:\Program Files (x86)\Common Files
ProgramFiles(x86): C:\Program Files (x86)
PROCESSOR_LEVEL: 6
LOGONSERVER: \\CHICKEN-PC
HOMEDRIVE: C:
USERPROFILE: C:\Users\chicken
SystemRoot: C:\Windows
TEMP: C:\Users\chicken\AppData\Local\Temp
WecVersionForRosebud.1054: 2
PUBLIC: C:\Users\Public
ALLUSERSPROFILE: C:\ProgramData
FP_NO_HOST_CHECK: NO
APPDATA: C:\Users\chicken\AppData\Roaming
DFSTRACINGON: FALSE
ProgramData: C:\ProgramData
PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
OS: Windows_NT
CommonProgramFiles: C:\Program Files\Common Files
PROCESSOR_IDENTIFIER: Intel64 Family 6 Model 23 Stepping 7, GenuineIntel
ComSpec: C:\Windows\system32\cmd.exe
TRACE_FORMAT_SEARCH_PATH: \\NTREL202.ntdev.corp.microsoft.com\34FB5F65-FFEB-4B61-BF0E-A6A76C450FAA\TraceFormat
PROMPT: $P$G
SystemDrive: C:
PROCESSOR_REVISION: 1707
ProgramFiles: C:\Program Files
NUMBER_OF_PROCESSORS: 4
VS90COMNTOOLS: C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
TMP: C:\Users\chicken\AppData\Local\Temp
SESSIONNAME: Console
windir: C:\Windows
USERDOMAIN: CHICKEN-PC

 

有差異的地方我用紅色的字標出來了,看來程式還真的不能亂寫,那種寫好 RUN 了沒事就交差的人要注意了,哈哈.. 千萬不要雞婆自己湊路徑就是這樣... 其實同樣的狀況發生在好幾個地方,Win32 API 會重新導向, 32/64 用的是不同版本,Registry Key 也會重新導向,File System 也會重新導向...。

不過比較特別的是 c:\windows\system32 這目錄,文件上說會自動重新導向到 c:\windows\syswow64 下 (如果你是在 x64 環境下執行 x86 的程式),不過上面的例子抓到的路徑依舊是 c:\windows\system32 ( x86 / x64 都一樣 ),甚至是我在 x86 版本寫個檔案到 c:\windows\system32 下,回到 x64 的檔案總管看,它還真的在 c:\windows\system32\ 下...

不過當程式需要載入原本在 c:\windows\system32 下的檔案,或是呼叫到原本 windows 內建在這目錄下的 .dll / .exe 的話,還真的會被重新導向到 c:\windows\syswow64 ... 有興趣的朋友可以自己去這個目錄下逛一逛,該有的檔案都有,不過通通是 32 位元的版本..

所以裝 x64 有個缺點,C:\ 會變比較肥... 哈哈,因為什麼東西都擺兩份,Orz...

不過我用的方式都是土法鍊鋼,看起來像自己試出來的... 其實這樣不好,我是亂練的,大家不要學... 要寫 x64 程式的人,MSDN 這一個章節一定要看一下:

 

Programming Guide for 64-bit Windows

http://msdn.microsoft.com/en-us/library/bb427430(VS.85).aspx

 

這個章結的內容不多,翻一翻就看完了,裡面才是正解啊,不要再相信一些沒有根據的說法了... (咳,我又沒禿頭..),下次來講 IIS6 + x64 碰到的一堆靈異事件...



7/23/2008 12:52:49 AM

x86? x64? 傻傻分不清楚...

Microsoft.NET | x64

雖然常在 x86 / x64 兩種模式下打轉,不過一不留神還真的會吃到虧... 最近平常下班跟工作都碰到 x64 的問題,因此這裡記一下心得,免的以後又吃到虧... 這篇又是無聊的碎碎唸 + 流水帳,沒耐心的人就直接跳過去吧 :D

 

除非你的程式非得用 C/C++ 不可,否則想要平順的從 x86 跨到 x64 的環境,最簡單的方式還是用 .NET。不過別以為你用 .NET 然後編譯的 PLATFORM 選 ANY CPU 就可以高枕無憂,好戲現在才開始...。

 

碎碎唸的內容太雜了,先列個摘要:

  1. 16 位元到 32 位元 v.s. 32 位元到 64 位元
  2. x64 + wow
  3. 同時使用 x86 only COM / x64 only COM

 

過去從 16 位元模式轉到 32 位元模式的路我沒有經歷過,雖然我寫過 16 bits 的程式,不過大都是像俄羅斯方塊,或是貪吃蛇之流的小程式,寫爽的... 也沒怎麼在用,跟本沒有轉移的問題。DOS時代我一直撐著,沒怎麼在用 WIN 3.1,後來 IBM OS/2 出來我有認真的用了一下,直到 Win95 的年代才開始真正在用 Windows...

不過 Windows 95 用了沒多久,實在受不了它的穩定性 (之前被 OS/2 慣壞了),就直接跳到 NT4 workstation,從此就一路一直用 NT 家族的作業系統 ( NT4、2000、XP... ),大部份時間都是窩在 32 位元的環境下作業。

 

Microsoft 替 32 -> 64 鋪的路,跟 16 -> 32 不大一樣。16 -> 32 靠的是 v86 mode 來提供 16 位元的相容模式,在 windows 下則是以 wowexec 把所有的 16 位元成式集中在這個 process 下執行。不過到了 32 -> 64 的年代,提供相容環境的作法已經不一樣了,直接在 user mode 下提供相容的模式,唯一的限制是同一個 process 不能同時存在兩種模式的 code,要嘛 32 要嘛 64,一定要選邊站就是了。只要你不碰到 COM 這類 in-process 的程式,都不會有太大的問題。

另外系統的目錄也開始分兩份...。安裝過 64 位元版的 windows 就知道,Program Files目錄變成兩個 ( Program Files / Program Files (x86) ),而 System32 目錄也變兩個了 ( System32 / SysWow64 ),其它像是 Registry 等也都有兩份...。

 

談談我碰過的幾個案例,工作上碰到的例子很多,其實自己寫的都是 script / assembly,都不大需要跟平台榜在一起。不過寫過 ASP / VB 的都知道,拿掉 COM 元件的話,大概就什麼都不剩了... 只要你需要的 COM 元件有一個沒有提供 64 位元版,很抱歉... 你就要乖乖回到 32 位元模式...。像 JET / ODBC driver 就沒有 64 位元版...。不過 .NET 倒是得天獨厚,因為有類似 Java VM 的 CLR 擋在 .NET 及 OS 之間,因此絕大部份的 .NET 2.0 程式碼都可以自在的跨 x86 / x64 兩種模式執行,除了... 除了我碰到的情況之外 -_-。

 

討厭的是這些自己寫的 .NET / SCRIPT 程式,沒有特別指定的話當然都會用原生的 64 位元模式執行,直到出錯你找半天找不到問題,無意之間才想到是 32/64 的鳥問題...,害我抓最久的就是 .NET 包裝的 SMTP 元件,CDO 沒有提供 64 位元版,但是 .NET 編譯成 ANY CPU 模式卻又沒有任何問題,直到執行時才給你 run time error ...。另一個例子是我自己在用的 WPF Image Codec... 因為我有用到 CANON 提供的 RAW CODEC,但是 CANON 遲遲不肯推出 64 位元版... Orz,我只好將就著點在 Vista x64 下跑 32 位元的版本。第一步就是重新 compile 自己寫的 Media Filer,通通編譯成 x86 platform。

 

程式看起來跑的好好的,不過問題現在才開始。家裡大人常愛用相機拍 AVI 下來,原本的程式是叫用 Media Encoder 把 AVI 重新編碼程我要的規格。32位元下呼叫 CSCRIPT.exe, 然後再叫用 WMEnc.vbs 出來轉檔... 才發現問題大條了,怎麼找不到元件? @_@

 

我一直以為 M$ 的東西,64位元版都會一次安裝兩種版本... 結果原來要個別去抓 32 / 64 位元的 Media Encoder 9 回來裝才能用... 好,硬碟就花下去,裝兩種就裝兩種...。執行過後又發現怪怪的,透過 media encoder components 啟動 media encoder 轉檔,怎麼轉完就停在 100% 不會自動關掉? 實在是搞不定,試了 64 位元版的沒問題,只好想辦法改用 64 位元版的 media encoder ...。

 

它ㄨ的,問題一個接著一個來... 弄到這裡才發現,32 位元模式下的程式,沒辦法叫 64 位元版的 COM 元件來幫我做事,Orz... 如果換 64 位元的話,又用不到 Canon Raw Codec ...。最後沒辦法,只好程式大搬家,拆成幾個獨立的 .exe,各自用適合的版本運作... 以功能來說,這樣已經達成我的目的了。正好並行效果不大好的 Canon Raw Codec,在這樣的模式下還能吃掉四核CPU的80%運算能力,算是偷笑了... 這篇雜七雜八的 x64 / x86 大亂鬥就到這裡為止,謝謝觀賞 :D。

 

image



2/26/2008 2:28:00 AM

困難重重的 x64

543 | 水電工 | 技術隨筆 | x64

即使是做足了功課,還是敗下陣來... Orz

之前 Vista x64 用的都還不錯,直到加上 4GB 之後,才是惡夢的開始... 之前貼了一篇 6GB 很爽的 POST,之前插上去只偵測到4.8GB,想說小事情,一定是 BIOS Remap沒打開的關係,果然一開就是 6GB,一切正常,就貼了 POST ..

不過隔一兩天,想開個 MCE 來看電視,怎麼沒訊號? 查了半天確定線路都正常,才想到之前剛裝好不是都 OK 嗎? MCE 還列為重點測試項目之一,driver早都打聽好了,怎麼還會這樣? 就一個一個設定 rollback 試看看...

搞半天,問題出在想都沒想到的地方... 我的 TV 卡,在Vista x64開了Memory Remap後就會出問題了。Device Manager沒有任何異狀,但是MCE就一直說訊號微弱... 跟本沒辦法看. Memory Remap 關掉就正常了。寫Mail去圓剛跟華碩的客服反應,果然再怎樣還是要買大廠的...

ASUS 有回,不過沒用...

圓剛? 沒人鳥我...

雖然切回 4.8GB 還是戡用,不過多買的 4GB 只能當 2.8GB 不到,感覺有點鳥... 加上裝了 X64 有一半以上的軟體都是 X86 ... 看起來實在有點礙眼... 其實現階段用 X64 也是有些缺點的,第一就是很多軟體及 DLL 都要分兩套, x64 + x86,很佔空間。第二,一樣的程式 x64 吃的 memory 比較多,為何? 每個 Pointer 都多兩倍空間... 多少都會有影響... 第三,幾乎用到 COM 元件的都得靠 WOW,效能有點下滑... 所以暫時還是換回 x86 版了.

換回 x86 vista 後第一件事就是試試電視卡,在 x86 mode 下開不開 REMAP 就都正常,看來 Driver 要負一點責任,不過工作忙,暫時就不理它了,下次擇日再挑戰一次 x64. Ram 裝太多果然還是有一堆問題,新問題是我的主機板 (ASUS P5B-E Plus) 如果開了 BIOS Remap,進 Vista 後只能看到 2048MB Ram @_@,關掉反而還有 2.8GB... 搞什麼飛機...

又是搞了半天,確定無解,網路上很多人跟我一樣... 本想就讓它 2.8GB 吧,不過又讓我發現了個評價不錯的 Ram Disk 軟體: "Gavotte Ramdisk"

評價不外呼是免費,沒有容量限制,很穩定等等,不過它有個特異功能倒是 RAM 插太多的人要試試... 它可以把像我這樣失去的 RAM 挖回來用!!

真的蠻神奇的,只要 Vista 起用 PAE (Physical Address Extension),這套 RAM DISK 就能自動把 OS 不會抓來用的 RAM 當成 RAMDISK. 不過不開 BIOS Remap 就沒輒... 因此當場我的組態變成: RAM: 2GB, RamDisk: 4GB ...

真的是 Orz,我要那麼大的 RamDisk 幹嘛? 像網路一堆人把 Page File 放到 RamDisk 上的作法又覺的有點蠢,雖然很多時後非得要 Page File 不可,不過把 RAM 不夠時某些 RAM 的資料搬到 DISK,而這 DISK 又是 RAM 模擬的,感覺就像是做了一堆白工... 算了,拔掉 2GB 吧,剩下 2GB 就當 TEMP 用,可以塞 TEMP 的就塞過去..

看起來 x64 還是小問題多多,沒那個人生跟他耗的話,還是過一陣子再試試吧,反正照這情勢,RAM很快就會漲到不得不換 X64 的地步了,往好的方面想,這應該會加速廠商移到 x64 的腳步吧? [H]



2/12/2008 4:28:00 AM

再度換裝 Vista ... Vista Ultimate (x64)

543 | 技術隨筆 | x64

暨之前升級到 VISTA 的經驗, 到最後不適用又換回 XP 到現在, 差一個月就一年了 (真久), 這陣子因為陸陸續續解決掉一些問題, 加上一些誘因, 不得不換到 VISTA, 於是又再度換了一次...

這次會想換, 主要有幾個原因:

  1. 因為硬碟滿了, 過年前買了顆 750G 的新硬碟, 可以有辦法裝新 OS 而不影響到舊系統
  2. 想加 RAM, 不過原本已經是 2GB 了, 32 位元的系統 (XP) 再加上去效益不大, 想直接換到 64 位元, 個人用我也不大想換 server 版的 OS, 不大好用. 可用的 memory 雖然能突破 4GB, 但是它終究是 32 位元的系統, 對於記憶體的使用仍有一堆限制, 換成 x64 才是正途.
  3. 原本用的是 XP MCE2005, 如果要保有 MCE 的功能, 又要64位元, 那只剩 Vista x64
  4. Canon Raw Codec 已推出, 常用的轉檔作業都已經用 .NET Framework 3.0 改寫完成, 加上先前在 VM 試過, 可以初步解決 Canon Raw Codec 不支援 x64 的問題. 過去的障礙已經排除
  5. 想開始研究一下 IIS7, Win2008 還太遙遠, 直接用現成的 vista 比較快
  6. 家裡大人已經用 vista 好一段時間了, 看她用也沒啥問題...
  7. 內建的東西夠多, 我是只要內建的堪用就會用的人... 內建 DVD codec, 基本的 Video DVD 編輯程式對我還蠻有用的
  8. 雖然 Vista 沒啥重要的大改進, 但是每個小地方的改良加起來也不少
  9. Tablet PC 功能. 前陣子弄了塊陽春的數位板, 可以直接用現成的 for Tablet PC 軟體. 又是跟 MCE 一樣的例子, 過去是有特定版本的 XP, 沒辦法同時保有 Tablet PC / Media Center / x64 等好處, 只有換 Vista 一途...
  10. 雖然 Vista 預先載入你常用 AP 的功能常被罵到臭頭, 但是我倒是不介意多餘的 RAM 先拿去當 Cache 使用. 幾個常用的大型軟體, 在 Vista 下載入的速度還真的快很多, 雖然是錯覺, 但是至少也是有用到...
  11. 過去 Visual Studio 2005 在 Vista 上有些小問題 (要加裝 patch), 在 x64 下問題更多... 尤其是 debugging 時. 現在 Visual Studio 2008 出來, 這類問題都解決的差不多了
  12. Vista SP1 快出了, 時機應該成熟了, 預先準備一下...
  13. 最重要的原因: 都買了正版 Vista 了, 放著不用是怎樣... [H]

補充個事後才發現的好處, Vista Complete PC 是內建的磁碟備份工具, 類似 GHOST 那樣, 是把你整顆硬碟做成映像檔. M$ 當然用它推廣的格式 *.vhd, 正好跟我常用的 Virtual PC / Virtual Server 的格式一致. 多好用? 簡單在 Vista 內點兩下就可以做 Disk Image, 以後需要的話可以直接用 Vista DVD 還原, 就像 GHOST 一樣. 或是直接用 Virtual Server 2005 R2 SP1 附的工具: VHDMOUNT, 直接掛起來用 [Y]

另外一點也要特別提一下. 原本搜遍了 GOOGLE, 得到的答案清一色都是 Canon Raw Codec 不支援 Vista X64. 官方說法跟使用者討論都是這樣. 我是硬著頭皮先在 VM 裡試了一下, 耶? 至少還可以安裝上去. 不過果然不行. 我自己寫的轉檔工具不能用, 如預期的找不到對應的 Codec. 在 Windows Live Gallery 及檔案總管下也不能直接看到 .CR2 的縮圖...

不過想到過去跟 X64 + WOW (是 Windows On Windows, 不是魔獸世界) 奮戰的經驗, 其實 M$ 做的 32 位元回朔相容作的還不錯. 只是有一個大前題: 32 / 64 兩種 CODE 不能混在一起執行. 同一個處理程序 (Process) 內必需都是 32 或是 64 位元的 code. 第一個碰到這種問題的就是各式軟應體的 driver. 硬體的就不說了, 軟體的像一堆 "虛擬" 裝置, virtual cdrom, virtual disk, virtual network adapter ... 等等. 第二個碰到的就是各式的 DLL, 它本來就是讓你載入到你的 Process 內使用的, 像一堆 ODBC driver, COM 元件, ActiveX Control, Video Codec, 加上 WPF 使用的 Image Codec, 都在此列. 這種才是真正的問題, 就像 M$ 可以把 IE 重新用 64 位元改寫, 但是它無法替所有的 ActiveX Control 改寫為 64 位元, 因此未來的五年內, 光是 IE 這東西, 你大概還是甩不掉 32 位元版本...

這類相容問題通常都是整套用 32 位元版本就可以解決, 就像 IE 你只要開啟 32 位元版本的話, 即使你是在 x64 OS, 也不會有太大問題. 32 位元的程式在 64 位元 OS 下執行, 還附帶了一些額外的好處. 記憶體管理就佔了不少便宜. 光是記憶體各種管理的動作就快很多 (以前看過相關文章, 不過找不到了 [:P], 下次寫 code 來測看看), 加上 32 位元的基本限制: 4GB memory size, 因為 OS 已經是 64 位元了, 4GB 可用的定址空間不用再切 2GB 給 OS 使用... 因此你的程式可用的定址空間也從 2GB 擴張到 4GB, 不無小補.

想到這些案例, 我就試了一下... 我自己寫的歸檔工具不能跑, 如果我把它切到 32 位元模式呢? 改了改 compile option, target platform 從原本的 "Any CPU" 改為 "x86", 耶! 可以了耶... 程式能正確的抓到 Canon Codec, 並且正確的解碼跟抓到 metadata.

再試一下 Windows Live Gallery, M$ 還算有良心, 裝好後就有兩種 32/64 版本. 我開了 32 位元版, .CR2 的照片也都可以正確顯示.. 哇哈哈... 讚 [Y]

不過 Windows Live Gallery 有些地方要注意, 它似忽載入後會留著, 類似古早的 OLE server 一樣的技術, 跑起來後就會留在系統內, 待下次有人要執行時繼續使用. 因此如果沒有在 BOOT 後第一次就開正確的版本, 以後就有可能你開 32 位元版, 它還是跑 64 位元的給你看...

這個問題可以解決, 算是讓我願意換 Vista x64 最主要的原因, 不然我大概會傻傻的等到 Canon 好心的推出 64 位元版的 codec 才換吧 [H], 這次升級 Vista 應該不會再像上次一樣, 用一用就換回去了... 想換 x64 的人就不用再撐了, 上吧!!!






精選文章

RUN! PC 文章及範例下載
2010/07. 結合檔案及資料庫的交易處理
2010/05. TxF讓檔案系統也能達到交易控制
2010/04. 生產者 vs 消費者 - 執行緒的供需問題
2008/11. 生產線模式的多執行緒應用
2008/09. 用ThreadPool發揮CPU運算能力
2008/06. SEMAPHORE在ASP.NET的應用
2008/04. 以ASP.NET開發同步WEB應用程式

如何學好 "寫程式" 系列
#1. 該如何學好 "寫程式" ??
#2. 為什麼 programmer 該學資料結構 ??
#3. 進階應用 - 資料結構 + 問題分析
#4. 你的程式夠 "可靠" 嗎?

#5. 善用 TRACE / ASSERT

安德魯是誰?

Andrew Wu | Create Your Badge

我喜歡鑽研物件導向、軟體工程及作業系統等相關技術。我會在這裡發表我的研究心得,也當作我自己的學習筆記。


Recent comments

Comment RSS