Monthly Archives: 四月 2007

中國信託內部有間諜網站?


今天在檢查 Live Spaces 這邊統計資料時,有看到一個奇怪的網址:
上面崁入的是圖片,有圖有真相嘛~
IE 點下去連不到,用命令提示字元搜尋:
C:>nslookup spy.chinatrust.com.tw chinatrust.com.tw
Server:  CTCB.chinatrust.com.tw
Address:  203.66.181.152
*** CTCB.chinatrust.com.tw can’t find spy.chinatrust.com.tw: Non-existent domain

所以我猜應該是企業內部網站,所以 DNS 沒有對外服務,可能從網路上搜集(或監控,因為 spy 是間諜的意思)一些網友對中國信託的意見用的網站。
他搜集到的對象應該是這篇:
2005年還在說不想辦中國信託的信用卡,不過2006年9月卻去中國信託開戶了,因為就在我家旁邊~
話說到處都有 7-11 ,在中國信託開戶,到 7-11 就可以領到錢,真的很方便。
不過我還是沒辦中國信託的信用卡,只有提款卡。
回想起來應該是我很早就辦信用卡了吧?我大概是民國82年開始使用花旗學生卡,那時國內的 VISA 信用卡滿有限的,我同學大部分用中國信託的,讓我孤零零的~
當時信用卡都是 20% 還要繳年費,大概到了民國 84 年開始,才慢慢開始有刷卡抵年費的作法,當時中國信託好像是優惠最少的。
之後信用卡循環利息在財政部規定要對信用狀況良好的使用者主動下降前,中國信託跟花旗循環利息都是維持在 20%,雖然我從來沒用到過循環信用…我大概在民國89年終於忍不住把我的花旗卡停卡,其實當時滿捨不得的,畢竟是我用最久的卡片,只保留循環利息比較低的卡片,後來大環境經濟不好,各家銀行大部分都把信用卡循環利息升到將近 20% ,直到財政部的規定才降下來。
中國信託的金卡是我同學間最早有升金卡的,大概是民國85年吧,當時是信用額度 20 萬才能昇金卡,我同學當時循環信用用很兇,所以信用額度飆很快,我是每期都全繳光,信用額度只有 8 萬,用的久、用得多不如有用循環信用的,真是…
所以我討厭中國信託信用卡,這應該是當時對中國信託信用卡怨恨的累積吧~ ^_^
雖然我知道中國信託信用卡服務還不錯啦~ 我印象中最早的公益卡也是中國信託的吧,好像叫蓮花卡?我有一個同學辦蓮花卡。


不過中國信託內部有個以 spy 為名的內部網站,很容易引起網友的疑慮,會懷疑會不會是駭客攻進 DNS 或是 spy 這個網站的目的是幹嘛?中國信託有很多線上金融服務,這個 spy 的網站到底是幹嘛的?要竊取客戶上網使用線上服務的金融資訊還是?我也會很擔心。

會連到我這,我想應該是網路訊息蒐集系統吧?那最好別用 spy 為名,這樣很恐怖呢~

平常看到 spyware 就是指後門程式、間諜程式等,看到 spy 的網站就會聯想到後門網站、間諜網站,不知道當時是哪個天才取的名字?

Categories: 電腦和網際網路 | 發表留言

民進黨該對聖火無法來台負完全的責任


大家都知道,我們自稱台灣跟內地是一邊一國,內地自稱這是一個中國。
聖火經第三國來台、進香港這正是最佳的政治智慧。
香港、澳門是自治區,台灣在港澳之外,更是在自治區之外的層級,中國對內可以說這是一個中國,台灣對外可以說這是一邊一國,充份保留各自表述的空間。
中國對內要對13億人交代,對外一直號稱一個中國,要對全球60億人交代。
台灣對內要對2300萬人交代,對外一直號稱一邊一國,要對全球60億人交代。
一個彼此都能互相交代,最佳的各自表述的空間,卻被無俚頭的政治決策否定,只有自卑的人才會在意別人說什麼,自傲的人,有充分的自信認定自己的表述。如果有自信,管人家國內報紙寫什麼?全世界都知道事實上中國與台灣是一邊一國,全世界都承認是一個中國,這條路線是最能符合這個現況。但無俚頭的政府,為了自己的政治利益,枉顧運動員多年的努力,一個運動員有幾次機會能參加奧運?參加奧運對運動員的啟發有多大的意義?
只會打嘴砲的政府有何價值?
民主國家的架構下,對人民來說,人民的利益遠高於國家的利益,只有先有人民的利益,才論國家利益,現在的政府不管經濟、不管教育,只管沒有實際價值的政治,只會打嘴砲,只會抱大腿,這樣有國格嗎?抱大腿的時候就不需國格?
專制國家的架構,才會國家利益高於人民利益。
醒醒吧,告訴這個政府,真是白爛到家了。
會在乎別人國家內的報紙寫甚麼的人,才是真的認同該內容的人,不認同的人,只會笑笑,懶的多說廢話。
去在乎一個自己騙自己的人是白痴,去在乎一個自己騙自己的政府,是蠢蛋的集合體。
Categories: 新聞與政治 | 2 則迴響

