Windows installer error, Error Code : 2869

在 Windows 7 下,安裝一 *.msi 程式,運行時卻產生錯誤:2869.

這問題要如何排除?

Google 一下,得到一文章:
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/c1326233-3f10-4d98-96a7-4a22e5eeaa2d/

提到,先建置一 vbs 檔案,以修正環境的設定值。其方法如下:
1. 建置 NoImpersonate.vbs (本文的後端會詳述內容)
2. 運行 VBS。
    cscript NoImpersonate.vbs <msi-file>
    ex: cscript NoImpersonate.vbs "Lorom ERP Develop Setup.msi"
3. 再重新執行一次 MSI。

check this link : http://msdn2.microsoft.com/en-us/library/aa368069.aspx

NoImpersonate.vbs 程式碼,條列
'------------------------------------------------
Option Explicit
'' Constant values from Windows Installer
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyInsert = 1
Const msiViewModifyUpdate = 2
Const msiViewModifyAssign = 3
Const msiViewModifyReplace = 4
Const msiViewModifyDelete = 6
Const msidbCustomActionTypeInScript = &H00000400
Const msidbCustomActionTypeNoImpersonate = &H00000800

Dim databaseFile
Dim installer : Set installer = Nothing
Dim database : Set database = Nothing
Dim sql
Dim View, Record
Dim openMode : openMode = msiOpenDatabaseModeTransact
On Error Resume Next

Call Main()

Sub Main()
   If WScript.Arguments.Length <> 1 Then
      Fail("Usage is: cscript " & WScript.ScriptName & " [msi file]")
   End If
   databaseFile = WScript.Arguments(0)
   'WScript.Echo(WScript.ScriptName & ": operating on file '" & databaseFile & "'")
   '' Instantiate Windows Installer object
   Set installer = WScript.CreateObject("WindowsInstaller.Installer") : CheckError
   '' Open the MSI database
   Set database = installer.OpenDatabase(databaseFile, openMode) : CheckError
   Proc1 : CheckError
   'Proc2 : CheckError
   If openMode = msiOpenDatabaseModeTransact Then
      database.Commit
   End If
   WScript.Quit 0
End Sub

Sub Proc1()
   '' 1. problem: CustomActions in Vista have to run with NoImpersonate
   sql = "SELECT `Action`, `Type`, `Source`, `Target` FROM `CustomAction`"
   Set View = database.OpenView(sql) : CheckError
   View.Execute : CheckError
   Do
      Set Record = View.Fetch
      If Record Is Nothing Then Exit Do
      'typeVal = Record.IntegerData(2)
      If (Record.IntegerData(2) And msidbCustomActionTypeInScript) <> 0 Then
         'WScript.Echo "Here 1, Type=" & Record.IntegerData(2)
         Record.IntegerData(2) = Record.IntegerData(2) Or msidbCustomActionTypeNoImpersonate
         'WScript.Echo "Here 2, Type=" & Record.IntegerData(2)
         View.Modify msiViewModifyReplace, Record : CheckError
      End If
   Loop
   View.Close
End Sub

Sub Proc2()
   '' 2. problem: explicit format User-Errors, otherwise they are not visible in Vista, the User just sees Error 2869
   sql = "INSERT INTO `Error` (`Error`, `Message`) VALUES (1001, 'Error [1]: [2]')"
   Set View = database.OpenView(sql) : CheckError
   WScript.Echo "Here 2"
   View.Execute : CheckError
   WScript.Echo "Here 3"
   View.Close
End Sub

Sub CheckError
   Dim message, errRec
   If Err = 0 Then Exit Sub
   message = Err.Source & " " & Hex(Err) & ": " & Err.Description
   If Not installer Is Nothing Then
      Set errRec = installer.LastErrorRecord
      If Not errRec Is Nothing Then message = message & vbLf & errRec.FormatText
   End If
   Fail message
End Sub

Sub Fail(message)
   Wscript.Echo message
   Wscript.Quit 2
End Sub
'------------------------------------------------

Code snippet 工具程式的使用範例

   1: <?php



   2: //$host = "localhost";



   3: $host = "instance19216.db.xeround.com";



   4: $port = "12784";



   5: $db    = "school";



   6: $user    = "perton";



   7: $pass    = "12345";



   8:  



   9: //$conn = mysql_pconnect("mysql:host='instance19216.db.xeround.com:12784';dbname=$db", $user, $pass);



  10: $conn = mysql_pconnect("instance19216.db.xeround.com:12784","perton","12345");



  11:   if (!$conn)



  12:     die('Could not connect: ' . mysql_error());


  13:   mysql_select_db("school");



  14:  



  15:  



  16: $sql = "SELECT * FROM student";



  17: $q     = $conn->query($sql) or die("failed!");



  18:  



  19: while($r = $q->fetch(PDO::FETCH_ASSOC)){



  20:   echo $r['name'] . "<br />";



  21: }



  22: ?>


