Feeds:
文章
留言

Archive for 五月 23rd, 2006

Winrar 自解安裝程式

最近使用 C# 開發的程式需要打包成安裝程式給其他人使用,由於產生的安裝程式除了 Setup.exe 之外,於是想透過 WinRar 包成自解壓縮檔來建立單一執行檔,可是如果只是自解檔,還是太遜了… 想到之前 Microsoft 的 zip 自解檔解開後都可以自己進行安裝,也許 Winrar 也可以,果然 WinRAR 線上手冊[1]和網路上有一堆教學文件[2],下面是摘錄自 WinRAR 的線上手冊

   使用這兩種模組您可以建立 GUI (圖形模式) 自我解壓縮檔 的 32 位 Windows 版本(Windows 95、98、NT 等等),這些模組無法在 Windows 3.1 或 DOS 下執行。
   使用 Default.SFX 模組於 RAR 壓縮檔案 以及 Zip.SFX 於 ZIP 壓縮檔案。
   這些模組均支援簡易的 Setup 命令,您可以將 Setup 命令?述加入到自解檔 壓縮檔註解 中。下面是 Setup 命令的?述,在命令上按一下可獲得詳細敘述。
Delete 解壓縮前先刪除檔案
License 顯示程式的使用授權協定
Overwrite 選擇檔案的覆寫模式
Path 設定預設目標路徑
Presetup 指定解壓縮前執行的程式
SavePath 儲存目的地路徑
Setup 指定解壓縮後執行的程式
Shortcut 建立解壓縮檔案的捷徑
Silent 跳過開始時的對話方塊
TempMode 解壓縮檔案到暫存資料夾
Text 加入純文字到自解檔對話方塊純文字視窗
Title 設定自解檔對話方塊標題
這裡您可以檢視 完整安裝指令碼的簡易範例。
注意
在自解檔模組包含的 Windows 資源是可以修改成您所需要的樣子的。例如,您可以在起始對話方塊中顯示您希望的點陣圖。WinRAR 並不提供修改資源的工具或檔案,如果您要如此做的時候,您必須有資源編輯器,並要熟悉怎麼操作。但如果標準的自解檔對話方塊即可滿足您的話,您就不需要再修改資源。

依據上述的說明,建了一個符合我的安裝程式樣本如下
Title=Learning agent 安裝程式
Text=text
License=Learning agent 安裝程式
{
Learning agent 安裝程式<br/>
本程式由 Chui-Wen Chiu 設計<br/>
<br/>
<a href = ‘http://61.221.176.159:2527/agent/’/>官方網站</a&gt;
}
Setup=setup.EXE
TempMode=開始安裝?@Learning agent 安裝程式
Silent=2
Overwrite=1
將上述樣本存成檔案,未來可以重複使用
建立自動安裝的自解壓縮步驟如下:
1. 檔案總管中選取要壓縮的檔案
2. 選擇"加到壓縮檔(A)"
3. 如下圖填入壓縮檔名,勾選"建立自我解壓縮檔案(X)"

4. 如下圖將剛剛建立的樣本選取進來

  

5. 按下確定產生自解檔
6. 當你點選自解檔時,會如下圖出現一個版權宣告視窗,詢問你是否接受,按下接收後會問你是否要進行安裝,當你按下"是"的時候,就會啟動 setup.exe
參考資料:
[1] WinRAR 線上手冊
[2] http://arch.pconline.com.cn/pcedu/soft/gj/zip/10209/94168.html

Read Full Post »

想不到又從 C# 退回 C++ 了…
今天又要開始一個新案子,這個案子原本想使用C#重寫,不過礙於時程壓力,只好將之前寫的程式再加上 Http Request 功能,那 BCB 怎麼使用 Http Request 呢?如果用 C# 可以很簡單的 HttpRequest 類別,但是 BCB "似乎"(好吧,我對於他提供的東西不是這麼熟悉)沒有提供類似的類別,那只好自己打造一個了,那要怎麼開始呢?
找找找…. 突然想到之前看到 Tidy 元件好像有支援一個 Http 元件,是什麼呢?啊ㄏ~ 就是 TIdHttp … 可是怎麼用呢?這就是我不喜歡用 BCB 的其中一個原因"說明文件不齊全" -_-b
 