[VBNET] CommandBuilder 並未能正確以主鍵值為限制條件


問題編號:SRT070329799162
這個問題比較誇張,我是 3/29 發出去的,直到 4/25 才收到答案,4/26 才電話討論,以歷年 CSS 接觸經驗,這篇是最久的一次~
 
結論
問題核心是 MDAC 附的 ODBC Driver 不支援取得資料表結構,所以根本不知道哪欄是主鍵值 (PK) ,所以會以最後一欄唯一索引鍵當成主鍵值,因為主鍵值也是唯一索引鍵,所以發生問題。
另明確說明文件錯誤:
所有更新和刪除陳述式在 WHERE 子句中都只包含 PrimaryKey 資料行。如果沒有定義 PrimaryKey,則將可搜尋的資料行包含在 WHERE 子句中。這相當於 OverwriteChangesUpdate | OverwriteChangesDelete。 
All update and delete statements include only PrimaryKey columns in the WHERE clause. If no PrimaryKey is defined, all searchable columns are included in the WHERE clause. This is equivalent to OverwriteChangesUpdate | OverwriteChangesDelete
 
此說明中關於 PK 值的說明,在使用 Jet ODBC Driver 時不適用,其他 ODBC Driver 則視該 Driver 支援狀況而定,例如 SQL Server 則支援 PK 。
 
改善方式
改用 OleDb 或調整資料庫結構。
其他補充
據稱,ADO.NET 2.0 加強了 CommandBuilder 邏輯,讓其變得更嚴謹,所以 ADO.NET 1.1 可執行的,在 ADO.NET 2.0 上不見得可執行。
 
原始問題及回應過程

標題:
CommandBuilder 並未能正確以主鍵值為限制條件
 
造成問題:
ADO.NET 1.1 / ADO.NET 2.0 有不同結果,無法處理有效的 DBNull 值。
 
重現步驟:
附件為單一可執行檔案及資料庫,可直接掛載於 Test 目錄下後 (建議),以 http://localhost/Test/ 測試。
並利用 Win2003 IIS 6.0 建立 ASP.NET 1.1 集區及 2.0 集區,分別進行測試。
建議可開設兩虛擬目錄指向同一檔案,例如 Test11 採用 ASP.NET 1.1 ,Test20 採用 ASP.NET 2.0 ,分別以 http://localhost/Test11/cmdbuilder.aspxhttp://localhost/Test20/cmdbuilder.aspx 測試執行。
 
說明:
1. 主要程式碼如下,完整程式碼請參考附件:

Sub SubMain()

     Response.Buffer = False

     Dim m_Conn As System.Data.Odbc.OdbcConnection = New System.Data.Odbc.OdbcConnection

     Dim m_Adapter As New System.Data.Odbc.OdbcDataAdapter

     Dim m_CBuilder As System.Data.Odbc.OdbcCommandBuilder

     Dim m_DataSet As New System.Data.DataSet

     Dim strPath As String = MapPath("two.mdb")

     m_Conn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)}; dbq=" & strPath & ";"

     m_Adapter.SelectCommand = New System.Data.Odbc.OdbcCommand("Select * From TestTable Where (SN=1)", m_Conn)

     m_Adapter.Fill(m_DataSet)

     Dim strID As String

     If IsDBNull(m_DataSet.Tables(0).Rows(0).Item("ID")) Then

          strID = "0"

     Else

          strID = m_DataSet.Tables(0).Rows(0).Item("ID")

     End If

     m_DataSet.Tables(0).Rows(0).Item("ID") = CStr(CDbl(strID) + 1)

     Response.Write(DebugUpdate(m_Adapter))

     m_CBuilder = New System.Data.Odbc.OdbcCommandBuilder(m_Adapter)

     m_Adapter.Update(m_DataSet)

