2010年4月22日 星期四

如何取得Media Player版本?

如何取得Media Player版本?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaPlayer\Setup\Installed Versions
function GetWMPlayerVersion(out Major, Minor, Revision, Build: Word): boolean; 
var 
Reg: TRegistry; 
Version: array [0..1] of Cardinal; 
begin 
Result := False; 
Reg := TRegistry.Create; 
try 
Reg.RootKey := HKEY_LOCAL_MACHINE; 
if Reg.OpenKey('\SOFTWARE\Microsoft\MediaPlayer\Setup\Installed Versions', False) then 
begin 
Result := Reg.ReadBinaryData('wmplayer.exe', Version, SizeOf(Version)) = SizeOf(Version); 
Major    := HiWord(Version[0]); // Hauptversion  (Major) 
Minor    := LoWord(Version[0]); // Nebenversion  (Minor) 
Revision := HiWord(Version[1]); // Ausgabeversion (Revision) 
Build    := LoWord(Version[1]); // Buildnummer  (Build) 
Reg.CloseKey; 
end; 
finally 
Reg.Free; 
end; 
end; 

procedure TFormX.ButtonDingsClick(Sender: TObject); 
var hv, sv, sv2, bv: word; 
begin 
if GetWMPlayerVersion(hv, sv, sv2, bv) 
then Label1.Caption := format('Mediaplayer Version: %d.%d.%d Build %d', [hv, sv, sv2, bv]) 
else Label1.Caption := format('Mediaplayer Version: %s', ['konnte nicht ermittelt werden.']); 
end;


另外的參考

function GetFileVersion(Datei : TFileName) : String; 
//Ermittelt die Programmversion 
var 
VerInfoSize, VerValueSize, Dummy : DWord; 
VerInfo                          : Pointer; 
VerValue                         : PVSFixedFileInfo; 
begin 
VerInfoSize := GetFileVersionInfoSize (PChar (Datei), Dummy); 
//Speicher anfordern 
GetMem (VerInfo, VerInfoSize); 
//Versionsinformationen der Datei abfragen 
GetFileVersionInfo (PChar (Datei), 0, VerInfoSize, VerInfo); 
VerQueryValue (VerInfo, '\', Pointer (VerValue), VerValueSize); 
with VerValue^ do 
begin 
//Einzellne Versionsschritte zusammenfassen 
result := IntTostr (dwFileVersionMS shr 16); 
result := result + '.' + IntTostr (dwFileVersionMS and $FFFF); 
result := result + '.' + IntTostr (dwFileVersionLS shr 16); 
result := result + '.' + IntTostr (dwFileVersionLS and $FFFF); 
end; {with - VerValue^} 
//Speicher Freigeben 
FreeMem (VerInfo, VerInfoSize); 
end; 

GetFileVersion(Dateiname);

2010年4月20日 星期二

製作安裝程式測試

一直以來,我都是用著Wise 9.02來製作安裝程式,但由於此版本過於老舊,因此像是Unicode、圖示等問題,都只能使用其他方式處理,幾年前曾經測過Wise 4(可能版本號太多,所以版本號又重頭開始),但因為無法正常做出一個安裝程式,試了老半天最後放棄。

隨著Vista、Win7出來,Wise 9.02越來越無法使用,像是安裝後無法在桌面上產生圖示的問題,因此這幾天決定將市面上能找到的安裝程式製作軟體全部進行測試,找出一套可以符合需求並且能解決一些奇怪問題的系統。



測試重點
  1. 支援繁體中文
  2. 支援Win7桌面上建立捷徑
  3. 安裝程式執行結束後可呼叫執行檔
  4. 支援安裝中文路徑
  5. 安裝畫面可調整
測試的系統
  1. Install Shield:看到這尊大佛高達500mb容量,就直接先跳過了。
  2. Smart Install Maker:各項功能都符合,致命點是安裝的時候他的層級一定要程式集\公司名稱\程式名稱,另外資料夾名稱會檢查是否有保留字,所以中文名稱有用到*\這些保留字就用不了,所以放棄。
  3. Inno Setup:只能用Script的方式編寫,我不曉得誰有那閒功夫去慢慢了解他所有的Script的寫法,重點是最後可能發現無法符合需求。
  4. nsis2.46:完全不曉得在做什麼。
  5. Setup2Go 1.911:不支援Vista以上,畫面無法修改文字,一定要選語系,無法使用
  6. CreateInstall 5.6:不支援繁體中文字。
  7. InstallConstruct 7 :看起來好像不錯,但畫面調整起來不太順,找不到暗黑程式,所以也用不了。
  8. Setup Specialist 2002:畫面無法調整。
  9. Install Creator:用起來各項功能都可以,但是產生的安裝檔居然不能包含有Install、Setup的字眼,如果有這些字眼,則桌面上不會產生圖示。
  10. Quick Install Maker: 在windows 2003上連裝都不能裝
  11. Setup Factory:所有我要的功能都符合,還有下面優點:
  • 畫面調整後可立即Preview,不用編譯製作出安裝檔再觀看是否有問題
  • 提供非常多國家Language,但不是指介面,是指再製作安裝檔時,如果選擇繁體中文,畫面他會自動幫你顯示成繁體中文畫面,節省不少時間。
  • 提供很多的Skin供你選用。
  • 可直接用勾選的方式選擇系統要再哪邊建立捷徑
  • 非常好上手,如果只是想測試大約一分鐘就能打包一個安裝程式出來觀看結果
  • 可打包VS.NET 3.5
  • 支援Win7、Vista、2008 Server
      一些小問題
  • 某些畫面第一個中文字會糊掉,要注意一下,解決方式是在中文字前面空一格
  • 打包速度較慢
  • 目錄不支援中文,一樣是保留字問題,但由於他有強的Script系統,因此我去找了他下一步的事件,在事件中找到了以下Script
-- These actions are performed when the Next button is clicked.
-- get the text from the combo box
strShortcutFolder = DlgComboBox.GetProperties(CTRL_COMBOBOX_SHORTCUTFOLDERS).Text;
-- if the shortcut folder path is empty, display a message
 -- if it isn't empty, check for invalid characters and advance to the next screen

if String.Length(strShortcutFolder) == 0 then
-- the field is empty...
-- come on user, don't be shy :)
local strTitle = SetupData.GetLocalizedString("MSG_INVALID_ENTRY");
local strPrompt = SetupData.GetLocalizedString("ERR_FIELD_CANNOT_BE_EMPTY");
Dialog.Message(strTitle, strPrompt, MB_OK, MB_ICONEXCLAMATION);
else
-- the field's not empty...
-- make sure the shortcut folder path contains only valid characters for a relative path
if g_ContainsValidRelativePathChars(strShortcutFolder) then
-- advance to the next screen
Screen.Next();
else
-- the shortcut folder contains invalid characters
-- tell the user to smarten up :)
local strTitle = SetupData.GetLocalizedString("MSG_INVALID_ENTRY");
local strPrompt = SetupData.GetLocalizedString("ERR_INVALID_CHARACTERS") .. "\r\n/ * ? \" < >
:";
Dialog.Message(strTitle, strPrompt, MB_OK, MB_ICONEXCLAMATION);
end
end
意思就是不如果目錄不為空值的時候系統就檢查是否包含保留字,因此我就將檢查那段拿掉,也就可正常運作了
感想
以前就曾經有兩次花時間去找可以製作安裝檔的程式,但每次都沒找到真正可用的,而且沒做記錄每次都重找一次,這次特別作個記錄,包含測試過的軟體跟版本,如果未來還要找,可依此參考,原本Setup Factory第一次是測7版,7版功能已經很完整,但有個奇怪的問題,就是當選擇只為目前的使用者安裝捷徑時,桌面捷徑在Win7就跑不出來,一定要選為所有使用者安裝捷徑桌面才會出現捷徑,我一直懷疑桌面捷徑這問題,一定是微軟搞的鬼,不然怎麼會每一套系統都有相同的問題,甚至我用API直接寫一支程式在執行完,自動產生捷徑,並且丟到桌面都沒辦法,還好他到了8版的時候解決了這個問題,而且看起來也解決了捷徑圖示殘留的問題。
捷徑殘留的問題也不曉得微軟在做什麼,這麼多年了,都未見修改這個問題,只要程式一用上一種圖示,在裝過的電腦上,永遠也擺脫不了那張圖。
暗黑程式
http://www.crackfound.com/crack.cgi