將 saveXML() 的內容呈現在螢幕上

看下程式碼,就會明白

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ex19-2</title>
</head>
<?php
$dom = new DOMDocument('1.0', 'utf8');

// 建立根元素 <companies>
$root = $dom->createElement('companies');
$root = $dom->appendChild($root);

// ----------------------------------
// 建立新的 <company> 節點
$company = $dom->createElement("company");
$root->appendChild($company);

// 建立 <company> 節點的子節點 <name>
$name = $dom->createElement("name");
$name->nodeValue = "松崗資訊股份有限公司";
$company->insertBefore($name, $company->firstChild);
// 建立 <company> 節點的子節點 <short>
$short = $dom->createElement("short");
$short->nodeValue = "松崗圖書";
$company->appendChild($short);

// ----------------------------------
// 建立新的 <company> 節點
$company = $dom->createElement("company");
$root->appendChild($company);

// 建立 <company> 節點的子節點 <name>
$name = $dom->createElement("name");
$name->nodeValue = "樂榮工業股份有限公司";
$company->insertBefore($name, $company->firstChild);
// 建立 <company> 節點的子節點 <short>
$short = $dom->createElement("short");
$short->nodeValue = "樂榮工業";
$company->appendChild($short);

// 會讓 xml 文件以有換行、內縮效果
$dom->formatOutput = true;

// 將 xml 內容,呈現在螢幕上
echo "<xmp>" . $dom->saveXML() . "</xmp>";

// 儲存 XML 文件 publisher.xml
$dom->save('publisher.xml');
?>
</body>
</html>

程式效果,如下:

<?xml version="1.0" encoding="utf8"?>


<companies>


  <company>


    <name>松崗資訊股份有限公司</name>


    <short>松崗圖書</short>


  </company>


  <company>


    <name>樂榮工業股份有限公司</name>


    <short>樂榮工業</short>


  </company>


</companies>


 


產生 XML 檔案曾遇到過的疑惑

從接觸到 XML 領域後,就知道可以應用 DOM 來產生 XML 文件檔案。
而且,幾乎提到產生 XML 檔案的書籍,也都會提到下列相似的程式碼(以 PHP 為範例)

<?php
$dom = new DOMDocument('1.0', 'utf8');

$root = $dom->createElement('companies');      // 建立根元素 <companies>
$root = $dom->appendChild($root);

// 建立新的 <company> 節點
$company = $dom->createElement("company");
$root->appendChild($company);

// 建立 <company> 節點的子節點 <name>
$name = $dom->createElement("name");
$name->nodeValue = "清松資訊股份有限公司";
$company->insertBefore($name, $company->firstChild);

$short = $dom->createElement("short");
$short->nodeValue = "清松圖書";
$company->appendChild($short);

// 儲存 XML 文件 publisher.xml
$dom->save('publisher.xml');
?>

上述程式碼,會產生如下結果:
<?xml version="1.0" encoding="utf8"?>
<companies><company><name>清松資訊股份有限公司</name><short>清松圖書</short></company></companies>

但是,使用 Chrome 瀏覽器觀看,則正常。(** 有 提醒 訊息)
image

難道,產生的文件檔案一定要由程式中,自動加入"內縮"的空白字元?

針對這疑惑,終於找到好的解決方法。

只要在 存檔 save() 之前,加一指令即可改善。

// 會讓 xml 文件以有換行、內縮效果
$dom->formatOutput = true;

新修正的程式碼:

<?php
$dom = new DOMDocument('1.0', 'utf8');

$root = $dom->createElement('companies');      // 建立根元素 <companies>
$root = $dom->appendChild($root);

// 建立新的 <company> 節點
$company = $dom->createElement("company");
$root->appendChild($company);

// 建立 <company> 節點的子節點 <name>
$name = $dom->createElement("name");
$name->nodeValue = "清松資訊股份有限公司";
$company->insertBefore($name, $company->firstChild);

$short = $dom->createElement("short");
$short->nodeValue = "清松圖書";
$company->appendChild($short);

// 會讓 xml 文件以有換行、內縮效果
$dom->formatOutput = true;