End Sub

 

2. 版本抓取程式碼為:

<td align="right">目前.Net framework 版本:</td>

<td> <% =Environment.Version %>

 

3. 測試資料表格內容:

SN
ID
1

[Null]

 
欄位屬性:
SN: 主鍵值,長整數
ID: 字串,允許 Null ,索引,唯一值。
 
4. 以 ASP.NET 1.1 集區執行時:

 
5. 以 ASP.NET 2.0 集區執行時,則發生錯誤:
 
若 ID 已有值,例如 ID=’1′ 時,則可順利執行。
 
若加上限制條件要求 Where 條件只包含主鍵值,則主鍵值不會出現在 Where 條件內,而是 ID=? (ID 為唯一索引值):
m_CBuilder.ConflictOption = System.Data.ConflictOption.OverwriteChanges
 

 
6. 若修改資料庫令 ID 欄位屬性改為 可重複索引值,則均可正常執行,且上圖 Where 條件將為 SN=?
 

補充說明:
資料庫存放目錄應以檔案總管操作,允許寫入權限。
 
連絡資訊:
姓名:鄭子璉
電話:xxxxxxxxxx / xxxxxxxxx
技術支援服務合約編號:xxxxxxxxx
 

背景:
以下軟體皆為繁體中文版 (MSDN VST 版)
OS: Windows 2003 R2 SP2 + Windows Update (2007/3/9)
DB: Access 2003
開發工具: Visual Studio Team Suite 2005 8.0.50727.762 (SP.050727-7600)


From: Bon Sung
Sent: Wednesday, April 25, 2007 2:33 PM
To: 鄭子璉
Subject: 微軟回覆您的問題 20070425V1 – Question about ODBCCommandBuilder

鄭先生您好,
 

Sorry from the late response.  Below is the summary till now for your reference.

 

[Problem Description]

=================

You have created a Access DB, which has defined “SN” as the primary key and “ID”  as “Indexed(Yes, no duplicates)” key. We use OdbcCommandBuilder with overwirtechanges option, the update command generated as below:

UPDATE TestTable SET SN = ?, ID = ? WHERE ((ID = ?)),

Which we expected should be: UPDATE TestTable SET SN = ?, ID = ? WHERE ((SN = ?))

 

Check MSDN, and found below comment:

 

OverwriteChanges All update and delete statements include only PrimaryKey columns in the WHERE clause. If no PrimaryKey is defined, all searchable columns are included in the WHERE clause. This is equivalent to OverwriteChangesUpdate | OverwriteChangesDelete. But it’s not true when we use Access.

 

[Action Tacken and conclusion]

========================

1.      Fire RFC.

2.      The expected behaviour not supported in Access.

Below is extracted from developer’s response:

The basic problem is that the Jet ODBC driver doesn’t support the ODBC function that would conclusively tell us which index/column is the primary key. Thus, we have to fall back to a less-precise method using the unique indexes, and using that method, we can’t tell for sure which columns are really the key. So, we are attempting to do what the docs say, but in this case it’s not totally possible.

Categories: 更新與回報 | 發表留言

[VBNET]時間函數對照表



VB6/VBA/VBScript 使用的時間函數升級到 VBNET 已經有改變,包含 ASP(VBScript) 升級到 ASP.NET (VBNET) ,下面是一個對照簡表:

項目

ASP

ASP.NET

.Net framework 類別

Visual Basic 命名空間

現在

Now

DateTime.Now

Microsoft.VisualBasic.Now

今天

Date

DateTime.Today

Microsoft.VisualBasic.Today

目前時刻

Time

DateTime.Now.TimeOfDay

Microsoft.VisualBasic.TimeOfDay

其中 DateTime.Now.TimeOfDay 是傳回 TimeSpan 型態,其他都是傳回 Date 型態 (DateTime)

可透過 New DateTime(DateTime.Now.TimeOfDay.Ticks) 轉回 Date 型別。
Categories: 技術分享 | 發表留言

微軟 TechNet 論壇版聚