2010年4月18日 星期日

What The Hell Happened To Syble 3

http://www.youtube.com/watch?v=9k1nzqCnbA4

這是我玩花式第一個練的複雜的花式切牌,原作者是Brian Tudor,他的速度簡直快的不可思議,這個動作他只要六秒就能完成,我練了好久,甚至這個影片都已經是2009年初拍的到現在,還是最快只能8秒,在追求極限上我想應該就是天分的問題了,我的極限大概就是這樣了。

Vista、Win7的音量控制

最近在為公司產品改版,處理Vista、Win7以上,Windows將音量控制改為每個應用程式都能有自己的音量控制,但舊有音量控制依然保留,舊有的音量控制目前的理解是控制在系統中會使用到的發出聲音的元件,新的則是控制系統本身所發出的聲音,但不瞭解為什麼要做成這個樣子,這麼說是甚麼意思呢?舉個例來講,就是用新的方式控制自己的系統,但如果系統中用到了Flash則使用舊的控制音量作法去控制。

因為系統要相容各種版本的Windows,所以系統必須去偵測使用者現在用的作業系統是甚麼,用那個作業系統的方式來控制音量,結果又讓我發現了Windows一個奇怪的地方,就是當使用者使用相容性模式執行你的程式時,不管你去讀Registry或者使用API去取得Windows的版本都會得到使用者選擇相容性的那個Windows版本,也就是說如果使用者選用相容XP,那麼程式就不曉得現在系統真正在哪種作業系統上運作,因此也就無法正確去控制音量,我可以理解Windows為了讓一些程式偵測成舊版Windows,使用舊版的模式去執行的方式,但也該提供一個可以真正取得Windows版本的方式吧,否則產生這樣的衝突又要設計者如何處理呢?也許有,但我找不到,結果最後我另外寫了一個前導程式,在程式安裝完的時候,趕快去執行,取得真正的Windows,然後寫入一個ini檔,讓真正的系統去讀ini來得到真正的Windows版本,繞了一大圈。