還好活在現代有 Google 大神可以用,查了一下 TIdHttp 的範例,天啊怎麼都是 Delphi 範例 -_-|||
 
由於沒有研究過 Delphi 只好逐一猜測寫法,終於整理出一個簡單的範例,可以傳送 Http Reqeust 和接收 Http Response 

// BCB Client
  AnsiString username = "cwchiu";
  AnsiString password = "test";
  AnsiString url = "http://192.168.163.128/request.php";
 
  // 產生 POST 參數
  std::auto_ptr<TStringStream> request(new TStringStream(""));
  request->WriteString(URLEncode("username="+username));
  request->WriteString("&");
  request->WriteString(URLEncode("password="+password));
  // Respose 接收
  std::auto_ptr<TStringStream> response(new TStringStream(""));
  // 通訊埠
  IdHTTP1->Port = 80;
  //
  IdHTTP1->Request->ContentType = "application/x-www-form-urlencoded";
  // 傳遞資料
  IdHTTP1->Post(url, request.get(), response.get());
  // 接收 Respose 資料
  AnsiString result = response->DataString;

// PHP server
<?php
if ($_POST[‘username’] == ‘cwchiu’ && $_POST[‘password’] == ‘test’) {
    echo "YES";
}else{
   echo "NO";
}
?>
 

Read Full Post »

今天看了曹祖聖的關於IE對於ActiveX行為改變的線上教學,做了以下的筆記。(ps. 這份線上教學講的相當詳細,可以從[1]取得)

IE 預設會對於 Object, Embed 和 Applet 等標籤限制啟動功能。必須點選該控制項後才能使用,未啟動的情況下,雖含控制項仍會執行但無法與使用者互動。

要解決上述問題,基本概念是透過 Script 動態產生控制項標籤。實作方式分為兩類:
1. DHTML
  1.1 document.write 輸出 ActiveX 控制項標籤
 ex: document.write("http://test.wmv");
  1.2 使用 outerHTML 輸出 ActiveX 控制項標籤
   ex:
   document.getElementById(‘div’).outerHTML= "http://test.wmv";
  1.3 使用 innerHTML 輸出 ActiveX 控制項標籤
   ex:
   document.getElementById(‘div’).innerHTML= "http://test.wmv";
2. DOM   
   ex:
   var ctr = createElement("embed");
   ctr.src = "test.wmv";
   document.getElementById(‘div’).appendChild(ctr);

注意事項
1. 以上方法必須將 IE "網際網路選項|進階|瀏覽|停用指令碼除錯(Internet Explorer)"功能取消才能正常運作。
2. Javascript 不能輸出一個 <script> 標籤,且標籤內含 ActiveX 標籤輸出
3. Javascript 無法判斷控制項是否被啟用。

補充:
1. IE 使用 EnabledWindow Win32 API 啟用/關閉互動控制項
2. IE 透過 ActiveX 容器攔截非互動控制項的 Windows 訊息
3. 程式判斷控制項是否啟用的方法:
   3.1 使用 COM IDispatch 介面的 Invoke 方法檢查 DISPID_AMBIENT_UIDEAD 屬性
   3.2 使用 IOleControl 介面的 OnAmbientPropertyChange 事件
4. 控制項實作 IAccessible 介面處理未啟動情況下的行為[2]
5. 內嵌 WebBrowser 控制項的程式不會阻擋 Applet, Object 和 Embed 控制項
   ps. 如果要與 IE 有相同的行為模式,兩個方法
   1. 將 DOCHOSTUIINFO 結構的 dwFlags 加入
     DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE 旗標。
   2. 修改 Register
     HKLMSOFTWAREMicrosoftInternet ExplorerMainFeatureControlFEATURE_ENABLE_ACTIVEX_INACTIVATE_MODE 加入一個 DWORD 名稱為你的應用程式執行檔(如: arick.exe)其值設為 1
6. 控制項可以送交 Microsoft 註冊,使控制項預設為啟動狀態。

參考資料:
[1] http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-tw&EventID=120468218
[2] Microsoft Active Accessibility Start Page, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msaa/msaastart_9w2t.asp

Read Full Post »