今天 TechNet 論壇版聚,我約了顧問在結束後討論計畫的事,本來以為今天沒我的事,只是列席而已,沒想到居然頒獎的時候有我一份… 當時我可是傻眼了呢~
馬克杯跟球衣是每人都有,額外拿到萬國插座轉換器跟背包~
至於版聚的照片,等到 Cathy 整理好會發連結來,到時再轉給大家看吧~
 

Categories: 組織 | 發表留言

嚇一跳~ 微軟英文 MSDN 有連結指到這個 LiveSpaces


剛剛看統計資料時,有個奇怪的推薦網址,就點下去看:
 
疑?我的名字列在上面耶~
 
現任的 Visual Basic MVP 有 186 個,推薦的網誌只有 29 個~
 
我是非英語系的 blog ,居然也能列在這上面,讓我有點驚訝,不知道是 186 隨機選 29 還是有人看過,才把我的網誌放上去,我還是想隨便寫寫啦,網誌是放個人心情或是短篇的心得,沒辦法歸納彙整到網站去的小文章,列在 MSDN 上面有點壓力說~
 
給來自各地的網友,不是親朋好友的話:
我的網誌不是只有放 Visual Basic 的東西,純粹是依據我個人喜好來放,所以如果看到莫名奇妙的東西,跳過就好,不要太介意~ 當然也不用太期待,每次來會有啥好料的,最近太忙了,可能要到五月才會整理最近的東西,四月原則上沒空寫啥了。不過話又說回來,放在英文網頁上的網誌,點進來的可能是外國人,大概看不懂中文吧…
 
 汗~
Categories: 組織 | 發表留言

忙忙忙


最近很忙,忙著改程式,所以沒啥時間來寫 blog ,據說我這也有一些忠誠的讀者…
真是抱歉哪… 汗~
這週周六下午在台北世貿對面微軟有個小聚會,我會去一趟,因為飛機班次變疏了,所以訂末班機…
 
明天姐姐念的幼稚園要校外教學去鹽山跟頑皮世界,今天很乖的提早去睡了…
我還在努力打拼哪~ 不要再追加臨時工作給我了啦~
Categories: 娛樂 | 發表留言

Live Spaces 瀏覽人數破 70,000 人次


感謝各位親友踴躍點閱,依據 Live Spaces 統計資料來看,瀏覽人數已破 70,000 人次。
距上次發布破 60,000 人次 2007/3/13 來說,約 1 個月,平均每月 10,000 人次的點閱率,感謝大家的愛戴~
Categories: 娛樂 | 發表留言

[VBNET] 關於剪貼簿延後提出的處理


相關文章可看本網誌前篇:擷取 Word 檔內圖片工具

基本上 Office 的剪貼簿都是延後提出,若是送到剪貼簿的格式沒有標準格式,則必須用更複雜的方式處理。Word 會填入 System.Drawing.Bitmap ,但是 Excel 只有部分圖檔會填入,部份不會。
什麼意思嗎?先看看線上手冊關於 My.Computer.Clipboard 物件成員 的描述:
ContainsImage  判斷剪貼簿是否包含影像。這個方法只適用於伺服器應用程式
延後提出是不先把資料往剪貼簿送,而是告訴剪貼簿說,軟體提供哪些格式,等到剪貼簿收到貼上時,再把需求轉給軟體,這時軟體才把指定格式的資料送給剪貼簿,所以這類軟體就是屬於上面寫的伺服器應用程式
若要抓到所有圖檔,你必須用 System.Windows.Forms.Clipboard.GetDataObject.GetFormats 取得格式,例如說不提供 System.Drawing.Bitmap 的圖檔,可能格式是:
‘(0): "Office Drawing Shape Format"
‘(1): "EnhancedMetafile"
‘(2): "MetaFilePict"
‘(3): "PNG+Office Art"
‘(4): "JFIF+Office Art"
‘(5): "GIF+Office Art"
‘(6): "PNG"
‘(7): "JFIF"
‘(8): "GIF"
‘(9): "ActiveClipBoard"
再用:
Dim ms As MemoryStream = System.Windows.Forms.Clipboard.GetDataObject.GetData("PNG", True)
取回資料流,再用:
Dim picImage As System.Drawing.Image = System.Drawing.Image.FromStream(ms)
這部份比較複雜,那個簡單的範例不能完整包含。我自己是做個 ClipboardEx 類別來處理。 