// 儲存 XML 文件 publisher.xml
$dom->save('publisher.xml');
?>

上述程式碼,會產生如下結果:
<?xml version="1.0" encoding="utf8"?>
<companies>
  <company>
    <name>清松資訊股份有限公司</name>
    <short>清松圖書</short>
  </company>
</companies>

Remote Connection Error !! (2)

記得以前曾作過記錄,連接遠端電腦時,發生”網路提供者都不接受的網路路徑”錯誤。
當時的答案是 勾選 File and Printer Sharing for Microsoft Networks 功能。

不料,今天卻發生同樣的錯誤,但 File and Printer Sharing for Microsoft Networks 功能已涇被勾選,怎會這樣呢?

再次重啟 改變window防火牆設定(change Windows Firewall setting),
 image

image

image

原來,防火牆的進階設定,還有一個控制點。
把它 勾選 起來吧。

Android 命名趣聞

 

 image 可愛的小綠人
你是誰?

你是吃什麼長大?

據說,你家族成員都有吃 甜點 嗜好,是這樣嗎?

讓我們來看下你們的家族譜
image

HyperLink 超連結 功能在 Excel 上的應用技巧

日前,在整理 PHP Plug-ins 資料,再次遇到"一堆"超連結的資料清單。
才讓我想到,在 Excel 環境中,要如何去 快速 處理超連結的問題;另外未防日後健忘,就順手做下此一筆記。

Excel 環境中,要 快速 處理超連結的問題,有二:

  1. 快速移除即有的超連結設定
  2. 為一批清單資料,設定相對於每一項目的超連結

問題一:快速移除即有的超連結設定
image 今要移除每一項目的超連結

步驟:

  1. 在空白儲存格上鍵入 1,接著以滑鼠右鍵按一下此儲存格。
  2. 按一下快顯功能表上的 [複製]
  3. 按住 CTRL ,選取您想要停止的 超連結 項目,或區域的起首,並可配合 CTRL 逐一選取或者是 SHIFT 整區選取。
  4. 按一下 [編輯] 功能表上的 [選擇性貼上]
  5. [運算] 方塊中,按一下 [乘],接著按一下 [確定]

image

image

 

 問題二:為一批清單資料,設定相對於每一項目的超連結
              (希望為顯示文字 Col A 的每一項目,設定其各別的超連結 Col B)

image

C1 = HYPERLINK(B1, A1)

image

一次抓取 MSSQL 數據資料的意外

在學習 PHP & 使用 Eclipse 的過程中,曾記錄下一篇心得文章:PHP PDO 連接 MSSQL 資料庫遇見過的問題

依著那些自信,還以為日後抓取數據庫資料可能會一帆風順,不料短短一天,就破功了。 #$%#$%…

使用如下的程式碼:(截錄)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>IEDB01-iepa00h</title>
</head>
<body>

<?php
try
{
    define(sp, '&nbsp;');
    // 設定 MSSQL 資料庫的 DSN
    $dsn = 'mssql:host=localhost;dbname=DB01;';
    $user = 'sa';
    $password = 'DB20120604';
    // 建立 PDO 物件
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

卻產生下面的中文亂碼情形 !!

image

心中真是 ⅩⅩ○○…
明明同樣的程式,之前是可以正常運作了,怎會今天就停擺?

心有不干,不把問題找出來,那會心安?
於是,重新再從資料庫字碼的設定及抓資料的程式碼存檔等方面找起,一切多符合先前所列的規則。
最後,只能比較不可正常運行及可正常運行程式檔案的大小內容

結果發現到 不可正常運行 與 可正常運行 的檔案,有差異。
不可正常運行的檔案會比可正常運行的檔案多出 3 Bytes

有的這樣的發現,就好辦了;接下來就是 Hex 的比對。
不可正常運作:
image

可正常運作:
image 

哦,這下明白了。

EF BB BF 這三碼不就是 Unicode 的 BOM 嗎?(可參考文章)

補充說明:
要去除多餘的 3 Bytes 資料,可以使用 PSPad 工具程式開啟該檔案,重新設定檔案的格式並存檔,即可解決問題。
image

至于,為什麼會產生 3個多餘的字元,就只能等以後有空再查證了。

願這篇文章能對你有所助益 !!  ( 神:願你平安 )

PHP PDO 連接 MSSQL 資料庫遇見過的問題

很高興,在 PHP 的學習過程中可以學到 PDO 的技巧。

根據書本中的範例,逐一建置 MySQL 的資料庫,並引入相關參考數據到資料表中;可以正常抓取到資料並顯示出來,這其中當然也包含有中文字。
[補充說明一下,範例中的資料庫字碼的設定及抓資料的程式碼存檔,都是以 UTF-8 處理。]

<?php
try
{
    // 設定 MySQL 資料庫的 DSN
    $dsn = 'mysql:host=localhost;dbname=ch18;';
    $user = 'daniel';
    $password = '123456';
    // 建立 PDO 物件
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 設定 MySQL 資料庫的字元編碼
    $pdo->query('set character set utf8');

可能是試做很順利,所以就想到是不是也可以抓取現有使用的MSSQL資料庫?
於是,就改寫原本的程式碼:

首先,
先入有關 HTML 的相關標籤,在 <?php … ?> 之前,並在 ?> 之後,補入 </body></html>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IEDB01-iepa00h</title>
</head>
<body>

再來是修改讀取 MSSQL 的相關設定

// 設定 MSSQL 資料庫的 DSN
$dsn = 'mssql:host=localhost;dbname=DB01;';
$user = 'sa';
$password = 'DB20120604';

// 建立 PDO 物件
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

並將 設定 MySQL 資籿庫的字元編碼指令加以關閉 (對於 MSSQL 該指令無效 !!)

// 設定 資料庫的字元編碼
//$pdo->query('set character set utf8');

此時,心想這樣應該一切順利了。不料,程式可以運行,但果結並確不符理想。
image 

怎會這樣 ?? 後來想到,MSSQL Server 當時建置的時候,是選定 Chinese_Taiwan_Stroke & Binary,會不會和內碼有關?
所以,就修正的 HTML 的字碼值

<meta http-equiv="Content-Type" content="text/html; charset=big5" />
image

每天必要運行的工作,可以排程化?

想要將每天必做的工作,加以排程化處理,是一個突然間的念頭。
可能是每天的常態性工作吧,所以才不以為意。
說到這兒,回憶起偶而會對 隔壁單位 的同事說:常態性的工作若是可以調整成電腦處理,而不去做,那麼作死自己也沒有人會可憐你 !!

沒想到,這事也落在自個的身上,真該自省了。

事情是這樣了,
每天一定要做 前天 資料庫的備份工作。而這備份工作也早已經寫成批次檔案,只要每天一上工,去點擊它 運行之。
說到這,大伙一定想即然是電腦做,點擊後不就沒事了 ??
事實上,每次的備份工作約要從 09:00 ~ 11:30,如此長的工作時間,一定也會影響到同一時間公司同事使用網路頻寬的效率。

所以,想調整:
1. 在非上班時段,運行資料庫的備份,由電腦啟動排程管控
2. 改善備份的效率
3. 一上班,就可以測試備份資料庫的完整性,減化備份的工作。

依據上述的構想,
在原本每天執行備份的電腦上,設定工作排程機制,讓它每天運作 ScheduleBatch.bat 檔案;
而該程式就會呼叫 前一天 的備份批次檔:備份bak單檔批次檔_20120605.bat

ScheduleBatch.bat  ============= 程式內容
@echo off
echo wscript.echo dateadd("d", -1, date) > %tmp%\tmp.vbs

for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k

rem    if %m% LSS 9 set m=0%m%
rem    if %d% LSS 9 set d=0%d%

@echo on
echo 備份bak單檔批次檔_%y%%m%%d%.bat
=========================================

接下來,稍做批次檔運作指令的說明,
echo wscript.echo dateadd("d", -1, date) > %tmp%\tmp.vbs
使用 VBScript 功能,在電腦 %tmp% 的目錄中,產生 tmp.vbs,其內容是 wscript.echo dateadd("d", -1, date)

接下來是使用 cscript 來運行 tmp.vbs,分別得到 年、月、日 等三個變數 %y%、%m%、%d%
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k

最後,就是執行備份批次檔
echo 備份bak單檔批次檔_%y%%m%%d%.bat

Apache 虛擬目錄設定:補充說明

原本有此相關文件,
但發覺有欠缺,再增補之。

要修改 C:\AppServ\Apache2.2\conf 目錄中的 httpd.conf 檔案:
(每個虛擬目錄要設定各別的權限)

例如:要設定 虛擬目錄 files
Alias /files "D:/wwwroot/files"

<Directory "D:/wwwroot/files">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>


Alias /mp3 "D:/wwwroot/mp3" 

<Directory "D:/wwwroot/mp3">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>


Alias /SundayMessage "d:/SundayMessage"

<Directory "D:/SundayMessage">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>