提供 System.Drawing.Bitmap 格式的圖檔,會直接傳回 System.Drawing.Bitmap 物件,就不能透過 MemoryStream 來轉換。
不見得每種圖形都會提供 PNG 格式,例如有提供 System.Drawing.Bitmap 格式的情況,是傳回:
 ‘(0): "EnhancedMetafile"
 ‘(1): "MetaFilePict"
 ‘(2): "System.Drawing.Bitmap"
 ‘(3): "Bitmap"
 ‘(4): "Biff8"
 ‘(5): "Biff5"
 ‘(6): "Biff4"
 ‘(7): "Biff3"
 ‘(8): "Biff"
 ‘(9): "SymbolicLink"
 ‘(10): "Wk1"
 ‘(11): "DataInterchangeFormat"
 ‘(12): "XML Spreadsheet"
 ‘(13): "HTML Format"
 ‘(14): "System.String"
 ‘(15): "UnicodeText"
 ‘(16): "Text"
 ‘(17): "Csv"
 ‘(18): "Hyperlink"
 ‘(19): "Rich Text Format"
 ‘(20): "Embed Source"
 ‘(21): "Object Descriptor"
 ‘(22): "Link Source"
 ‘(23): "Link Source Descriptor"
 ‘(24): "Link"
 ‘(25): "Format129"
這種情況下用 "PNG" 是抓不到圖檔的。
我自己是宣告一個陣列,當要抓點陣檔時,看看哪種格式存在:
Private Shared m_BitmapFormat As String() = New String() {"Bitmap", "PNG", "GIF", "JPEG", "JPG", "JFIF", "System.Drawing.Bitmap"}

Categories: 技術分享 | 1 則迴響

[VBNET] 關於 MetaFile


這篇整理最近回覆網友的文章,相關文章可以查詢:

原發問者自己分的很散,分在下面三篇:
 
我做簡單的整理,就是原提問者在 VB2005 下用 Graphics 類別畫了個命盤,希望能順利插入 Word ,並可縮放。
跟 MetaFile 無關的我就跳掉,只整理跟 MetaFile 相關的部份。

Graphics 畫出來的只有兩種,一種是向量檔 (EMF),一種是點陣檔,點陣檔你不特別處理的往 Word 送話,會採用預設 bitmap 格式,反而造成檔案肥大,這樣是否妥切?(建議用 EMF 較佳)
 
建立 Graphics 後,當然用 Graphics.DrawString 來寫字。
GDI+ 只有包 API 裡面的 TextOut ,沒有包 DrawText ,所以更多的需求要自己去呼叫 API ,一般來說,DrawString 已經夠用了。
另外那篇有引用 回覆:關於繪圖  http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=1297399&SiteID=14
這篇裡面的圖,至少座標軸都有標文字,當然可以加文字。
使用 Graphics 時,不管是直接畫在 bitmap 還是 metafile ,都會受世界座標轉換影響,你自己看看,你是不是自己把座標定錯,畫到奇怪的位置了,metafile 不指定圖面範圍時,你所有畫的東西都會顯示在 emf 檔中,指定圖面範圍時才會裁剪。
這篇:動態文字轉圖檔範例 http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!397.entry
跟試用位置:http://tlcheng.twbbs.org/aspx/Tools/Count/FontEnum.aspx
裡面就有輸出為 emf 的範例,直接在 bitmap / emf 上寫文字,引用其中一段程式碼:


Select Case LCase(strExtName)
   Case "emf", "wmf"
      Dim emf As New cMetaFile
      emf.CreatePictureGraphics()
      grfx = emf.MyCreateMetaFileGraphics()
      pic = emf
   Case Else
      bmp = New System.Drawing.Bitmap(boxWidth, boxHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
      grfx = System.Drawing.Graphics.FromImage(bmp)
      pic = bmp
End Select

With grfx
   If Len(strBackgroundColor) > 0 Then
      .FillRectangle(bgColor, 0, 0, CSng(boxWidth), CSng(boxHeight))
   End If
   .DrawString(strNumber, axFont, axColor, ptf, strfmt)
   .Dispose()
End With


可看到 metafile / bmp 只是建立 Graphics 的來源不同,建立完成後,用同樣的 Graphics 填底色、畫字串,就完成文字轉圖檔了。  

高品質的縮圖都是採用混色運算,所以會把鄰近的顏色都混在一起,若改低品質的抽點運算,對於文字、線條則可能會發生掉線的情形。
最好的方法是輸出成向量檔,則會自動重繪,若不會輸出向量檔,標準作法是在每次 Paint 事件中重繪。
你可以參考前面關於 Paint 的相關討論:
http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=PAINT&localechoice=31748&SiteID=14&searchscope=allforums

在這篇:[VBNET] 如何支援 EMZ/WMZ

在 VBNET 下使用 MetaFile ,不需要管到 GetHdc、IntPtr ,除非你有 GDI+ 以外的需求,你可先從線上手冊的範例開始學習,若不夠你用,有一本這方面的聖經巨作 (中譯本):
Petzold, Microsoft Windows 程式設計-使用Visual Basic .Net
雖然這本是 VB2002 的書,不過觀念上及程式碼是互通,可以直接參考。
第 23 章整章討論 MetaFile 的建立,共 42 頁,另一篇回覆你的也說了,Bitmap 與 Metafile 只差在 Graphics 建立來源,所以本書其他章節的內容都可應用在 MetaFile 。當然,再 Windows API 下來看也是一樣,兩個只是建出來的 hDC 不同,其他針對 hDC 的動作都是一樣的。
http://www.kingsinfo.com.tw/item_detail.asp?pro_id=516
http://www.microsoft.com/mspress/taiwan/books/book20758.htm
最新的一本是改用 WPF 實做本書的內容,前一本則是用 WinAPI 實做相同的內容。
主要討論的內容為視窗繪圖(含印表機,印表機只是另一個 DC),附帶討論鍵盤、滑鼠,但不討論控制項,跟一般 VBNET 入門書完全是不同取向,全書共計 1,415 頁,仍只把整個視窗繪圖說了個大概,但已比一般書籍幾頁帶過或是一章帶過,完整多了,屬於字典級的叢書,是全球公認的聖經級巨作。

建立非實體的 EMF 可先宣告一個 MemoryStream 給 MetaFile 用即可。
線上手冊以 Stream 建立 MetaFile 的都是:
http://msdn2.microsoft.com/zh-tw/library/system.drawing.imaging.metafile.metafile(VS.80).aspx
以 MetaFile MemoryStream 為關鍵字就可以找到一堆範例:
http://www.google.com.tw/custom?domains=tlcheng.twbbs.org%3Btlcheng.spaces.live.com&q=MetaFile+MemoryStream&sa=Google+%E6%90%9C%E5%B0%8B&sitesearch=&client=pub-0932425128722654&forid=1&ie=utf-8&oe=utf-8&cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%23CAF99B%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3AFFFFFF%3BLBGC%3AFFFFFF%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BLH%3A30%3BLW%3A123%3BL%3Ahttp%3A%2F%2Ftlcheng.twbbs.org%2FComImage%2Flogobar_s.png%3BS%3Ahttp%3A%2F%2Ftlcheng.twbbs.org%2Fwwwmap.htm%3BFORID%3A1&hl=zh-TW

我所做的縮放程式碼使用:
Code Snippet
If dScale = 1 Then
     picImage.SizeMode = PictureBoxSizeMode.AutoSize
Else
     picImage.SizeMode = PictureBoxSizeMode.Normal
     picImage.Width = showImage.Width * dScale
     picImage.Height = showImage.Height * dScale
     picImage.SizeMode = PictureBoxSizeMode.StretchImage
End If
dScale 為縮放比例。
picImage 對應你 PictureBox1。
showImage 對應你的 m 。

請參考 MetaFile 建構函式關於 New MetaFile(Stream) 就是不需要 hDC 的作法。
hDC 是參考解析度,如果你建構函式省略 hDC ,則預設採用螢幕解析度,除非你打算參照印表機解析度,否則通常可省略。 
螢幕解析度約在 72 ~ 96 DPI ,印表機解析度起跳就是 200 DPI ,例如傳真印表機,目前實體印表機解析度多高達 1200 DPI 以上,但要參照印表機解析度時,需有該印表機驅動程式。
理論上可以自定解析度,不過我沒試過。
你直接在引數內使用 g.GetHdc ,則屬於自動釋放,會在 Windows 閒置時自動釋放,或程式結束時自動釋放,強制立即釋放回收資源可在變數生命週期外,呼叫 GC.Collect() 。

以下都是進一步的知識,是否要深入,就看個人選擇,說明只是為了讓這篇可以完整的結束。


WMF vs EMF
wmf 是 Windows 3.x (Win16) 內建的向量格式,Win32 改用 emf 。

主要差異在於 wmf 採用 2 bytes Integer 儲存座標,emf 採用 4 bytes 儲存座標,所以解析度本身就差很多。
標準 wmf 欠缺圖紙、圖面等關係,所以實際尺寸並不能對應到圖檔中,Office 4.2/4.3 有小改版 wmf 格式,稱為 wmf(p) ,在圖檔前方加上 22 bytes 來處理這個問題,但是並不直接被 Windows API 所支援。
EMF+
在 .Net 新增 emf+ 功能,若你需要高解析度時,兩種作法,一種參照較高解析度的印表機,達成座標轉換,一種使用 SizeF/PointF 等有帶 F 字尾的實數座標,讓 .Net 自動幫你轉換,所以實數座標在螢幕上或點陣檔作用不大,因為還要進位回整數座標,但實數座標對於向量檔效果滿大的。
當你使用到實數座標時,就是由 GDI+ 支援的 emf+ ,只使用整數座標,則是 emf 。
解析度
此外,由於 emf 可以自動縮小,所以早期另一種作法是畫很大的區域,在令其縮小,也就是說手動換算解析度。
比如說你原先座標為 0 ~ 100 ,則全部乘上 100 倍,則你的解析度就是 7200 ~ 9600 DPI 。當你顯示在螢幕上你會看不出效益(註:但字型縮放較平緩),但列印到印表機就會略有差異。(註:主要是點陣式及噴墨印表機會有差,繪圖機、雷射印表機採向量式列印,不受影響,這些以前我都評估過,所以正常使用下,我多半參照印表機解析度來處理)
其它軟體支援 
若你要結合前述複製貼上的方式時,最好還是回頭改用 emf+ ,否則有可能貼到 Office 文件下時,會是一個極大圖框。在 Office 中,不論是插入圖檔或是貼上 emf 時,都會依據 emf 檔頭描述的資訊來顯示圖檔大小,Word 可能依據頁寬自動縮小,則顯示出對應原始大小的百分比,所以要考慮到交換檔案時,最好座標系改用 cm/mm 等有對應實體大小的解析度,不要使用 Pixel 會依據 DC 不同而改變。

Office 中,Word / Visio / Publisher 軟體是參照印表機的 hDC ,其他如 Excel / PowerPoint 等則參照螢幕的 hDC 。
所以早期開啟 Word 時,若是沒有安裝印表機,Word 會跳出訊息框說找不到印表機,一般建議是至少安裝 Windows 內附的 Fax 虛擬印表機,可達 200 DPI 給 Word 參照用,Office 2003 則附贈 Microsoft Office Document Image Writer ,可達 300 DPI 。而 Visio / Publisher 若找不到印表機時,則會自動改參照螢幕的 hDC ,所以我自建的類別主要就是處理這段,未指定時,自動去參照印表機解析度,若沒安裝印表機時,則改參照螢幕解析度。 
一般解析度不同,也就是說設定不同印表機時,會發現自動換行可能稍微不同,這就是解析度差異的些微影響,但是仰賴 Word 排版時,可能排好的文章受到不同印表機影響,造成自動排版變化,比如說圖檔被擠到下一頁等問題,就只能先列印到虛擬印表機,才不會受列印裝置影響,最常見的解決方案就是用 pdf ,Office 2003 / Live Meeting 2005 以後就可以用 Microsoft Office Document Image Writer ,IE7 及 Vista 則提供新版的 Microsoft XPS Document Writer ,不過解析度仍以 pdf 較佳。 

2007/10/11 補充:
回覆:http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=2217460&SiteID=14

你不是 EMF 格式的 C.emf 應該是 png 格式。建議你用支援分辨格式的軟體解開來看看。

也有可能是一個 EMF 崁入一個 BMP 圖檔,可以用 Visio / PowerPoint 崁入後,解開群組,若能解開群組,就是一個點陣檔崁入向量檔。

我不知道你指的是哪段程式碼,因為那篇有滿多段落的,假設是最後一個回應時的程式碼:
Dim BitMap1 As New System.Drawing.Imaging.Metafile(stmMemory, ipHdc)

這段已經指出產生 Metafile 了。

使用上我通常用 MemoryStream ,這樣要直接輸出或是存成檔案都滿方便的,畢竟一個 EMF 通常都在 10 MB 以內,用 MemoryStream 暫存 EMF 不會太吃資源。

.Net 是包裝 Windows API 的,所以可以回頭去看 Windows API ,EMF / WMF 只有差在建立 hDC 時,其他都一樣,所以回過頭來看 Metafile 的建構函式,只有兩個:
Metafile 建構函式 (IntPtr, WmfPlaceableFileHeader)
Metafile 建構函式 (IntPtr, WmfPlaceableFileHeader, Boolean)

但是 WmfPlaceableFileHeader 額外檔頭的 WMF 是 Office 4.2 以後加入的特殊格式,不被 Windows API 直接支援。

而 WMF 是 EMF 舊版,由於座標為 2 bytes 整數,亦即表示在 600 DPI 解析度下,最大長寬為 32768 / 600 / 2.54 = 21.5 cm ,一張 A4 約是 29 cm * 21 cm ,表示連一張 A4 大小都不到,所以我根本不考慮 WMF 格式,因為沒意義,要是碰上更高解析度的印表機,例如 1200 DPI 的,只剩下 10 cm 。

我自己沒有特別處理 WMF ,.Net 直接另存 WMF 其實是 EMF ,用一些工具軟體也能看出來,然後去看 Metafile 建構函式,幾乎都是 EMF ,所以我自己是認為 .Net 內建類別新建、輸出只能處理 EMF ,WMF 應該是要自己呼叫 API 建立 hMF 的 DC,否則都是偽的。直接讀取 WMF 另存 WMF 才有可能,因為沒轉換到 EMF 。

我自己在做這方面主要都是為了列印,所以達不到列印需求的 WMF 我在 .Net 並沒有很花時間在研究,以前在 VB5/6 則是直接呼叫 API 來處理,呼叫 API 就只差在起始 hMF 的建立: 

EMF:
hMF = CreateEnhMetaFile(…)

WMF:
hMF = CreateMetaFile(…)

而且那時候好的雷射印表及最高也不過是 600 DPI (HP LaserJet 4/5/6),所以那時才會支援 WMF 。

將 EMF 另存為 WMF 在 API 上就更麻煩,要把一個個繪圖動作列舉出來,然後將 4 bytes 整數轉成 2 bytes 整數,還有部分繪圖動作在 WMF 上不支援,我自己沒有需求的前提下,沒打算搞這個。

Categories: 技術分享 | 1 則迴響

[轉載]今天 SQL Server 2005 SP2 的更新令人困惑…


相關訊息及後續討論請參閱:今天 SQL Server 2005 SP2 的更新令人困惑…

同時放出下載一樣的標題與描述有兩個,不一樣的連結、不一樣的版本,不一樣的 KB ,不一樣的大小…


SQL Server 2005 SP2 更新

下載 SQL Server 2005 SP2 的更新。此更新可以解決 GO 陳述式之間,儲存「檢查資料庫完整性」和「執行 T-SQL」工作失去資料庫內容的問題。

版本:

09.00.3054.00

Knowledge Base (KB) Article:

KB934458

發佈日期:

2007/4/3

語言:

繁體中文

下載項目大小:

18.2 MB – 36.1 MB*

SQL Server 2005 SP2 更新

下載 SQL Server 2005 SP2 的更新。此更新可以解決 GO 陳述式之間,儲存「檢查資料庫完整性」和「執行 T-SQL」工作失去資料庫內容的問題。

版本:

09.00.3159.00

Knowledge Base (KB) Article:

KB934459

發佈日期:

2007/4/3

語言:

繁體中文

下載項目大小:

92.5 MB – 167.0 MB*

兩個 KB 的內容只差在標題上版號差異,內文的版號寫的一樣,看起來是

3042, 3053 會升級到 3054

3150, 3158 會升級到 3159


用 Management Studio 連進去後,看物件總管上面寫的:
[ServerName] (SQL Server 9.0.xxxx – [Computer][User]
xxxx 為版號。

3042 是 SP2 剛灌完的版本… 3050 是我目前的版本…
3053/3054/3150/3158/3159 到底是?

 待會按順序灌灌看好了…

我自己目前安裝這兩個更新是採用比較保守的方式:
先把 3050 升級到 3054 ,再把 3054 升級到 3159 ,目前我的版號是 3159 ,若是有人試過可直接跳板號升到 3159 時,請不吝分享給大家。

Categories: 資料庫 | 2 則迴響

在WordPress.com寫網誌.

%d 位部落客按了讚: