<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-987879516936367784</id><updated>2024-10-02T15:12:34.586+08:00</updated><category term="Windows"/><category term="工具設定"/><category term="程式設計"/><category term="Ubuntu"/><category term="應用程式"/><category term="Linux"/><category term="艾鍗學院"/><category term="ASP.NET"/><category term="C++"/><category term="C#"/><category term="Tips"/><category term="單晶片"/><category term="Diagnostic"/><category term="IIS"/><category term="Homework"/><category term="MFC"/><category term="SQL Server"/><category term="Workflow"/><category term="AMD"/><category term="Mail"/><category term="Office"/><category term="Server"/><category term="音樂"/><category term="Mobile"/><category term="Windows Form"/><category term="生活"/><category term="Crystal Reports"/><category term="SQL"/><category term="TinyLinux"/><category term="WPF"/><category term="梅子"/><category term="網路"/><category term=".Net 工具"/><category term="AJAX"/><category term="BeagleBoard-xM"/><category term="Driver"/><category term="Embedded"/><category term="Firewall"/><category term="IE"/><category term="NB"/><category term="NV"/><category term="Unit test"/><category term="健康"/><category term="數位簽章"/><category term="硬體"/><category term="電子書"/><title type='text'>梅子與牧童叔</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>192</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-6227598611808515541</id><published>2022-05-01T06:50:00.001+08:00</published><updated>2022-05-01T06:50:26.291+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>安裝 Ubuntu 後，Windows 無法關機</title><content type='html'>&lt;p&gt;原來是跟 GRUB 衝突，只要把 Fast Boot 關掉就正常了&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  &lt;a
    href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjea8TKfuhfYDPoq5Pb6dhtae-X7kIdqXF0vL1gRHmp0i-CkfLt9-TgNGbuPZsUlRUDaq1EuNJPVdQAItrqrD9wgaZAWVgXkSwMKPtrYV4UJkzxJFRN-CP0E4dXfilIZyO1YIdU0BR0vUXVxFhyAWK5Jhl2lLmVXJ-aNiYZ3f3skf0vZysLr6Zb-Hc_/s1125/FastBoot.png&quot;
    imageanchor=&quot;1&quot;
    style=&quot;margin-left: 1em; margin-right: 1em;&quot;
    &gt;&lt;img
      alt=&quot;關閉 Fast Boot 的選項&quot;
      border=&quot;0&quot;
      data-original-height=&quot;634&quot;
      data-original-width=&quot;1125&quot;
      src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjea8TKfuhfYDPoq5Pb6dhtae-X7kIdqXF0vL1gRHmp0i-CkfLt9-TgNGbuPZsUlRUDaq1EuNJPVdQAItrqrD9wgaZAWVgXkSwMKPtrYV4UJkzxJFRN-CP0E4dXfilIZyO1YIdU0BR0vUXVxFhyAWK5Jhl2lLmVXJ-aNiYZ3f3skf0vZysLr6Zb-Hc_/s16000/FastBoot.png&quot;
      title=&quot;Fast Boot&quot;
  /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;
  參考：&lt;a
    href=&quot;https://davidhu0903ex3.pixnet.net/blog/post/457776722-%5B%E5%B7%B2%E8%A7%A3%E6%B1%BA%5D-dual-boot-%E7%84%A1%E6%B3%95%E9%97%9C%E6%A9%9F-%E4%BC%91%E7%9C%A0-%E7%9D%A1%E7%9C%A0-%28ubuntu-win&quot;
    rel=&quot;nofollow&quot;
    target=&quot;_blank&quot;
    &gt;[已解決] Dual boot 無法關機/休眠/睡眠 (Ubuntu/Windows)&lt;/a
  &gt;
&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/6227598611808515541/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/6227598611808515541' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6227598611808515541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6227598611808515541'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2022/05/ubuntu-windows.html' title='安裝 Ubuntu 後，Windows 無法關機'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjea8TKfuhfYDPoq5Pb6dhtae-X7kIdqXF0vL1gRHmp0i-CkfLt9-TgNGbuPZsUlRUDaq1EuNJPVdQAItrqrD9wgaZAWVgXkSwMKPtrYV4UJkzxJFRN-CP0E4dXfilIZyO1YIdU0BR0vUXVxFhyAWK5Jhl2lLmVXJ-aNiYZ3f3skf0vZysLr6Zb-Hc_/s72-c/FastBoot.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-7478661515859050776</id><published>2020-03-04T18:05:00.000+08:00</published><updated>2020-03-04T18:05:37.794+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>執行批次檔不要 DOS Command 視窗</title><content type='html'>如果程式有特殊需求必須從 Command Line 執行，例如以下的 Test.bat&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;Notepad&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
則執行的結果就是像下圖一樣，有一個醜醜的 DOS Command 視窗，直到你程式結束後才會關閉 &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuruXOjsW8ZQ27LA3z3DjcKXOvZzqcFwKAnrQDrwX5a8AXGGrX4FiVkyeFxOsMSRyuXSJlir5yLtt0V-Jl2qbADNeX9O5jDzFQSLdpsyDovk9YROdFUmrBDQZYZWYx_XzkDz_zEN7xUqk/s1600/Test1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;707&quot; data-original-width=&quot;978&quot; height=&quot;462&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuruXOjsW8ZQ27LA3z3DjcKXOvZzqcFwKAnrQDrwX5a8AXGGrX4FiVkyeFxOsMSRyuXSJlir5yLtt0V-Jl2qbADNeX9O5jDzFQSLdpsyDovk9YROdFUmrBDQZYZWYx_XzkDz_zEN7xUqk/s640/Test1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
如果要把它去掉，可以修改 Test.bat 如下&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;Start Notepad&lt;br /&gt;Exit&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
它的原理是利用 Start 呼叫要執行的程式後，原本的批次檔會繼續往下執行 Exit，就可以把 DOS Command 視窗關閉了&lt;br /&gt;
&lt;br /&gt;
Start 還有其它參數，例如 /Max 可以把要執行的程式最大化，有興趣可自行參考 Start /? 的說明</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/7478661515859050776/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/7478661515859050776' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7478661515859050776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7478661515859050776'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2020/03/dos-command.html' title='執行批次檔不要 DOS Command 視窗'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuruXOjsW8ZQ27LA3z3DjcKXOvZzqcFwKAnrQDrwX5a8AXGGrX4FiVkyeFxOsMSRyuXSJlir5yLtt0V-Jl2qbADNeX9O5jDzFQSLdpsyDovk9YROdFUmrBDQZYZWYx_XzkDz_zEN7xUqk/s72-c/Test1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-5584196853292767009</id><published>2019-08-14T11:20:00.000+08:00</published><updated>2019-08-14T11:20:04.299+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>不要自動完成 { }</title><content type='html'>每次寫程式 Visual Studio 都會自動加 { }，但是加完就不會自動排版了，所以每次都還要刪掉再重加一次，以便完成排版。&lt;br /&gt;
&lt;br /&gt;
今天找了好久，終於找到取消的設定了&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUKo70pHfrrAh5UXpmsWxUFcW-6AG_SJDPkYMDeoI0CVgXEgxveZuGAhM5xdMGHmcVxNVcz4JcHFqO_V2UdwtWZx4pg-Ka0NSM8xawkkkbU0VU9LBhG07U2OiuOfycZYMfzY0pSbjgkw0/s1600/VS_Setting.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;434&quot; data-original-width=&quot;744&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUKo70pHfrrAh5UXpmsWxUFcW-6AG_SJDPkYMDeoI0CVgXEgxveZuGAhM5xdMGHmcVxNVcz4JcHFqO_V2UdwtWZx4pg-Ka0NSM8xawkkkbU0VU9LBhG07U2OiuOfycZYMfzY0pSbjgkw0/s1600/VS_Setting.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/5584196853292767009/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/5584196853292767009' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/5584196853292767009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/5584196853292767009'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2019/08/blog-post.html' title='不要自動完成 { }'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUKo70pHfrrAh5UXpmsWxUFcW-6AG_SJDPkYMDeoI0CVgXEgxveZuGAhM5xdMGHmcVxNVcz4JcHFqO_V2UdwtWZx4pg-Ka0NSM8xawkkkbU0VU9LBhG07U2OiuOfycZYMfzY0pSbjgkw0/s72-c/VS_Setting.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-2141230928505043382</id><published>2018-12-26T14:04:00.000+08:00</published><updated>2018-12-26T14:04:27.852+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Driver"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="數位簽章"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>Driver 的數位簽章</title><content type='html'>Microsoft 為了安全性的考量，在 x64 OS 下的 Driver 一定要有合法的數位簽章，否則下場就是這樣，甚麼都不能做。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFsTcYrfwR6jTHRCW7-xyK7eT-1mJCDc4UrDuTzHGjSEBgOMs_JLn2gc0zII-5Y4ZU2x7Z8PEcG-e13-fqHb2gY297JcQJ75_A7hdBAA0PayHkNJDSx8mIhtGfmtc276xCyWyPqGJR1r4/s1600/SIGN00.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFsTcYrfwR6jTHRCW7-xyK7eT-1mJCDc4UrDuTzHGjSEBgOMs_JLn2gc0zII-5Y4ZU2x7Z8PEcG-e13-fqHb2gY297JcQJ75_A7hdBAA0PayHkNJDSx8mIhtGfmtc276xCyWyPqGJR1r4/s1600/SIGN00.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;而我最近碰到一個讀 Physical memory 的問題，改寫 Driver 後卻一直無法使用，即使加上公司的數位簽章也是一樣。Google 了兩天後，終於找到原因順利解決了，步驟如下：&lt;br /&gt;
&lt;br /&gt;
首先，確認你的數位憑證可用於程式碼簽署，然後檢視最上層的憑證 (在此為 VeriSign)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3LGLY_QsxTbI_0-oJAElan9OsIKVw6AJkGuOh4nM_cCyTc_8a7b-jRmSF8ux6kWizH2NZigwEGaFyq-ZHJi9w2of0wbggXRfTL9zTwIg1X5OLMBGohwxZyyfgF9Bx09nPNJTl8cxtd84/s1600/SIGN01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3LGLY_QsxTbI_0-oJAElan9OsIKVw6AJkGuOh4nM_cCyTc_8a7b-jRmSF8ux6kWizH2NZigwEGaFyq-ZHJi9w2of0wbggXRfTL9zTwIg1X5OLMBGohwxZyyfgF9Bx09nPNJTl8cxtd84/s1600/SIGN01.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
查看最上層憑證的簽發者 (Issuer) 為誰，然後到&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/windows/hardware/gg487315.aspx#E5C&quot; target=&quot;_blank&quot;&gt;Cross-Certificates for Kernel Mode Code Signing&lt;/a&gt;&amp;nbsp;取得對應的交叉認證檔案 (&lt;span style=&quot;color: red;&quot;&gt;文章中還有提到憑證指紋 (Thumbprint)，雖然我的內容跟網站上的不一樣，不過目前測試的結果還是可以使用&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOJRL2bj0eLER8__iQ5sdmJKlVgXcyuf1XgaoBg4oi5_E6NOcYTT0-ILdRUW9IJP_6i3Oes5w9-L-KCZSC4HU7EfbxTxE-R20JzAlP8xz3LL5P8ZAgq6E-nY4v9mPU6UbMnSBtJJ3J8zE/s1600/SIGN02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOJRL2bj0eLER8__iQ5sdmJKlVgXcyuf1XgaoBg4oi5_E6NOcYTT0-ILdRUW9IJP_6i3Oes5w9-L-KCZSC4HU7EfbxTxE-R20JzAlP8xz3LL5P8ZAgq6E-nY4v9mPU6UbMnSBtJJ3J8zE/s1600/SIGN02.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
最後照以下的方式簽署，就可以正常使用了&lt;br /&gt;
&lt;br /&gt;
signtool.exe sign /v /ac &quot;&lt;span style=&quot;color: blue;&quot;&gt;VeriSign Class 3 Public Primary Certification Authority - G5.cer&lt;/span&gt;&quot; /s my /n &quot;Company name&quot; /t &quot;http://timestamp.verisign.com/scripts/timstamp.dll&quot; /du &quot;http://www.company_name.com&quot; &quot;Driver_name.sys&quot;&lt;br /&gt;
&lt;br /&gt;
上面 .cer 的檔案就是從 Microsoft 取得的交叉認證檔案，其餘參數跟原本簽署數位簽章的一樣&lt;br /&gt;
&lt;br /&gt;
結論就是要在 x64 OS 執行 Driver，除了 Microsoft 認可的數位憑證外，還要加上對應的交叉憑證。先前就是少了這一個步驟，所以才無法正常使用。&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;h2&gt;
Win10 更新&lt;/h2&gt;
&lt;br /&gt;
因目前數位簽章更換為 &lt;a href=&quot;https://www.digicert.com/&quot; target=&quot;_blank&quot;&gt;DigiCert&lt;/a&gt;，因此需要去 &lt;a href=&quot;https://docs.microsoft.com/zh-tw/windows-hardware/drivers/install/cross-certificates-for-kernel-mode-code-signing#selecting-the-correct-cross-certificate&quot; target=&quot;_blank&quot;&gt;Selecting the Correct Cross-certificate&lt;/a&gt; 重新下載交叉憑證&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsb7hJ7fB1yFqTJWf-tjMjO4Q_pxp7sy_OBXil2kWNsvDhs6RPe8yqPWBcw0WZtHXu8Eeb4FxKmIbudbuN1kV-0rcm3QZgbi64l0HuBhG8TBzK7XCx6i4vPCYlkArGNo1TihIerNYtLOw/s1600/Cross-Certificate.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;533&quot; data-original-width=&quot;1600&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsb7hJ7fB1yFqTJWf-tjMjO4Q_pxp7sy_OBXil2kWNsvDhs6RPe8yqPWBcw0WZtHXu8Eeb4FxKmIbudbuN1kV-0rcm3QZgbi64l0HuBhG8TBzK7XCx6i4vPCYlkArGNo1TihIerNYtLOw/s640/Cross-Certificate.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
並以下列方式簽署即可 (注意 timestamp 需更換為 degicert 的網站)&lt;br /&gt;
&lt;br /&gt;
signtool sign /v /ac &quot;&lt;span style=&quot;color: blue;&quot;&gt;DigiCert High Assurance EV Root CA.crt&lt;/span&gt;&quot; /s my /n &quot;Company name&quot; /t &lt;span style=&quot;color: blue;&quot;&gt;http://timestamp.digicert.com&lt;/span&gt; &quot;Driver_name.sys&quot;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
參考：&lt;a href=&quot;https://knowledge.verisign.com.tw/support/code-signing-support/index?vproductcat=V_C_C&amp;amp;vdomain=VERISIGN_COM_TW&amp;amp;page=content&amp;amp;id=SO5820&amp;amp;actp=LIST&amp;amp;viewlocale=zh_TW&amp;amp;locale=zh_TW&amp;amp;redirected=true&quot; target=&quot;_blank&quot;&gt;如何使用 Microsoft Authenticode 或 Microsoft Office 和 VBA 簽署 Microsoft Vista 64 位元核心模式軟體？&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/2141230928505043382/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/2141230928505043382' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2141230928505043382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2141230928505043382'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2013/05/driver.html' title='Driver 的數位簽章'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFsTcYrfwR6jTHRCW7-xyK7eT-1mJCDc4UrDuTzHGjSEBgOMs_JLn2gc0zII-5Y4ZU2x7Z8PEcG-e13-fqHb2gY297JcQJ75_A7hdBAA0PayHkNJDSx8mIhtGfmtc276xCyWyPqGJR1r4/s72-c/SIGN00.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-6717867768078961885</id><published>2018-11-06T15:11:00.000+08:00</published><updated>2018-11-06T15:20:10.537+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>執行緒安全 (Thread-safe)</title><content type='html'>現代程式設計為了提升效能，通常採用多執行緒的方式執行，但若沒有注意執行緒安全，往往會造成意想不到的錯誤。&lt;br /&gt;
&lt;br /&gt;
假設現在有一個程式有 Main &amp;amp; Timer 兩個 Thread 都會透過 i2c command 存取硬體，模擬的程式碼如下：&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;using System;
using System.Threading;

namespace ThreadTest
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; class I2cGpu
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void NormalRead(int index)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} ==&amp;gt; NormalRead{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.Sleep(500);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} &amp;lt;== NormalRead{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void NormalWrite(int index)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} ==&amp;gt; NormalWrite{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.Sleep(2000);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} &amp;lt;== NormalWrite{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; class ThreadTest
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread threadMain = new Thread(MainThread);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadMain.Name = &quot;Main &quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread threadTimer = new Thread(TimerThread);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadTimer.Name = &quot;Timer&quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadMain.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private static void TimerThread()
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; I2cGpu i2CGpu = new I2cGpu();

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 3; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalRead(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalWrite(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private static void MainThread()
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; I2cGpu i2CGpu = new I2cGpu();

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 3; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalRead(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalWrite(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;br /&gt;
執行結果如下，可以發現兩個 Thread 在做底層 i2c Read / Write 時是交錯的，&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNrlbobviq88fqb-mnHEIzRUta4THw26SHrvDb5G8qUgJZ2d6sdP1J1U6kB36uaIMXedvOQVSOI6568Shp4QUSRp304p7b5mG5oFYjq8SCx-dN0ubce8ZaQCOFbxTecdemm4FpxphL_I8/s1600/Thread0.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;979&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNrlbobviq88fqb-mnHEIzRUta4THw26SHrvDb5G8qUgJZ2d6sdP1J1U6kB36uaIMXedvOQVSOI6568Shp4QUSRp304p7b5mG5oFYjq8SCx-dN0ubce8ZaQCOFbxTecdemm4FpxphL_I8/s1600/Thread0.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
此時可利用 lock 來保護 Read / Write 的過程中是不會被其他 Thread 中斷的&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;using System;
using System.Threading;

namespace ThreadTest
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; class I2cGpu
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: yellow;&quot;&gt;static object locker = new object();&lt;/span&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void NormalRead(int index)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: yellow;&quot;&gt;lock (locker)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} ==&amp;gt; NormalRead{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.Sleep(500);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} &amp;lt;== NormalRead{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void NormalWrite(int index)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: yellow;&quot;&gt;lock (locker)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} ==&amp;gt; NormalWrite{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.Sleep(2000);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&quot;{0} &amp;lt;== NormalWrite{1}&quot;, Thread.CurrentThread.Name, index);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; class ThreadTest
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread threadMain = new Thread(MainThread);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadMain.Name = &quot;Main &quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Thread threadTimer = new Thread(TimerThread);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadTimer.Name = &quot;Timer&quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadMain.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; threadTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private static void TimerThread()
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; I2cGpu i2CGpu = new I2cGpu();

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 3; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalRead(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalWrite(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private static void MainThread()
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; I2cGpu i2CGpu = new I2cGpu();

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 3; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalRead(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i2CGpu.NormalWrite(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;br /&gt;
執行結果如下，可以發現不再有交錯的情況了&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD338KVvAzVfNSRe3XiHtnksUXFxYXExVmpchoP81jF60GSkvB69bA066hbzFmlhHW8KYyZ5-aF-A21fUaKVBj_C4I-05q5ZBKp8JdzUOBNd2tGMBo8aQusWp4Uh-qdkWnyCkjiqwMNn0/s1600/Thread1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;979&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD338KVvAzVfNSRe3XiHtnksUXFxYXExVmpchoP81jF60GSkvB69bA066hbzFmlhHW8KYyZ5-aF-A21fUaKVBj_C4I-05q5ZBKp8JdzUOBNd2tGMBo8aQusWp4Uh-qdkWnyCkjiqwMNn0/s1600/Thread1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/6717867768078961885/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/6717867768078961885' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6717867768078961885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6717867768078961885'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2018/11/thread-safe.html' title='執行緒安全 (Thread-safe)'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNrlbobviq88fqb-mnHEIzRUta4THw26SHrvDb5G8qUgJZ2d6sdP1J1U6kB36uaIMXedvOQVSOI6568Shp4QUSRp304p7b5mG5oFYjq8SCx-dN0ubce8ZaQCOFbxTecdemm4FpxphL_I8/s72-c/Thread0.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-3536679890689947647</id><published>2018-07-11T14:46:00.000+08:00</published><updated>2018-07-11T14:46:55.344+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><category scheme="http://www.blogger.com/atom/ns#" term="音樂"/><title type='text'>ubuntu studio</title><content type='html'>&lt;a href=&quot;http://ubuntustudio.org/&quot; target=&quot;_blank&quot;&gt;ubuntu studio&lt;/a&gt; 是 ubuntu 的影音加強版，是為了玩 MIDI 的 Rosegarden 才看到的。12.04 LTS 佔 1.9 GB (用家裡的 ADSL download 了快 4 小時)，還得用 DVD 才能燒錄，所以在 Windows XP 下又找了一個免費的燒錄軟體 &lt;a href=&quot;http://www.imgburn.com/&quot; target=&quot;_blank&quot;&gt;ImgBurn&lt;/a&gt;，比起 ubuntu 用一張 CD 就能搞定，實在差太多了。&lt;br /&gt;
&lt;br /&gt;
以下就是一些使用的心得（萬一以後還要重裝的話，也好有一個參考）：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;系統 ｜ 日期與時間設定 改為 “與網路伺服器保持同步”（需安裝 NTP）&lt;/li&gt;
&lt;li&gt;關閉 UTC 解決與 Windows 時間衝突的問題：&lt;span style=&quot;color: blue;&quot;&gt;timedatectl set-local-rtc 1&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;懶得用 gcin 了，直接用內建的 IBus，再加上 &lt;a href=&quot;http://wiki.ubuntu-tw.org/index.php?title=IBUS&quot; target=&quot;_blank&quot;&gt;行列輸入法&lt;/a&gt; 即可 (&lt;span style=&quot;color: red;&quot;&gt;還是得裝 gcin，IBus 的行列打不出特殊符號啊&lt;/span&gt;) 裝完再用 im-switch 切換內定輸入法，然後重新登入即可&lt;/li&gt;
&lt;li&gt;設定主機板的 &lt;a href=&quot;http://jw1903.blogspot.tw/2012/07/blog-post_16.html&quot; target=&quot;_blank&quot;&gt;Wake on Lan&lt;/a&gt; (重裝 ubuntu studio 好像把這個選項又關掉了)&lt;/li&gt;
&lt;li&gt;設定 &lt;a href=&quot;http://jw1903.blogspot.tw/2009/11/ubuntu-windows.html&quot; target=&quot;_blank&quot;&gt;wins&lt;/a&gt;，不然 Windows 網路芳鄰的電腦名稱（NAS）又找不到了&lt;/li&gt;
&lt;li&gt;Pidgin 網路即時通：MSN&lt;/li&gt;
&lt;li&gt;Sysinfo&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Dropbox&lt;/li&gt;
&lt;li&gt;LibreOffice &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jw1903.blogspot.tw/2011/02/rhythmbox.html&quot; target=&quot;_blank&quot;&gt;Asunder CD Ripper&lt;/a&gt;：抓 CD不可少的工具&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jw1903.blogspot.tw/2012/09/rip-cd.html&quot; target=&quot;_blank&quot;&gt;Ripper X&lt;/a&gt;：Asunder CD Ripper 無法抓太多音軌的 CD 時可改用此軟體，不過中文支援有問題，需要用 EasyTAG 再改一次 (18.04 版的軟體中找不到，只能以手動安裝了 &lt;span style=&quot;color: blue;&quot;&gt;sudo apt-get install ripperx&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;Rosegarden：玩 MIDI 的軟體，不過還是有當機的情形，希望不要當得太頻繁啊。另外安裝完後沒有在 Audio Production，反而跑到 Media Playback&lt;/li&gt;
&lt;/ul&gt;
PS：&lt;span style=&quot;color: red;&quot;&gt;自動儲存的功能怎縻關掉啊？&lt;/span&gt;原本這個功能是怕當機資料消失，結果我反而因為這個功能導至這篇文章消失了。 在編輯的過程中，切換到 HTMlS 模式後，又利用 Ctrl + Z 執行 Undo 時，不明原因導至整篇文章不見了，偏偏又在此時自動存檔，真是 #@#%^，害我又打了第二遍（還好還沒全部忘記）</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/3536679890689947647/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/3536679890689947647' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/3536679890689947647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/3536679890689947647'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2012/08/ubuntu-studio.html' title='ubuntu studio'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-766999030059176484</id><published>2018-05-22T10:07:00.000+08:00</published><updated>2018-05-22T17:52:53.031+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Diagnostic"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>[分享] Visual Studio 遠端偵錯</title><content type='html'>參考：&lt;a href=&quot;https://msdn.microsoft.com/zh-tw/library/y7f5zaaa.aspx&quot; target=&quot;_blank&quot;&gt;Visual Studio&amp;nbsp;遠端偵錯和診斷&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
在程式開發的過程中常需要在不同的作業系統平台上偵錯，以前的做法是在該平台上安裝 Visual Studio，但這不僅僅曠日廢時，同時也破壞測試的完整性，畢竟在一般使用者的平台上是不會有這些開發環境的程式的。&lt;br /&gt;
&lt;br /&gt;
所以看過今天的介紹後，你再也不需要這麼麻煩了，只要有網路線，你就可以利用遠端遙控的方式來偵錯，同時可以將一個測試平台分享給不同的開發者測試，一舉數得。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
首先是在測式平台上安裝遠端偵測工具，以 Visual Studio 2013&amp;nbsp;為例，你可以到&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/zh-tw/library/bt727f1t.aspx&quot; target=&quot;_blank&quot;&gt;這裡&lt;/a&gt;&amp;nbsp;下載對應的程式 (&lt;span style=&quot;color: red;&quot;&gt;遠端工具的版本與 Visual Studio&amp;nbsp;的版本必須一致&lt;/span&gt;)，執行後按預設值設定即可，基本上就是打開防火牆而已。有一點要特別注意的是，&lt;span style=&quot;color: red;&quot;&gt;如果你要偵錯的程式需要 &quot;管理者權限&quot;，則遠端工具也需要以管理者權限啟動&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接下來是設定開發端，基本上都在 Debugging&amp;nbsp;的頁面，首先把設定切換到 &quot;&lt;span style=&quot;color: blue;&quot;&gt;Remote Windows Debugger&lt;/span&gt;&quot;，各項設定說明如下：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmpg5qnjYZBdVK07ZhGP1sc-uEpkvxg0HZd_kJ3PsSOzt8NsAboleYBJbmp6ZGQ9_Bz3UBQVyKmLaBPcKn47exrYON0Tm-MZzWRiJRLR4-6oJR4V8A6L3ghH4dl7hVRM19iRGParlhfSQ/s1600/Remote01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;452&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmpg5qnjYZBdVK07ZhGP1sc-uEpkvxg0HZd_kJ3PsSOzt8NsAboleYBJbmp6ZGQ9_Bz3UBQVyKmLaBPcKn47exrYON0Tm-MZzWRiJRLR4-6oJR4V8A6L3ghH4dl7hVRM19iRGParlhfSQ/s640/Remote01.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Remote Command :&amp;nbsp;要在遠端執行的程式名稱，前面需要遠端電腦的絕對路徑，而檔名可以用 $(TargetFileName)&amp;nbsp;取代，這樣當 Win32 / x64&amp;nbsp;檔名不相同時就不需要分別設定了&lt;br /&gt;
&lt;br /&gt;
Working Directory :&amp;nbsp;遠端執行程式的工作路徑，一般與 Remote Command&amp;nbsp;的路徑相同&lt;br /&gt;
&lt;br /&gt;
Remote Server Name :&amp;nbsp;可以從遠端工具程式取得，後面的 Port number&amp;nbsp;不需要輸入&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc5h5Y_in1z4DpRw4bE1yCcxWS9_nDRuh8ivAEX60VjN35AOzfvFt46HoSldpbtsa2XeIoGqzRzE0-LPj9foaqNab5jkkFQHL3SKwL-9CxsDHhwMUORfmeKmwscS4mpimhBWhgGMzS8dw/s1600/Remote02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc5h5Y_in1z4DpRw4bE1yCcxWS9_nDRuh8ivAEX60VjN35AOzfvFt46HoSldpbtsa2XeIoGqzRzE0-LPj9foaqNab5jkkFQHL3SKwL-9CxsDHhwMUORfmeKmwscS4mpimhBWhgGMzS8dw/s1600/Remote02.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Connection : 使用預設的 Windows 認證即可，所以你必須要有登入遠端電腦的使用權限&lt;br /&gt;
&lt;br /&gt;
Debugger Type :&amp;nbsp;若偵測 C++ 的程式可以直接選 Native Only；C# 則選擇 Managed Only。減少選擇 Auto 的判斷時間&lt;br /&gt;
&lt;br /&gt;
Deployment Directory :&amp;nbsp;程式部署的路徑，一般與 Remote Command&amp;nbsp;的路徑相同&lt;br /&gt;
&lt;br /&gt;
Additional Files to Deploy :&amp;nbsp;需要額外部署的檔案，若要部署整個資料夾則不適用。如果該檔案是不會改變的，則手動 Copy&amp;nbsp;到該路徑即可&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最後再勾選要部署的程式即可&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbWt8bsm9sSRZLRLKEnjnXjCyoEnfPwD0pZL-bjxi3B1HxAdk5HAVnODzJIweszkQcj8EiyVADD96hjXiMexYRnrxGxKgZ4TnrMv1B9K_5dXmD_vzdnEywQ3BKRdAYZRMhOoEwcre4yT0/s1600/Remote03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;425&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbWt8bsm9sSRZLRLKEnjnXjCyoEnfPwD0pZL-bjxi3B1HxAdk5HAVnODzJIweszkQcj8EiyVADD96hjXiMexYRnrxGxKgZ4TnrMv1B9K_5dXmD_vzdnEywQ3BKRdAYZRMhOoEwcre4yT0/s640/Remote03.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
當啟動遠端偵錯後，Visual Studio&amp;nbsp;會把執行檔及對應的 DLL Copy&amp;nbsp;到遠端的平台並執行，其中 WinRing0&amp;nbsp;的目錄就是前面提到手動 Copy&amp;nbsp;的檔案&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsTcQdkUSfg4gYK3A29YG08Da_7chRK_8Rg3_H4qWzCfgxR2_mhH3EyzzMRivKAKVCWlRTS1r1KDZvZ9xGVWDzfsNUUmz_7ayxNz9COx-WupdGBVY8BpY7r3bJ28gLKxJRNS4B2syUCK4/s1600/Remote04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;405&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsTcQdkUSfg4gYK3A29YG08Da_7chRK_8Rg3_H4qWzCfgxR2_mhH3EyzzMRivKAKVCWlRTS1r1KDZvZ9xGVWDzfsNUUmz_7ayxNz9COx-WupdGBVY8BpY7r3bJ28gLKxJRNS4B2syUCK4/s640/Remote04.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
不過此時你還是得到遠端電腦操作你的程式，或者利用 &lt;a href=&quot;https://www.teamviewer.com/zhTW/index.aspx&quot; target=&quot;_blank&quot;&gt;TeamViewer&lt;/a&gt;&amp;nbsp;遠端遙控軟體及雙螢幕在開發端遙控遠端電腦&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最後，這種方式還是有一些限制的，例如在 Win7&amp;nbsp;的開發平台上，就無法偵錯遠端 Win10 D3D12&amp;nbsp;的程式，原因是在 Win7&amp;nbsp;的平台上無法安裝 DX12 SDK，所以無法 Build D3D12&amp;nbsp;的程式，當然就無法在遠端偵錯了。&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;遠端偵錯 Visual C# 專案&lt;/span&gt; &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;遠端電腦工作目錄必須與來源端完全相同&lt;/li&gt;
&lt;li&gt;不支援部署到遠端電腦&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&amp;nbsp;故首先確認程式輸出的路徑，然後&lt;span style=&quot;color: blue;&quot;&gt;在遠端電腦建立相同的路徑&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGeZd_MoP-foJnxDwXikOKVINIvuY-Z7O_JbvSy0D0l-nR_fNdSqpXjEgVek2QvS0hIldge0ZUGKjqSeydA7K9Ki9drqD0C_OXGxM32BCyO3KcpeRg_HV2ezbQ6e6OQP1-DWP9PTkPX1c/s1600/00.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;634&quot; data-original-width=&quot;1141&quot; height=&quot;355&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGeZd_MoP-foJnxDwXikOKVINIvuY-Z7O_JbvSy0D0l-nR_fNdSqpXjEgVek2QvS0hIldge0ZUGKjqSeydA7K9Ki9drqD0C_OXGxM32BCyO3KcpeRg_HV2ezbQ6e6OQP1-DWP9PTkPX1c/s640/00.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;為了能手動部署，遠端電腦的資料夾必須設定為分享，首先是開啟網路分享的設定 &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg7cJ5uacqJqjg6_iMJFi0gsWwok4pdKR5zTSpIlfB_qJf31OyEMA0Z2Wu67ZaKUbcpop1jYMBzzNr67Jb0mT6ZENpAJFGsuXFWWZ5WV8sL9Ajqwy4boSDYMF98eMTZ3SLYOi0147j0jE/s1600/01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;742&quot; data-original-width=&quot;1408&quot; height=&quot;336&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg7cJ5uacqJqjg6_iMJFi0gsWwok4pdKR5zTSpIlfB_qJf31OyEMA0Z2Wu67ZaKUbcpop1jYMBzzNr67Jb0mT6ZENpAJFGsuXFWWZ5WV8sL9Ajqwy4boSDYMF98eMTZ3SLYOi0147j0jE/s640/01.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;在該資料夾上按滑鼠右鍵，選擇 &lt;span style=&quot;color: blue;&quot;&gt;Property | Sharing&lt;/span&gt; 標籤，點選 &lt;span style=&quot;color: blue;&quot;&gt;Share&lt;/span&gt; 按鈕&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjyVXrn2FFfgg3T-Xx6L1CUKOxv7UqP3aOQvmCodsSj41g_0hoUXgL1op0a3L_Vrj4b0AzRd0CXdkU81AFKJYVBhgUghSePjsWLIArm1wyUro65W3XBDtEHVZwTzwJbxUYD5mJvq1Bfs8/s1600/02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;594&quot; data-original-width=&quot;484&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjyVXrn2FFfgg3T-Xx6L1CUKOxv7UqP3aOQvmCodsSj41g_0hoUXgL1op0a3L_Vrj4b0AzRd0CXdkU81AFKJYVBhgUghSePjsWLIArm1wyUro65W3XBDtEHVZwTzwJbxUYD5mJvq1Bfs8/s640/02.png&quot; width=&quot;520&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
然後用目前的使用者分享&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKvh5BL6jS-Xui5R1E26wkw2IYKsQ87jGBR1-0w3Hy_Vv3svYNJICrr48JRBzZIJWzWLAC_GEjLYBg3qwAN025YIYCEd-TgHonV5ERtnE-t0KjpkS1sXggCctzDji3ESVC90FNiarZEaA/s1600/03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;593&quot; data-original-width=&quot;708&quot; height=&quot;536&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKvh5BL6jS-Xui5R1E26wkw2IYKsQ87jGBR1-0w3Hy_Vv3svYNJICrr48JRBzZIJWzWLAC_GEjLYBg3qwAN025YIYCEd-TgHonV5ERtnE-t0KjpkS1sXggCctzDji3ESVC90FNiarZEaA/s640/03.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
最後可以得到分享路徑的名稱&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-zwjufdvmfZWWZv0S9b9fB-JQw9G2Rtyx64ELphMOi9cCQpRqIfqClrqY2t_cduiio_cCi2jwUrj-ngaBokAHJyjDxJn0uR3CgG8zdrZVHGt0plYaYb5YFq4yGeAvIj6iX0v67Rowius/s1600/04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;593&quot; data-original-width=&quot;708&quot; height=&quot;536&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-zwjufdvmfZWWZv0S9b9fB-JQw9G2Rtyx64ELphMOi9cCQpRqIfqClrqY2t_cduiio_cCi2jwUrj-ngaBokAHJyjDxJn0uR3CgG8zdrZVHGt0plYaYb5YFq4yGeAvIj6iX0v67Rowius/s640/04.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
可以使用帳號、密碼先試一下連線是否正常&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7g5fhKYnUvCv6VMRbSQbe5YLeACPaKDJlpPIbCKYjuY7vEYWRmLaB-gknbQmPi6nRX00EpmBSb5L5aK9EM6AnUYkwhEGrsQBwVmNGaMMFU3to_TM-Nk2YOJD4tWvyFrFrBx0tNfWCrIY/s1600/05.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;638&quot; data-original-width=&quot;948&quot; height=&quot;430&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7g5fhKYnUvCv6VMRbSQbe5YLeACPaKDJlpPIbCKYjuY7vEYWRmLaB-gknbQmPi6nRX00EpmBSb5L5aK9EM6AnUYkwhEGrsQBwVmNGaMMFU3to_TM-Nk2YOJD4tWvyFrFrBx0tNfWCrIY/s640/05.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
若沒問題則可以將下列命令加入 &lt;span style=&quot;color: blue;&quot;&gt;Post-build event command line&lt;/span&gt; 中，令其在建置成功後手動部署 （&lt;span style=&quot;color: blue;&quot;&gt;/S 為包含子目錄、/Y 為直接確認&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
xcopy $(TargetDir)*.* &lt;span style=&quot;color: blue;&quot;&gt;\\TW-JOHNNYWANGSC\Test\Test\bin\Debug /S /Y&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW87GLb3OimZ1iQ-hUbqa0gdECn9lf2n-yLLC18T-c4tq2Ri1tUrQykIkBUqc-fUqeVUC_SpR9OmvmSm87gIrgqBJ9rWxxpmlOlc96B1mXmvajhyphenhyphengeJ9F7KrUY4M4gFpxKZr1F-8i5f-U/s1600/06.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;632&quot; data-original-width=&quot;1141&quot; height=&quot;354&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW87GLb3OimZ1iQ-hUbqa0gdECn9lf2n-yLLC18T-c4tq2Ri1tUrQykIkBUqc-fUqeVUC_SpR9OmvmSm87gIrgqBJ9rWxxpmlOlc96B1mXmvajhyphenhyphengeJ9F7KrUY4M4gFpxKZr1F-8i5f-U/s640/06.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
設定遠端電腦名稱 (&lt;span style=&quot;color: blue;&quot;&gt;若無 DNS 則可以用 IP 代替&lt;/span&gt;)，並確認沒有勾選原生程式碼偵錯&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHKZEOhlkaolVfoozKyvGxJ-HNqHhr5lyiOkb8GEK2TMdYqOHoUXKqlERr9_wTzutZa60ky53W7ghGNJtYGIukCKJGaDTahpYYhljcVAcNDhFoZTDBgmJYZi-yjvJGFrdMP04xIwA1O8Q/s1600/07.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;633&quot; data-original-width=&quot;1141&quot; height=&quot;354&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHKZEOhlkaolVfoozKyvGxJ-HNqHhr5lyiOkb8GEK2TMdYqOHoUXKqlERr9_wTzutZa60ky53W7ghGNJtYGIukCKJGaDTahpYYhljcVAcNDhFoZTDBgmJYZi-yjvJGFrdMP04xIwA1O8Q/s640/07.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
遠端電腦執行 &lt;a href=&quot;https://docs.microsoft.com/zh-tw/visualstudio/debugger/remote-debugging&quot; target=&quot;_blank&quot;&gt;Remote Debugger&lt;/a&gt; (&lt;span style=&quot;color: blue;&quot;&gt;確認 Visual Studio 版本與權限是否與來源端相同&lt;/span&gt;)，若設定無誤則可以看到連線成功的訊息，且程式在遠端電腦執行&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl-OBi8eyWQrkeJ1wyOuFCK3WHaCmed5Y7XPDhG7HFNa2SHJHhBmQlXIkX5dPcqILLxGKgMWZiePuuXM2v2F3V6m4YQsjQ_pB29zzVFldBWM4wu1k-IPsTz8DKRvozbMQwxzdOnoGmW7I/s1600/08.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;242&quot; data-original-width=&quot;734&quot; height=&quot;210&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl-OBi8eyWQrkeJ1wyOuFCK3WHaCmed5Y7XPDhG7HFNa2SHJHhBmQlXIkX5dPcqILLxGKgMWZiePuuXM2v2F3V6m4YQsjQ_pB29zzVFldBWM4wu1k-IPsTz8DKRvozbMQwxzdOnoGmW7I/s640/08.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
設定中斷點可以在來源端偵錯&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj57mq_30j9Uh_2kVFmyi27WWLUfjZDA-x5R7TBtiNzl3XAeuK017WI88s6f0yqrOBYaGTbBeEcpVl6dorS18GKQYf8b88s77M-Obk3QRNwiBQXnai7VXp3ISJE4KX3059QEwgnEBf2EqY/s1600/09.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;631&quot; data-original-width=&quot;1095&quot; height=&quot;368&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj57mq_30j9Uh_2kVFmyi27WWLUfjZDA-x5R7TBtiNzl3XAeuK017WI88s6f0yqrOBYaGTbBeEcpVl6dorS18GKQYf8b88s77M-Obk3QRNwiBQXnai7VXp3ISJE4KX3059QEwgnEBf2EqY/s640/09.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWwhRh34QeBKSgjkFCrpwF778PmzEmgCOzngwgvDuZT5Jkx4mszzuC5KVRmtdyWZsFu4CueQK9_xSbE8dbmqLwGVjgpUItWvH1qGnjfx3len5_J4tModx9PfnNDGgUH1uFdeVzqajHjiU/s1600/10.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;555&quot; data-original-width=&quot;984&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWwhRh34QeBKSgjkFCrpwF778PmzEmgCOzngwgvDuZT5Jkx4mszzuC5KVRmtdyWZsFu4CueQK9_xSbE8dbmqLwGVjgpUItWvH1qGnjfx3len5_J4tModx9PfnNDGgUH1uFdeVzqajHjiU/s640/10.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
雖然它不像 C++ 那樣方便，但至少是一個解決方式，在開發的過程中可以遠端偵錯而不用在遠端電腦安裝開發環境。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/766999030059176484/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/766999030059176484' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/766999030059176484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/766999030059176484'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2015/07/visual-studio.html' title='[分享] Visual Studio 遠端偵錯'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmpg5qnjYZBdVK07ZhGP1sc-uEpkvxg0HZd_kJ3PsSOzt8NsAboleYBJbmp6ZGQ9_Bz3UBQVyKmLaBPcKn47exrYON0Tm-MZzWRiJRLR4-6oJR4V8A6L3ghH4dl7hVRM19iRGParlhfSQ/s72-c/Remote01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-6646152928405170083</id><published>2017-04-10T11:32:00.001+08:00</published><updated>2017-04-10T11:32:41.123+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>[心得] 如何造成程式 Crash</title><content type='html'>最近在改程式的時候，發生以下異常存取的狀況&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7r0_g_0svgavfnPeZAR0Lr4IFTiLQETbqSvYv41brM979lj-JLZ1KkBLItMqaPHRaXfDNEIi3R3bT3g67MHjOVmGNB4twyXVjWoaLQBfz8rM4lN73EsrD92JcXzNz7lZvBC0g-JLUkyI/s1600/PX01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7r0_g_0svgavfnPeZAR0Lr4IFTiLQETbqSvYv41brM979lj-JLZ1KkBLItMqaPHRaXfDNEIi3R3bT3g67MHjOVmGNB4twyXVjWoaLQBfz8rM4lN73EsrD92JcXzNz7lZvBC0g-JLUkyI/s1600/PX01.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
原因是以下的指標指到不合法的記憶體，但查很久就是查不到在那裡被改的&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; if (&lt;span style=&quot;color: red;&quot;&gt;m_pStaticCoreVoltage&lt;/span&gt;-&amp;gt;IsWindowVisible())
 {
  m_pStaticCoreVoltage-&amp;gt;SetWindowText(m_strMonCoreVoltage);
 }
&lt;/pre&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
後來採用 &lt;span style=&quot;color: blue;&quot;&gt;Data Breakpoint&lt;/span&gt; 的方式，先在指標建立的地方設定中斷點，然後在建立後取得其指標變數的位址設定 Data Breakpoint，因此當該位址的資料變化時就會產生中斷。指令為&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;DEBUG | New Breakpoint | New Data Breakpoint&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRtA5Asfs3qmbT3agvCMeD1lfnJmKGoPlbNLc8d3ukPc6o-sFRXdW_eV8O2CYtl7GTJFapeSDhBJ3u2qP7envv8d_ehxS7bYu21h2DTTNdlVRMQG4qP_kpK6Xl2eEF0jPOU2ZY-ZWeITk/s1600/PX02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRtA5Asfs3qmbT3agvCMeD1lfnJmKGoPlbNLc8d3ukPc6o-sFRXdW_eV8O2CYtl7GTJFapeSDhBJ3u2qP7envv8d_ehxS7bYu21h2DTTNdlVRMQG4qP_kpK6Xl2eEF0jPOU2ZY-ZWeITk/s1600/PX02.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
通常中斷後 Keyboard 幾乎無法操作 (控制權被 Debug 搶走了)，所以我在後面加了一行 TRACE 的指令，執行後用滑鼠選取變數名稱的位址，開啟 Data Breakpoint 視窗後會自動帶入 Address 欄位，只要再把 Byte Count 改成 4 即可 (Win32 point 佔 4 Bytes)。繼續往下執行即會產生下列中斷&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIJEgWkRAGzfp2o4vKadSd4cduMuXJanXg5FCcKADro47GlAlGbflP-TEvlFEpEZ3JloYn9RuCbQr_liQ0-rrrmKyStLHT2KYP6cFQ86uAw4HBTfhyhouHCBfe3GPEXrNEie2jVvJ8nFo/s1600/PX03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIJEgWkRAGzfp2o4vKadSd4cduMuXJanXg5FCcKADro47GlAlGbflP-TEvlFEpEZ3JloYn9RuCbQr_liQ0-rrrmKyStLHT2KYP6cFQ86uAw4HBTfhyhouHCBfe3GPEXrNEie2jVvJ8nFo/s1600/PX03.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
中斷後有問題的程式碼&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; for (INT i = 0; i &amp;lt; _countof(&lt;span style=&quot;color: red;&quot;&gt;TempId&lt;/span&gt;); i++)
 {
  PIObservable pObj = m_pMonitorCtrl-&amp;gt;RegistryMonitor(this, TempId[i], nGpuIndex + 1, bRegister);
  if (bRegister &amp;amp;&amp;amp; pObj)
  {
   &lt;span style=&quot;color: red;&quot;&gt;m_nTemperature&lt;/span&gt;[i] = (INT)pObj-&amp;gt;getCur();
  }
 }
&lt;/pre&gt;
&lt;br /&gt;
再看一下變數的宣告&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; INT &lt;span style=&quot;color: red;&quot;&gt;m_nTemperature[9]&lt;/span&gt;; // GPU x 1, Power x 5, Memory x 3

 CWnd* &lt;span style=&quot;color: red;&quot;&gt;m_pStaticCoreVoltage&lt;/span&gt;;
&lt;/pre&gt;
&lt;br /&gt;
以及 TempId 的宣告&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;const MonitorId &lt;span style=&quot;color: red;&quot;&gt;TempId&lt;/span&gt;[] =
{
 ID_THERMAL, // GPU
 ID_GPU_TEMP2,

 ID_MEM_TEMP1, // Memory
 ID_MEM_TEMP2,
 ID_MEM_TEMP3,

 ID_POWER_TEMP1, // Power
 ID_POWER_TEMP2,
 ID_POWER_TEMP3,
 ID_POWER_TEMP4,
 ID_POWER_TEMP5,
};&lt;/pre&gt;
&lt;br /&gt;
原來 m_Temperature 只有宣告 9 個 INT 的空間，但 TempId 因為其他原因改成 10 個，且未同步更新 m_Temperature 的宣告，所以第 10 個就不小心蓋到 m_pStaticCoreVoltage 指標造成程式異常結束了&lt;br /&gt;
&lt;br /&gt;
但奇怪的是，這一段程式只有在 Win32 下有問題，x64 並未發生問題，原來是 m_pStaticCoreVoltage 前面有 4 Bytes padding (可能是 x64 Pointer 為 8 Bytes，為了 Performance 的關係有作 Align 的調整)，所以錯誤的資料沒有蓋到該指標變數&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibtkjBySO3MBHgE_AW9omMAtJDJUbV_10ueIc2Q62VJ4F-ZrLMvuh7HrXcLUTIbKetXo_O1qrd-K0X24kuH5oMwlqHZlGOXWQcqNqhi3hu_K_N0vIUKaqi_QMy8sBqBz-RG9R7lnMmJSs/s1600/PX04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibtkjBySO3MBHgE_AW9omMAtJDJUbV_10ueIc2Q62VJ4F-ZrLMvuh7HrXcLUTIbKetXo_O1qrd-K0X24kuH5oMwlqHZlGOXWQcqNqhi3hu_K_N0vIUKaqi_QMy8sBqBz-RG9R7lnMmJSs/s1600/PX04.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Win32 Memory&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-kpgFuO4MO7mCwgZszwru4u3uTZgD0_2GLLEtMn1kOB6OeOwu19UyiUHtoglDdEnXHu2-2FzMIjp7TX8PIjzV1CXciDwBT3JuZdNx-X-PKTDqhP9MfisZiCTnu4XfMahQEy52R7ophuY/s1600/PX05.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-kpgFuO4MO7mCwgZszwru4u3uTZgD0_2GLLEtMn1kOB6OeOwu19UyiUHtoglDdEnXHu2-2FzMIjp7TX8PIjzV1CXciDwBT3JuZdNx-X-PKTDqhP9MfisZiCTnu4XfMahQEy52R7ophuY/s1600/PX05.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
x64 Memory&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
結論：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;程式中不要使用靜態的陣列宣告，改用 STL vector 取代
&lt;pre&gt; vector&amp;lt;int&amp;gt; m_nTemperatureVector; // GPU x 2, Power x 5, Memory x 3

 for (INT i = 0; i &amp;lt; _countof(TempId); i++)
 {
  PIObservable pObj = m_pMonitorCtrl-&amp;gt;RegistryMonitor(this, TempId[i], nGpuIndex + 1, bRegister);
  if (bRegister &amp;amp;&amp;amp; pObj)
  {
   &lt;span style=&quot;color: blue;&quot;&gt;m_nTemperatureVector.push_back(pObj-&amp;gt;getCur());&lt;/span&gt;
  }
 }
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;存取陣列元素一定要做邊界檢查 (&lt;span style=&quot;color: blue;&quot;&gt;即使是 vector 也是會產生邊界異常&lt;/span&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/6646152928405170083/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/6646152928405170083' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6646152928405170083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6646152928405170083'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2017/04/crash.html' title='[心得] 如何造成程式 Crash'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7r0_g_0svgavfnPeZAR0Lr4IFTiLQETbqSvYv41brM979lj-JLZ1KkBLItMqaPHRaXfDNEIi3R3bT3g67MHjOVmGNB4twyXVjWoaLQBfz8rM4lN73EsrD92JcXzNz7lZvBC0g-JLUkyI/s72-c/PX01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-2128675053277769012</id><published>2016-06-24T10:03:00.000+08:00</published><updated>2016-08-04T17:08:53.404+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>[心得] 在 struct 中的 vector 存取異常</title><content type='html'>很久沒有寫心得了，這個問題花了我整整兩天的時間才解決，所以值得分享一下。首先我們看以下的定義&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;typedef struct _Profile
{
 INT nFormat;
 BOOL bFanMode;
 ULONG ulFanSpeed;
&lt;span style=&quot;color: blue;&quot;&gt;#ifdef BOOST
 BOOL bBoost;
#endif&lt;/span&gt;
 INT nOCMode;
 vector&amp;lt;INT&amp;gt; OffsetVector;
} Profile, *PProfile;
&lt;/pre&gt;
&lt;br /&gt;
應該沒甚麼問題，除了條件式的組譯：如果有定義 BOOST 的話，就多一個 bBoost 的欄位&lt;br /&gt;
&lt;br /&gt;
在我的 Solution 中有 ProjectA 和 ProjectB，其中 ProjectA 會產生 Profile 的物件，並以 Call by address 的方式傳給 Project B 中做後續的資料處理與回傳。&lt;br /&gt;
&lt;br /&gt;
而問題出在 ProjectB 中只要對 OffsetVector 做寫入就會產生記憶體存取異常。我找過幾個方向：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;因為 vector 會動態配置記憶體來存取資料，所以初期一直朝這個方向找答案，是否在傳遞的過程中，vector 所指到的記憶體已經改變了？所以才造成異常。但相同的動作在 ProjectA 做卻完全沒問題&lt;/li&gt;
&lt;li&gt;struct alignment 的問題，是否兩個 Project 的配置不一樣，造成相同的欄位卻存取到不同的位址？因此我用 sizeof() 取得兩個這數所佔空間的大小，還真的不一樣，而且 OffsetVector 是指向 struct 中不同的 offset。但我查 Project alignment 的設定，一樣都是預設值&lt;/li&gt;
&lt;/ol&gt;
這就怪了，最後發現原來問題是我自己造成的。原來我在 ProjectA 有定義 BOOST，因此有 bBoost 這個欄位，而 ProjectB 是事後才加入的，並沒有定義 BOOST，因此兩邊在存取 OffsetVector 時，就差了一個 BOOL 的欄位空間，故 ProjectB 在存取的位址實際上是錯的，當然就產生記憶體存取異常了，還害我誤會了 vector&lt;br /&gt;
&lt;br /&gt;
所以結論是：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;以後&lt;span style=&quot;color: blue;&quot;&gt;不要在 struct 中設定條件式組譯&lt;/span&gt;，避免又發生同樣的問題。&lt;/li&gt;
&lt;li&gt;而在程式碼中的條件式組譯，請定義在 Project Property | C/C++ | Preprocessor 的 &lt;span style=&quot;color: blue;&quot;&gt;Preprocessor Definitions&lt;/span&gt; 中，否則寫在程式碼中，有可能造成部份程式碼因為沒有 include 到定義的檔案而不正確&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
2016/8/4 續集&lt;br /&gt;
&lt;br /&gt;
下列這段程式碼會產生 Memory leak&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; PProfile pProfile = new Profile;
&lt;span style=&quot;color: blue;&quot;&gt; memset(pProfile, 0, sizeof(Profile));&lt;/span&gt;
 delete pProfile;
&lt;/pre&gt;
&lt;br /&gt;
為甚麼呢？不過是利用 memset 初始化利用 new 建立的 struct，應該也沒問題才對啊！&lt;br /&gt;
&lt;br /&gt;
原來還是 struct 中的 vector 出問題了，當你利用 new 建立 struct 時，裡面的 vector 實際上也會配置自己的 memory 空間，以便存放後續加入 vector 中的元素。當你用 memset 把所有 struct 中的元素清為 0 時，等於沒有把 vector 配置的 memory 釋放掉，就直接把 vector 清為 0。所以當程式結束時，就產生 Memory leak 了&lt;br /&gt;
&lt;br /&gt;
因此，下次 struct 中有 STL 的容器時，千萬不要再用 memset 初始化了&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;/ol&gt;
</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/2128675053277769012/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/2128675053277769012' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2128675053277769012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2128675053277769012'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2016/06/struct-vector.html' title='[心得] 在 struct 中的 vector 存取異常'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-7806202797795449612</id><published>2016-01-06T11:34:00.000+08:00</published><updated>2016-01-06T11:38:40.677+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="NB"/><title type='text'>NB 更新 EC</title><content type='html'>步驟如下：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;把下列檔案複製到隨身碟&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;EFI
&lt;ul&gt;
&lt;li&gt;Boot (&lt;span style=&quot;color: blue;&quot;&gt;EFI 開機檔&lt;/span&gt;）&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Bootia32.ef&lt;/li&gt;
&lt;li&gt;Bootx64.efi&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EC
&lt;ul&gt;
&lt;li&gt;226.bin (&lt;span style=&quot;color: blue;&quot;&gt;要更新的 EC 檔案&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;amiecfx64.EFI (&lt;span style=&quot;color: blue;&quot;&gt;更新的執行檔&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;u.nsh &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用隨身碟在 NB 開機 (&lt;span style=&quot;color: blue;&quot;&gt;按 F7 選擇&lt;/span&gt;) 進入 EFI Shell (使用類似 linux command)&lt;/li&gt;
&lt;li&gt;Shell&amp;gt; &lt;span style=&quot;color: blue;&quot;&gt;map&lt;/span&gt; // 查詢 USB mount 之後的名稱 (例如 fs4)
&lt;/li&gt;
&lt;li&gt;Shell&amp;gt;&lt;span style=&quot;color: blue;&quot;&gt; fs4:&lt;/span&gt; // 切換到隨身碟&lt;/li&gt;
&lt;li&gt;fs4:\&amp;gt; &lt;span style=&quot;color: blue;&quot;&gt;ls&lt;/span&gt; // 查詢檔案&lt;/li&gt;
&lt;li&gt;fs4:\&amp;gt; &lt;span style=&quot;color: blue;&quot;&gt;cd EC&lt;/span&gt; // 切換目錄&lt;/li&gt;
&lt;li&gt;fs4:\EC&amp;gt; &lt;span style=&quot;color: blue;&quot;&gt;amiecfx64.EFI 226.bin&lt;/span&gt; // 更新 EC&lt;/li&gt;
&lt;li&gt;fs4:\EC&amp;gt; &lt;span style=&quot;color: blue;&quot;&gt;u 226.bin&lt;/span&gt; // 使用 script 更新亦可 &lt;/li&gt;
&lt;/ol&gt;
u.nsh 內容為&lt;br /&gt;
&lt;br /&gt;
amiecfx64 %1&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/7806202797795449612/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/7806202797795449612' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7806202797795449612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7806202797795449612'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2016/01/nb-ec.html' title='NB 更新 EC'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-7823051939412089860</id><published>2015-03-02T11:49:00.000+08:00</published><updated>2015-03-02T11:49:02.825+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>如何解決 Microsoft Windows SDK for Windows 7 and .NET Framework 4 (v7.1) 安裝失敗</title><content type='html'>由於 Direct3D Interop sample&amp;nbsp;已無法從&amp;nbsp;&lt;a href=&quot;http://code.msdn.microsoft.com/d2ddxgiinterop/Release/ProjectReleases.aspx?ReleaseId=3066&quot; target=&quot;_blank&quot;&gt;MSDN Code Gallery&lt;/a&gt;&amp;nbsp;取得，因此只好安裝 &lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=8279&quot; target=&quot;_blank&quot;&gt;Windows 7 SDK&lt;/a&gt;，但安裝過程中發現 &lt;span style=&quot;color: red;&quot;&gt;Microsoft Visual C++ 2010 Redistributable&amp;nbsp;Package&lt;/span&gt; 造成安裝失敗，請依照以下的步驗安裝即可成功&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;移除 Microsoft Visual C++ 2010 Redistributable Package (x86 and x64)&lt;/li&gt;
&lt;li&gt;安裝 Windows SDK v7.1&amp;nbsp;時取消 &quot;&lt;span style=&quot;color: blue;&quot;&gt;Visual C++ Compilers&lt;/span&gt;&quot;&amp;nbsp;與 &quot;&lt;span style=&quot;color: blue;&quot;&gt;Visual C++ 2010 Redistributable Packages&lt;/span&gt;&quot;&lt;/li&gt;
&lt;li&gt;安裝 &lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;amp;id=4422&quot; target=&quot;_blank&quot;&gt;Microsoft Visual C++ 2010 Service Pack1 Compiler Update for the Windows SDK 7.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安裝 Microsoft Visual C++ 2010 Redistributable Package (&lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=5555&quot; target=&quot;_blank&quot;&gt;x86&lt;/a&gt; and &lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=14632&quot; target=&quot;_blank&quot;&gt;x64&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
原文參考：&lt;a href=&quot;http://www.mathworks.com/matlabcentral/answers/95039-why-does-the-sdk-7-1-installation-fail-with-an-installation-failed-message-on-my-windows-system&quot; target=&quot;_blank&quot;&gt;Why does the SDK 7.1 installation fail with an &quot;Installation Failed&quot; message on my Windows system?&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/7823051939412089860/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/7823051939412089860' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7823051939412089860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7823051939412089860'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2015/03/microsoft-windows-sdk-for-windows-7-and.html' title='如何解決 Microsoft Windows SDK for Windows 7 and .NET Framework 4 (v7.1) 安裝失敗'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-6610792228715172188</id><published>2014-12-29T15:12:00.000+08:00</published><updated>2014-12-29T15:12:17.830+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>Visual Studio 環境設定</title><content type='html'>如果你的 Project 不是單一執行檔，而是搭配其它檔案才能正常執行，那麼通常會設定 Debug 與 Release 兩組環境；如果再搭配 Win32 與 x64 的話就有 4 組了。有點麻煩？對吧！&lt;br /&gt;
&lt;br /&gt;
所以我希望把測試環境設定在一個固定的地方 (例如 Bin 目錄下)，這樣相關的檔案只要放一組就可以了，然後利用 Post-Build Event 把編譯過的執行檔複製到這裡就可以測試了。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Project property 該如何設定呢？首先針對所有 Configurations 與 Platforms 設定 Post-Build Event 為&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;copy &quot;$(TargetPath)&quot; &quot;$(SolutionDir)Bin&quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
其中雙引號是為了防止路徑與檔名中間有空白字元，而我把測試環境設定在 Solution 目錄下的 Bin 子目錄，若不使用 Solution 目錄的話，Project 目錄也可以&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOGRVDyNjNxg4HYp61d-wg5q_Bf8pkFxzxxM4qTQF6IyuxSMS4ValWL66DkvLS17-tzhEsarxODtprbPzTSeyYvRTbAAiCAXOcfs3OTajEpY4IlaslRq7Ano8pAEXnw4deqVLyihyY_KQ/s1600/build1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOGRVDyNjNxg4HYp61d-wg5q_Bf8pkFxzxxM4qTQF6IyuxSMS4ValWL66DkvLS17-tzhEsarxODtprbPzTSeyYvRTbAAiCAXOcfs3OTajEpY4IlaslRq7Ano8pAEXnw4deqVLyihyY_KQ/s1600/build1.png&quot; height=&quot;499&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
接著設定要 Debug 的程式與工作目錄 (Platform 似乎沒辦法一次設定，所以 Win32 與 x64 要各做一次，不過內容都一樣)&lt;br /&gt;
&lt;br /&gt;
首先是 Command，使用先前設定的路徑加上檔案名稱&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;$(SolutionDir)Bin\$(TargetFileName)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
接著是 Working Directory&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;$(SolutionDir)Bin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS1mpnYXTM4BnqQoP4Clyo3S5C9T3WTEuQwXZWmlJfae7jq3yOSma79XzOEOwhk6Yo-Y6_aWR861m0h0D95bw8VVN6EuHl80Fe_o5zeNS5N1gkNTGxoZbgjoxI9vCvCPANk-AqxAtqOxA/s1600/build2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS1mpnYXTM4BnqQoP4Clyo3S5C9T3WTEuQwXZWmlJfae7jq3yOSma79XzOEOwhk6Yo-Y6_aWR861m0h0D95bw8VVN6EuHl80Fe_o5zeNS5N1gkNTGxoZbgjoxI9vCvCPANk-AqxAtqOxA/s1600/build2.png&quot; height=&quot;498&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
這樣就可以在各個組態與平台間切換，而不需要重新設定所需要的相關檔案了。&lt;br /&gt;
&lt;br /&gt;
這裡順便提一下，如果程式有 x64 的版本，可以在輸出檔名後面加上 x64 以資區別&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhanAFs5kTSfdCsJXwyyq4WY1MuzmPxd1KYmmgFWUAWzsPr4eTdoWM8Lfc-jp5966NeXMFCzXTGVMKWB8ih7Ro6N58raKRr92mpxh4NG0Z3MlzoRyiEao7F-V1MGxTA4n0UoXBF2ZdV5w4/s1600/build10.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhanAFs5kTSfdCsJXwyyq4WY1MuzmPxd1KYmmgFWUAWzsPr4eTdoWM8Lfc-jp5966NeXMFCzXTGVMKWB8ih7Ro6N58raKRr92mpxh4NG0Z3MlzoRyiEao7F-V1MGxTA4n0UoXBF2ZdV5w4/s1600/build10.png&quot; height=&quot;498&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;h2&gt;
2014/04/10&lt;/h2&gt;
&lt;br /&gt;
經過同事的指點，實際上可以省掉 Post-Build copy&amp;nbsp;的動作，只要把 Output File&amp;nbsp;指到 Bin&amp;nbsp;目錄即可，也就是&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;$(SolutionDir)Bin&lt;/span&gt;\$(ProjectName).exe&lt;br /&gt;
&lt;br /&gt;
只是這樣在 &lt;span style=&quot;color: red;&quot;&gt;Clean&lt;/span&gt; 時會連該檔案一併刪除，如果要保留 Release 版本要記得先 Copy 出來。 &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdFL1rb4kELF4vEapzEGKhznv5jFDBbVww1pDWyGyS7VBTnWLGB9tjtFhdpkqGs5nwehNzM0ra_Z6q5YmoEXsGgjYh43frYE4W-g6ORWxUe6xApmXJDEphkbJObvtEiq2f9AAc5Jlt1Bo/s1600/Bin.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdFL1rb4kELF4vEapzEGKhznv5jFDBbVww1pDWyGyS7VBTnWLGB9tjtFhdpkqGs5nwehNzM0ra_Z6q5YmoEXsGgjYh43frYE4W-g6ORWxUe6xApmXJDEphkbJObvtEiq2f9AAc5Jlt1Bo/s1600/Bin.png&quot; height=&quot;499&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;h2&gt;
2014/12/29&lt;/h2&gt;
&lt;br /&gt;
Visual Studio 2010&amp;nbsp;在設定上跟 2008&amp;nbsp;又有點不太一樣。&lt;br /&gt;
&lt;br /&gt;
實際上只要把 &lt;span style=&quot;color: blue;&quot;&gt;General | Output Directory&lt;/span&gt;&amp;nbsp;設定到共用的 Bin&amp;nbsp;目錄，&lt;span style=&quot;color: blue;&quot;&gt;Target Name&lt;/span&gt;&amp;nbsp;根據 Win32 / x64&amp;nbsp;設定成不同的名字&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHLUh_GUFK926bUv7T-osYjPTBHFzVvCTJqZcDOaVr-_HBUiPmiuzb1XANJRk24dbkwdfMYOtIYE8w0tTsveFbAbWMZyEXOMZp1a7viKK6mEMrFpE2uwC58xbiHtRCQA7ed7oWQ8aPx0A/s1600/VS2010-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHLUh_GUFK926bUv7T-osYjPTBHFzVvCTJqZcDOaVr-_HBUiPmiuzb1XANJRk24dbkwdfMYOtIYE8w0tTsveFbAbWMZyEXOMZp1a7viKK6mEMrFpE2uwC58xbiHtRCQA7ed7oWQ8aPx0A/s1600/VS2010-1.png&quot; height=&quot;434&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
那麼 &lt;span style=&quot;color: blue;&quot;&gt;Debugging | Working Directory&lt;/span&gt;&amp;nbsp;可以統一設成 $(OutDir)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWNnxpYB0bEpnOI3untFfLYwLZ0FcrMABfDibSW637-5WPI7z_Gx8rjptRjl9pG2gmWLtS8lvN0drRwUNaeqYuxfw4UtXQV0tEdrva64zCW6BjUVgkhr32BmoZFP-XjSZAN2Po7TRt44/s1600/VS2010-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWNnxpYB0bEpnOI3untFfLYwLZ0FcrMABfDibSW637-5WPI7z_Gx8rjptRjl9pG2gmWLtS8lvN0drRwUNaeqYuxfw4UtXQV0tEdrva64zCW6BjUVgkhr32BmoZFP-XjSZAN2Po7TRt44/s1600/VS2010-2.png&quot; height=&quot;434&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
而 &lt;span style=&quot;color: blue;&quot;&gt;Linker | General | Output File&lt;/span&gt;&amp;nbsp;也可以統一設成 $(TargetPath)，這樣就不需要在每一個組態做不同的設定，只要在前面 General&amp;nbsp;根據不同的組態各設定一次即可。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3e5E6xf0LafAn8JQnO5k4K-7DXtZ1SAMqeOy_zpD6vISDoDvcMX7fXt8WyBVpFxiYWvnJKmr2O53XkNknGe6lgAAlhMKKbSc-cCQ6jDiHTldFtMQe2WyK6JV_G5U6HlpxW-JSByZGWlM/s1600/VS2010-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3e5E6xf0LafAn8JQnO5k4K-7DXtZ1SAMqeOy_zpD6vISDoDvcMX7fXt8WyBVpFxiYWvnJKmr2O53XkNknGe6lgAAlhMKKbSc-cCQ6jDiHTldFtMQe2WyK6JV_G5U6HlpxW-JSByZGWlM/s1600/VS2010-3.png&quot; height=&quot;434&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;$(TargetPath) = $(OutDir) + $(TargetName) + $(TargetExtension)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/6610792228715172188/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/6610792228715172188' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6610792228715172188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/6610792228715172188'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2013/06/visual-studio.html' title='Visual Studio 環境設定'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOGRVDyNjNxg4HYp61d-wg5q_Bf8pkFxzxxM4qTQF6IyuxSMS4ValWL66DkvLS17-tzhEsarxODtprbPzTSeyYvRTbAAiCAXOcfs3OTajEpY4IlaslRq7Ano8pAEXnw4deqVLyihyY_KQ/s72-c/build1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-2243103527725135935</id><published>2014-11-12T11:42:00.000+08:00</published><updated>2014-11-12T11:45:09.096+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>Ubuntu 11.04 的點點滴滴 [更新 14.10 Unity systray-whitelist 設定]</title><content type='html'>Ubuntu 11.04 採用新的 Unity 介面，當使用 Compiz 開啟 3D 桌面時有許多衝突，因此得將 Unity 關掉，亂按的結果就是掛點了，重開機後畫面只剩一張背景圖。&lt;br /&gt;
&lt;br /&gt;
這個時候就需要用到 &lt;span style=&quot;color: blue;&quot;&gt;Alt + SysRq + K&lt;/span&gt; 登出回到 Display Manager (登入) 的畫面，選擇 &quot;&lt;span style=&quot;color: blue;&quot;&gt;傳統 Ubuntu 桌面&lt;/span&gt;&quot; 登入後，將 Compiz 與 ATi Driver 移除後，結果還是一樣的空白桌面。將重裝一次 Driver 與 Compiz，還是一樣，看來是新版的 Unity 桌面被我的 Compiz 關掉了。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfqPYkgT9qrucxQ2b8Yaki7waD_qUkrL3pBrfVSCJAGejJ-DXqATHi-6NdpjDrKdE1n_NFVyFRNjOcu7kk7NMLsmwBl8Jh-UWQ59S5ZJRQWTp1i-tzwEXhlg2OVLpECFyf_ZWE3H9mJQ/s1600/Screenshot-CompizConfig+Settings+Manager.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfqPYkgT9qrucxQ2b8Yaki7waD_qUkrL3pBrfVSCJAGejJ-DXqATHi-6NdpjDrKdE1n_NFVyFRNjOcu7kk7NMLsmwBl8Jh-UWQ59S5ZJRQWTp1i-tzwEXhlg2OVLpECFyf_ZWE3H9mJQ/s640/Screenshot-CompizConfig+Settings+Manager.png&quot; height=&quot;401&quot; j8=&quot;true&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
解決方法一如上圖，到 Compiz 的 &lt;span style=&quot;color: blue;&quot;&gt;Preferences&lt;/span&gt; 將 &lt;span style=&quot;color: blue;&quot;&gt;Profile&lt;/span&gt; 設為 &lt;span style=&quot;color: blue;&quot;&gt;unity&lt;/span&gt; 就可以了 (不過有時還是不行)&lt;br /&gt;
&lt;br /&gt;
解決方法二是將 Compiz 的設定值刪除，回到預設的狀態 (參考：&lt;a href=&quot;http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=177236&quot;&gt;[分享] 灌好Ubuntu後必要的修正與套件 [論壇 - Ubuntu基本設定]&lt;/a&gt; #2)&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;rm -rf ~/.compiz* ~/.config/compiz* ~/.cache/compiz* ~/.gconf/apps/compiz* ~/.config/dconf ~/.cache/dconf ~/.cache/unity&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
接下來就是 Unity 的新操作方式還真有點不習慣，首先是程式的 Menu 不見了，原來是統一跑到上方的 System Bar 了，只要把滑鼠移過去就會出現了。這樣可以省掉 Menu 在程式佔用的空間，感覺還不錯的 Idea。&lt;br /&gt;
&lt;br /&gt;
另外有一些程式 (像 gcin、Dropbox) 會在 System Tray 出現的 icon 也不見了，解決方法如下：&lt;br /&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;到 &lt;span style=&quot;color: blue;&quot;&gt;Ubuntu 軟體中心&lt;/span&gt; 安裝 &lt;span style=&quot;color: blue;&quot;&gt;dconf Editor&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;從 &lt;span style=&quot;color: blue;&quot;&gt;終端機&lt;/span&gt; 執行 &lt;span style=&quot;color: blue;&quot;&gt;dconf-editor&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFdp7Bc8Gr754mlXgwX-i5jyNE-vkjQ90nWTwlwUCWmZm27u5Mfe95duiqm_wVcJHgVd5GM6bvoY3dGxLAgXkRYHocj_2GMSB4J487Lpf0CXnrOCQyaHWm5h-61gCubHcGG33LMWqRXUU/s1600/Screenshot-Configuration+Editor.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFdp7Bc8Gr754mlXgwX-i5jyNE-vkjQ90nWTwlwUCWmZm27u5Mfe95duiqm_wVcJHgVd5GM6bvoY3dGxLAgXkRYHocj_2GMSB4J487Lpf0CXnrOCQyaHWm5h-61gCubHcGG33LMWqRXUU/s640/Screenshot-Configuration+Editor.png&quot; height=&quot;227&quot; j8=&quot;true&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
在 &lt;span style=&quot;color: blue;&quot;&gt;desktop | unity | panel&lt;/span&gt; 的 &lt;span style=&quot;color: blue;&quot;&gt;systray-whitelist&lt;/span&gt; 加入你要的程式就可以了！&lt;br /&gt;
&lt;br /&gt;
Ubuntu 11.10 也是一樣的情況，所以照上面的方式設定是 OK&amp;nbsp;的，不過要登出後再重新登入才會生效喔！&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
最後還是決定切回傳統桌面，不過 gcin 的圖示又跟我躲貓貓，不見了&lt;br /&gt;
&lt;br /&gt;
原來面板還要加入 &quot;&lt;span style=&quot;color: blue;&quot;&gt;程式狀態通知區&lt;/span&gt;&quot; 才會出現，跟之前的 &lt;a href=&quot;http://jw1903.blogspot.com/2010/10/ubuntu.html&quot;&gt;Ubuntu 面板上的音量圖示不見了&lt;/a&gt;&amp;nbsp; 問題有點像，不過同樣是圖示，幹嘛分得這麼細啊！&lt;br /&gt;
&lt;br /&gt;
參考：&lt;a href=&quot;http://jonny.ubuntu-tw.net/2011/05/gcin-on-ubuntu-1104.html&quot;&gt;找回「傳統桌面」的 gcin 狀態通知區圖示 on Ubuntu 11.04&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;
&lt;br /&gt;
&lt;hr /&gt;
2014/11/12&lt;br /&gt;
&lt;br /&gt;
換到 Ubuntu 14.10 後，Unity systray-whitelist 又消失了 (從 13.04 開始)，所幸在網路上找到偏方可以把它加回來，不然又看不到 gcin icon 了&lt;br /&gt;
&lt;br /&gt;
- for Ubuntu 14.10:
&lt;br /&gt;
&lt;pre&gt;sudo add-apt-repository ppa:gurqn/systray-utopic
sudo apt-get update
sudo apt-get upgrade
&lt;/pre&gt;
&lt;br /&gt;
安裝過程中會出現一些警告跟錯誤訊息，並顯示某些套件沒有經過認證，只好硬著頭皮 Yes&lt;br /&gt;
了，完畢後重新 login 即可&lt;br /&gt;
&lt;br /&gt;
如果要還原的話 (沒試過)&lt;br /&gt;
&lt;br /&gt;
- for Ubuntu 14.10:&lt;br /&gt;
&lt;pre&gt;sudo apt-get install ppa-purge
sudo ppa-purge ppa:gurqn/systray-utopic
&lt;/pre&gt;
&lt;br /&gt;
參考：&lt;a href=&quot;http://www.webupd8.org/2013/05/how-to-get-systray-whitelist-back-in.html&quot; target=&quot;_blank&quot;&gt;How To Whitelist Systray Apps In Ubuntu 14.04 Or 14.10 (w/ Unity)&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/2243103527725135935/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/2243103527725135935' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2243103527725135935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2243103527725135935'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2011/05/ubuntu-1104.html' title='Ubuntu 11.04 的點點滴滴 [更新 14.10 Unity systray-whitelist 設定]'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfqPYkgT9qrucxQ2b8Yaki7waD_qUkrL3pBrfVSCJAGejJ-DXqATHi-6NdpjDrKdE1n_NFVyFRNjOcu7kk7NMLsmwBl8Jh-UWQ59S5ZJRQWTp1i-tzwEXhlg2OVLpECFyf_ZWE3H9mJQ/s72-c/Screenshot-CompizConfig+Settings+Manager.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-2355214267612130314</id><published>2014-11-01T21:57:00.000+08:00</published><updated>2014-11-01T21:57:54.554+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><category scheme="http://www.blogger.com/atom/ns#" term="網路"/><title type='text'>如何在 Ubuntu 下認得 Windows 的電腦名稱</title><content type='html'>自從踏入 Ubuntu 的領域後，還是以 Windows 的習慣在使用，例如存取公司內部的 Web Server 時，還是習慣使用 &lt;span style=&quot;color: red;&quot;&gt;電腦名稱&lt;/span&gt;，但此名稱在 Ubuntu 內是不認得的，只能以 IP 的方式存取。經過一番研究後，得出以下的結論與解決方法：&lt;br /&gt;
&lt;br /&gt;
Windows 是透過 &lt;a href=&quot;http://zh.wikipedia.org/zh-tw/WINS&quot;&gt;WINS&lt;/a&gt; 服務將 NetBIOS 的電腦名稱轉換為 IP 的 (此功能與 DNS 相同，只是應用在不同的地方)&lt;br /&gt;
&lt;br /&gt;
因此Ubuntu 要達到相同的功能，需執行以下的動作 &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;sudo gedit /etc/&lt;a href=&quot;http://en.wikipedia.org/wiki/Nsswitch.conf&quot;&gt;nsswitch.conf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;將 host: ... dns 前面加上 wins，變成 host: ... &lt;span style=&quot;color: red;&quot;&gt;wins&lt;/span&gt; dns&lt;/li&gt;
&lt;li&gt;利用 Synaptic 安裝 &lt;span style=&quot;color: red;&quot;&gt;winbind&lt;/span&gt; 即可&lt;/li&gt;
&lt;/ol&gt;
原文參考 &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=88206&quot;&gt;&lt;b&gt;HOWTO: Resolve Netbios hostname system-wide&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
2014/11/01 更新&lt;br /&gt;
&lt;br /&gt;
此方法在 Ubuntu Studio 14.10 下竟然無效，無法從瀏覽器用 http://mymediacenter 連接到 NAS 伺服器&lt;br /&gt;
不過網路位置還是可以用 smb://mymediacenter&amp;nbsp; 連線到資料夾，真是怪哉！&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/2355214267612130314/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/2355214267612130314' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2355214267612130314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2355214267612130314'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2009/11/ubuntu-windows.html' title='如何在 Ubuntu 下認得 Windows 的電腦名稱'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-8893903521671996887</id><published>2014-10-03T15:20:00.001+08:00</published><updated>2014-10-03T15:20:55.637+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>dynamic_cast 與 operator override 的應用</title><content type='html'>假設我有一個 Interface&amp;nbsp;如下&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;struct IProperty abstract
{
 ~IProperty() { }

 virtual LPCTSTR toString() = 0;

 virtual BOOL operator==(&lt;span style=&quot;color: red;&quot;&gt;const&lt;/span&gt; IProperty&amp;amp; other) const = 0;
 virtual BOOL operator!=(&lt;span style=&quot;color: red;&quot;&gt;const&lt;/span&gt; IProperty&amp;amp; other) const = 0;

};
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;然後有一個 class&amp;nbsp;實作該 Interface&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;class InstrumentType : public IProperty
{
public:
 enum INSTRUMENTTYPE
 {
  GUITAR,
  BANJO,
  DOBRO,
  FIDDLE,
  BASS,
  MANDOLIN,
 };

private:
 INSTRUMENTTYPE m_enInstrumentType;

public:
 InstrumentType(INSTRUMENTTYPE enInstrumentType);
 ~InstrumentType(void);

 LPCTSTR toString();

 BOOL operator==(&lt;span style=&quot;color: red;&quot;&gt;const&lt;/span&gt; IProperty&amp;amp; other) const;
 BOOL operator!=(&lt;span style=&quot;color: red;&quot;&gt;const&lt;/span&gt; IProperty&amp;amp; other) const;
};
&lt;/pre&gt;
&lt;br /&gt;
那在 operator==&amp;nbsp;函式中，如何將 other&amp;nbsp;從 IProperty&amp;amp;&amp;nbsp;轉換成 InstrumentType&amp;amp;&amp;nbsp;呢？&lt;br /&gt;
&lt;br /&gt;
第一個想法是&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; PInstrumentType pOtherInstrumentType = dynamic_cast&amp;lt;PInstrumentType&amp;gt;(&amp;amp;other);
&lt;/pre&gt;
&lt;br /&gt;
不過得到的結果是&lt;br /&gt;
&lt;br /&gt;
error C2682: cannot use &#39;dynamic_cast&#39; to convert from &#39;const IProperty *&#39; to &#39;PInstrumentType&#39;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果改用 Reference&amp;nbsp;的方式轉換&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; InstrumentType&amp;amp; OtherInstrumentType = dynamic_cast&amp;lt;InstrumentType&amp;amp;&amp;gt;(other);
&lt;/pre&gt;
&lt;br /&gt;
還是錯誤&lt;br /&gt;
&lt;br /&gt;
error C2682: cannot use &#39;dynamic_cast&#39; to convert from &#39;const IProperty &amp;amp;&#39; to &#39;InstrumentType &amp;amp;&#39;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最後測試的結果是要加上 const，也就是轉換前後都要一樣才行&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;BOOL InstrumentType::operator==(&lt;span style=&quot;color: red;&quot;&gt;const&lt;/span&gt; IProperty&amp;amp; other) const
{
 &lt;span style=&quot;color: red;&quot;&gt;const&lt;/span&gt; InstrumentType&amp;amp; OtherInstrumentType = dynamic_cast&amp;lt;&lt;span style=&quot;color: red;&quot;&gt;const&lt;/span&gt; InstrumentType&amp;amp;&amp;gt;(other);

 return (m_enInstrumentType == OtherInstrumentType.m_enInstrumentType);
}
&lt;/pre&gt;
&lt;br /&gt;
先前也有想過用 const_cast&amp;nbsp;的方式，不過它的用途是把 const&amp;nbsp;的修飾功能移除 (變成非 const&amp;nbsp;變數)&amp;nbsp;所以要經過兩次轉換才能達到目的&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; IProperty&amp;amp; other1 = const_cast&amp;lt;IProperty&amp;amp;&amp;gt;(other);
 InstrumentType&amp;amp; OtherInstrumentType = dynamic_cast&amp;lt;IinstrumentType&amp;amp;&amp;gt;(other1);
&lt;/pre&gt;
&lt;br /&gt;
經過這一次的實驗，對安全型別轉換 dynamic_cast&amp;nbsp;也有更深一層的認識&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;轉換前後的修飾字元必須完全一致&lt;/li&gt;
&lt;li&gt;除了指標外，也可以轉換 Reference&lt;/li&gt;
&lt;/ol&gt;
</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/8893903521671996887/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/8893903521671996887' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/8893903521671996887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/8893903521671996887'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/10/dynamiccast-operator-override.html' title='dynamic_cast 與 operator override 的應用'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-444214709768310681</id><published>2014-09-29T18:35:00.000+08:00</published><updated>2014-09-29T18:35:55.499+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="MFC"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>DPI-Aware Application</title><content type='html'>一般 MFC Dialog base&amp;nbsp;的程式，如果使用者調整 Font size&amp;nbsp;則 Dialog&amp;nbsp;是會跟著 Font size&amp;nbsp;等比例放大的。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaJF-OezggP3efRszfa1TfwNbsTHkrw_XIPmyJBTnTmsVYE5MtmxNUf_ntdvkZhzPneAQDPtn8955TSVk_fOnfxqCXtaSAYBmluO7lVT8Cq0CVW0ohxgKFv5ss_3RHN9roCVVcP3gRzc4/s1600/DPI01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaJF-OezggP3efRszfa1TfwNbsTHkrw_XIPmyJBTnTmsVYE5MtmxNUf_ntdvkZhzPneAQDPtn8955TSVk_fOnfxqCXtaSAYBmluO7lVT8Cq0CVW0ohxgKFv5ss_3RHN9roCVVcP3gRzc4/s1600/DPI01.png&quot; height=&quot;460&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;但如果是用 Owner Draw&amp;nbsp;自行貼圖的方式，則只有在 Windows 8.1&amp;nbsp;能享受到這個好處，Windows 7 &amp;amp; Windows 8&amp;nbsp;是不支援的。&lt;br /&gt;
&lt;br /&gt;
而這又跟使用的工具有關係，Visual Sutdio 2008&amp;nbsp;預設 DPI-Aware&amp;nbsp;是 OFF，所以在 Windows 8.1&amp;nbsp;下系統會直接處理 DPI scaling；而 &lt;span style=&quot;color: red;&quot;&gt;Visual Studio 2010 預設 DPI-Aware&amp;nbsp;是 ON，表示程式要自行處理 DPI scaling&lt;/span&gt;，所以要用以下的方式將 &lt;span style=&quot;color: red;&quot;&gt;Enable DPI Awareness&lt;/span&gt; 設定為 No 才能享受到 Windows 8.1&amp;nbsp;下自動 DPI scaling&amp;nbsp;的好處&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmy2ym3M1E_u1AcNzFX_KZocecQgjo5r5lu51p9vVVTeroDFDllLoQDnQOLWSinBpQriBl_M7wj7-eJmUERPINHYdkiAbXWgpMumHHwqTfiAWjBC1nBK8RNfg6_oJvjLCGE8l8c9znvk/s1600/DPI02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmy2ym3M1E_u1AcNzFX_KZocecQgjo5r5lu51p9vVVTeroDFDllLoQDnQOLWSinBpQriBl_M7wj7-eJmUERPINHYdkiAbXWgpMumHHwqTfiAWjBC1nBK8RNfg6_oJvjLCGE8l8c9znvk/s1600/DPI02.png&quot; height=&quot;432&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
參考：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;Writing DPI-Aware Desktop and Win32 Applications&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/444214709768310681/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/444214709768310681' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/444214709768310681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/444214709768310681'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/09/dpi-aware-application.html' title='DPI-Aware Application'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaJF-OezggP3efRszfa1TfwNbsTHkrw_XIPmyJBTnTmsVYE5MtmxNUf_ntdvkZhzPneAQDPtn8955TSVk_fOnfxqCXtaSAYBmluO7lVT8Cq0CVW0ohxgKFv5ss_3RHN9roCVVcP3gRzc4/s72-c/DPI01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-5677571800563424922</id><published>2014-09-25T19:12:00.000+08:00</published><updated>2014-09-25T19:13:35.344+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="MFC"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>【已解決】CMyButton 反應太慢</title><content type='html'>CMy&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/bb775943%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;Button&lt;/a&gt;&amp;nbsp;是一個 Owner-Drawn&amp;nbsp;的 CButton，最近在使用時發現：如果連續按的話，有時會沒有反應。&lt;br /&gt;
&lt;br /&gt;
原本懷疑：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;利用 &lt;a href=&quot;http://msdn.microsoft.com/zh-tw/library/7ykcbyxt%28v=vs.100%29.aspx&quot; target=&quot;_blank&quot;&gt;OnSetCursor&lt;/a&gt;&amp;nbsp;攔截 Mouse Over&amp;nbsp;的狀態，如果 Mouse&amp;nbsp;停留在 Button&amp;nbsp;的區域內，會一直產生重繪的動作 (&lt;span style=&quot;color: red;&quot;&gt;取消後問題仍在，故排除&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;按下 Button&amp;nbsp;後執行的程式佔用太多的時間，導致第二次 Button click&amp;nbsp;來不及處理 (&lt;span style=&quot;color: red;&quot;&gt;但使用標準的 CButton&amp;nbsp;則沒有問題，故排除&lt;/span&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;後來用 Spy++&amp;nbsp;攔截主視窗的 WM_COMMAND&amp;nbsp;訊息時發現：CButton&amp;nbsp;會依序產生 Button click&amp;nbsp;的訊息；但 CMyButton&amp;nbsp;如果連續按的話，第一次是 Button click，第二次則是 Double-click。&lt;br /&gt;
&lt;br /&gt;
原來 Owner-Drawn&amp;nbsp;的 CButton&amp;nbsp;快速連續按的話會產生 Double-click (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/bb761827%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;BN_DBLCLK notification code&lt;/a&gt;)，而主視窗並未處理該 Double-click&amp;nbsp;事件，所以看起來就像按鍵沒有反應。&lt;br /&gt;
&lt;br /&gt;
那為甚麼它會送出 Double-click message？如果 &lt;a href=&quot;http://msdn.microsoft.com/zh-tw/library/windows/desktop/ff729176%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;Windows Class Styles&lt;/a&gt;&amp;nbsp;有 CS_DBLCLKS&amp;nbsp;時 (&lt;span style=&quot;color: red;&quot;&gt;注意：是 Class Styles，不是 Window Styles。前者跟視窗的行為有關，後者跟視窗的外觀有關&lt;/span&gt;)，Control&amp;nbsp;就會接受 Double-click&amp;nbsp;並送出 Message&lt;br /&gt;
&lt;br /&gt;
所以解決辦法就是把 CS_DBLCLKS&amp;nbsp;拿掉，那它就不會送出 Double-click&amp;nbsp;了。目前的做法是在 Subclass&amp;nbsp;之前利用 SetClassLongPtr&amp;nbsp;修改即可。(&lt;span style=&quot;color: red;&quot;&gt;原本是使用 SetClassLong，為了相容
 32-bit and 64-bit Windows 才改的&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;void CMyButton::&lt;a href=&quot;http://msdn.microsoft.com/zh-tw/library/8d463726%28v=vs.100%29.aspx&quot; target=&quot;_blank&quot;&gt;PreSubclassWindow&lt;/a&gt;()
{
 // TODO: Add your specialized code here and/or call the base class
 HWND hWnd = GetSafeHwnd();
 ULONG_PTR ulStyle = &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/ms633581%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;GetClassLongPtr&lt;/a&gt;(hWnd, GCL_STYLE);
 ulStyle &amp;amp;= ~CS_DBLCLKS;
 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/ms633589%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;SetClassLongPtr&lt;/a&gt;(hWnd, GCL_STYLE, ulStyle);

 CButton::PreSubclassWindow();
}
&lt;/pre&gt;
&lt;br /&gt;
當然在論壇 &lt;a href=&quot;http://microsoft.public.vc.mfc.narkive.com/fvluF4cf/disable-double-klicks&quot; target=&quot;_blank&quot;&gt;Disable double klicks&lt;/a&gt;&amp;nbsp;中也有人提到用 &lt;a href=&quot;http://msdn.microsoft.com/zh-tw/library/windows/desktop/ms646263%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;SetDoubleClickTime&lt;/a&gt;&amp;nbsp;修改 Double-click&amp;nbsp;的間隔時間，甚至縮短到 0&amp;nbsp;就無法產生 Double-click&amp;nbsp;了。問題這是一個系統層級的函式，修改後會造成其它程式也無法 Double-click，所以不是一個理想的解決辦法。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/5677571800563424922/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/5677571800563424922' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/5677571800563424922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/5677571800563424922'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/09/cmybutton.html' title='【已解決】CMyButton 反應太慢'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-5120311582639916398</id><published>2014-08-07T10:14:00.000+08:00</published><updated>2014-08-07T10:16:34.221+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>在網路磁碟機設定 Visual Studio 2010 方案</title><content type='html'>由於網路磁碟機是屬於不信任的區域，因此在上面設定方案時會出現以下問題&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEpVWFhudo2a0w0rcvWXQxXt8GSZqH-yq2NoiA2P1n6utWY2t7Jrt8i2M5Xg3d4KIopnBDZyh_Xz6Q59seGcPBqe68aNXaD1pE7mgCL6p8ovJK7iu1sI-Q0Evb-SpX2mWZd_5fjoU6eQ8/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEpVWFhudo2a0w0rcvWXQxXt8GSZqH-yq2NoiA2P1n6utWY2t7Jrt8i2M5Xg3d4KIopnBDZyh_Xz6Q59seGcPBqe68aNXaD1pE7mgCL6p8ovJK7iu1sI-Q0Evb-SpX2mWZd_5fjoU6eQ8/s1600/1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
此時可以到 &lt;span style=&quot;color: blue;&quot;&gt;Tools | Options&lt;/span&gt;，在 &lt;span style=&quot;color: blue;&quot;&gt;Text Editor | C/C++ | Advanced&lt;/span&gt;&amp;nbsp;中將&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Always Use Fallback Location&amp;nbsp;設為 True&lt;/li&gt;
&lt;li&gt;Do Not Warn If Fallback Location Used&amp;nbsp;設為 True&lt;/li&gt;
&lt;li&gt;Fallback Location&amp;nbsp;提定存放的路徑，若為空白表示存放在使用者路徑下的 Temp&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ6VyjxlJokVFml6yyTrcCPJPxmJGUYfPlLPessgQ4U4nj__MSgyDet8EnE2-O6tT6UInt6tGACr0MDbIZO1y032lv4iiDYIK2yJTdF1QxBBkBBqEofCxvdbSwXkYaKxz8RgeI1TxlsF4/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ6VyjxlJokVFml6yyTrcCPJPxmJGUYfPlLPessgQ4U4nj__MSgyDet8EnE2-O6tT6UInt6tGACr0MDbIZO1y032lv4iiDYIK2yJTdF1QxBBkBBqEofCxvdbSwXkYaKxz8RgeI1TxlsF4/s1600/2.png&quot; height=&quot;390&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/5120311582639916398/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/5120311582639916398' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/5120311582639916398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/5120311582639916398'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/08/visual-studio-2010.html' title='在網路磁碟機設定 Visual Studio 2010 方案'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEpVWFhudo2a0w0rcvWXQxXt8GSZqH-yq2NoiA2P1n6utWY2t7Jrt8i2M5Xg3d4KIopnBDZyh_Xz6Q59seGcPBqe68aNXaD1pE7mgCL6p8ovJK7iu1sI-Q0Evb-SpX2mWZd_5fjoU6eQ8/s72-c/1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-7683644440853955707</id><published>2014-06-13T16:48:00.001+08:00</published><updated>2014-06-13T17:04:32.760+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>【分享】如何顯示 Debug Message</title><content type='html'>通常在程式 Debug&amp;nbsp;的過程中會需要顯示一些訊息，最簡單的方式就是利用 MessageBox&amp;nbsp;來顯示，但缺點是會中斷程式的執行。&lt;br /&gt;
&lt;br /&gt;
所以在 Console or Win32 的程式底下，我們可以直接利用 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/aa363362%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;OutputDebugString&lt;/a&gt; (in windows.h) 將訊息輸出到 Visual Studio Output Window，例如&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutputDebugString(_T(&quot;Hello, OutputDebugString.\n&quot;));&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
而 MFC 就更方便了，可以直接用 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/6w95a4ha.aspx&quot; target=&quot;_blank&quot;&gt;TRACE&lt;/a&gt; 巨集，還可以直接格式化字串，例如&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRACE(_T(&quot;Hello, TRACE No. %d.\n&quot;), num);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
輸出結果如下：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_raxBupd5baSjH4dLZxofWg7ksk6OECZ-y8Q2WhADbl5Dxk_Qh2wvz9fP67LOGL31DJsahDfOM2vYGDn1LEkgUySrM9JYxKeOzsVH_ElJK-cukzl5ATLGb84rvc_ShxwVWY9Jgz-S_6g/s1600/%E6%9C%AA%E5%91%BD%E5%90%8D2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_raxBupd5baSjH4dLZxofWg7ksk6OECZ-y8Q2WhADbl5Dxk_Qh2wvz9fP67LOGL31DJsahDfOM2vYGDn1LEkgUySrM9JYxKeOzsVH_ElJK-cukzl5ATLGb84rvc_ShxwVWY9Jgz-S_6g/s1600/%E6%9C%AA%E5%91%BD%E5%90%8D2.png&quot; height=&quot;145&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
但如果是在客戶端而且沒有安裝 Visual Studio&amp;nbsp;程式呢？此時可以到 Microsoft TechNet&amp;nbsp;下載 &lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx&quot; target=&quot;_blank&quot;&gt;DebugView&lt;/a&gt; (目前最新版為 v4.81)，解壓縮後直接用 &quot;&lt;span style=&quot;color: blue;&quot;&gt;管理者權限&lt;/span&gt;&quot; 執行 Dbgview.exe，然後設定 &quot;&lt;span style=&quot;color: blue;&quot;&gt;Capture Global Win32&lt;/span&gt;&quot; (PS :&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;後來測試不需要管理者權限，而且用預設的 Capture Win32&amp;nbsp;即可&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjak557Nrt8DlzxWXJEZ6rXFE6RPuhEfhoHfgcK_plCIZ-Qixls8oETgMatwzZ9-Nb6QMbwzDd3JKrINd5bYEDMnHyxnhoJi9jvxAKtNL_CjyNKaGHZidnJq7dFAL4r9xmDrCDAUR2T3-I/s1600/%E6%9C%AA%E5%91%BD%E5%90%8D3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjak557Nrt8DlzxWXJEZ6rXFE6RPuhEfhoHfgcK_plCIZ-Qixls8oETgMatwzZ9-Nb6QMbwzDd3JKrINd5bYEDMnHyxnhoJi9jvxAKtNL_CjyNKaGHZidnJq7dFAL4r9xmDrCDAUR2T3-I/s1600/%E6%9C%AA%E5%91%BD%E5%90%8D3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
輸出結果如下：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuMibOqG7vx2XA-NkpnnNpTdmcfFAB60s9DEyHAhE2B5ALyv2XJyNtNuth_camjf5s4G-lOtdaztmvD0cnIGoc6U8Ny-OiZsqHTGT891_2FgtFjTUngqr712VlVirI8acCEqSA7HgKPrI/s1600/%E6%9C%AA%E5%91%BD%E5%90%8D1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuMibOqG7vx2XA-NkpnnNpTdmcfFAB60s9DEyHAhE2B5ALyv2XJyNtNuth_camjf5s4G-lOtdaztmvD0cnIGoc6U8Ny-OiZsqHTGT891_2FgtFjTUngqr712VlVirI8acCEqSA7HgKPrI/s1600/%E6%9C%AA%E5%91%BD%E5%90%8D1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
客戶就可以將這些訊息存檔，提供給我們 Debug&amp;nbsp;用了&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/7683644440853955707/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/7683644440853955707' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7683644440853955707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/7683644440853955707'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/06/debug-message.html' title='【分享】如何顯示 Debug Message'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_raxBupd5baSjH4dLZxofWg7ksk6OECZ-y8Q2WhADbl5Dxk_Qh2wvz9fP67LOGL31DJsahDfOM2vYGDn1LEkgUySrM9JYxKeOzsVH_ElJK-cukzl5ATLGb84rvc_ShxwVWY9Jgz-S_6g/s72-c/%E6%9C%AA%E5%91%BD%E5%90%8D2.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-4135766512183998211</id><published>2014-06-09T10:33:00.000+08:00</published><updated>2014-06-09T10:33:08.936+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="工具設定"/><title type='text'>記錄 PDF 最後讀取位置</title><content type='html'>最近在讀 PDF&amp;nbsp;電子書時，每次開啟都要從第一頁切換到最後讀取的頁數，如果不記得的話，甚至還要花不少時間來搜尋，於是上網找找看有沒有類似書籤的功能，原來就在 ...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr7PEJ4nQNIFwPAulksEOgJ95PIppEhTsaUmM5eb8giXxEtEHampqeh7H_4U4MNhlwtdvRVPNTQzqXt-1vvjCyMPf3EkCfEzy1BhV9JOJ91ITKofCN6y4IixoxsVkDxuppKaD5L1bOUVs/s1600/arcobat.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr7PEJ4nQNIFwPAulksEOgJ95PIppEhTsaUmM5eb8giXxEtEHampqeh7H_4U4MNhlwtdvRVPNTQzqXt-1vvjCyMPf3EkCfEzy1BhV9JOJ91ITKofCN6y4IixoxsVkDxuppKaD5L1bOUVs/s1600/arcobat.png&quot; height=&quot;585&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/4135766512183998211/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/4135766512183998211' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/4135766512183998211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/4135766512183998211'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/06/pdf.html' title='記錄 PDF 最後讀取位置'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr7PEJ4nQNIFwPAulksEOgJ95PIppEhTsaUmM5eb8giXxEtEHampqeh7H_4U4MNhlwtdvRVPNTQzqXt-1vvjCyMPf3EkCfEzy1BhV9JOJ91ITKofCN6y4IixoxsVkDxuppKaD5L1bOUVs/s72-c/arcobat.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-8211431940471921778</id><published>2014-04-23T18:16:00.000+08:00</published><updated>2014-04-23T18:16:06.380+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MFC"/><category scheme="http://www.blogger.com/atom/ns#" term="Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>如何防止 Windows 重新啟動或關機</title><content type='html'>一般 MFC Dialog base&amp;nbsp;的程式，我們會在 OnInitDialog()&amp;nbsp;做一些初始化的動作；然後在 PostNcDestroy()&amp;nbsp;做一些清除資源，或將資料寫回 HD&amp;nbsp;的動作。&lt;br /&gt;
&lt;br /&gt;
但在 Windows&amp;nbsp;重新啟動或關機的情況下，是不會執行到 PostNcDestroy()&amp;nbsp;的，這時就會造成一些程式動作未完成。&lt;br /&gt;
&lt;br /&gt;
Windows&amp;nbsp;有兩個 Message&amp;nbsp;跟重新啟動或關機有關：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;WM_QUERYENDSESSION&lt;/a&gt;&amp;nbsp;：詢問程式是否可關機，回傳 TRUE&amp;nbsp;表示可以，FALSE&amp;nbsp;則不行。此外 lParam&amp;nbsp;會指出一些程式關閉的情況，不過在 MFC OnQueryEndSession() 都省略掉了。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/desktop/aa376889%28v=vs.85%29.aspx&quot; target=&quot;_blank&quot;&gt;WM_ENDSESSION&lt;/a&gt;：程式執行完 WM_QUERYENDSESSION&amp;nbsp;後呼叫 (不論其傳回結果為 TRUE&amp;nbsp;或 FASE)，其傳回結果會反應在 wParam；而 lParam&amp;nbsp;的內容同 WM_QUERYENDSESSION，不過在 MFC OnEndSession() 一樣被省略了。&lt;/li&gt;
&lt;/ol&gt;
所以這兩個地方都可以拿來做跟 PostNcDestroy() 一樣的工作，差別在 WM_QUERYENDSESSION 可以傳回 FALSE 來阻止 Windows 重新啟動或關機而己。 &lt;br /&gt;
&lt;ol&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;/ol&gt;
</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/8211431940471921778/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/8211431940471921778' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/8211431940471921778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/8211431940471921778'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/04/windows.html' title='如何防止 Windows 重新啟動或關機'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-9100160284488561853</id><published>2014-01-23T10:19:00.001+08:00</published><updated>2014-01-23T10:19:44.602+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>[已解決] side-by-side error</title><content type='html'>好久沒有寫心得了，最近寫程式拿到另一個平台執行時，發生以下問題&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid826hgOi8GlnQSJ6Y-BLsfsmLiVLN0xb6VFbJCHRyYHSQCMyva75UgKICJrT6Rbve7ClTg4gJAufN6iu4qi4xzsZpcduzx629BP0d_qYLXtADS7zJ_1NQVmC8NDmc5kOj6VhRdySKZOM/s1600/Win8.1+error.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid826hgOi8GlnQSJ6Y-BLsfsmLiVLN0xb6VFbJCHRyYHSQCMyva75UgKICJrT6Rbve7ClTg4gJAufN6iu4qi4xzsZpcduzx629BP0d_qYLXtADS7zJ_1NQVmC8NDmc5kOj6VhRdySKZOM/s1600/Win8.1+error.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
原因是我的程式需要 MFC DLL，Debug version&amp;nbsp;使用 Share library，而新的平台並未安裝對應的 DLL，導至程式執行時找不到，所以就產生問題了&lt;br /&gt;
&lt;br /&gt;
另外 Release version&amp;nbsp;使用 Static library，內建在程式中，所以就沒問題&lt;br /&gt;
&lt;br /&gt;
而開發平台有安裝對應的 DLL，所以總是看不到問題，下次如果要部署 Share library&amp;nbsp;版本，記得在安裝程式中安裝對應的 DLL&amp;nbsp;版本。</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/9100160284488561853/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/9100160284488561853' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/9100160284488561853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/9100160284488561853'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2014/01/side-by-side-error.html' title='[已解決] side-by-side error'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid826hgOi8GlnQSJ6Y-BLsfsmLiVLN0xb6VFbJCHRyYHSQCMyva75UgKICJrT6Rbve7ClTg4gJAufN6iu4qi4xzsZpcduzx629BP0d_qYLXtADS7zJ_1NQVmC8NDmc5kOj6VhRdySKZOM/s72-c/Win8.1+error.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-4661758414104049793</id><published>2013-11-18T11:26:00.000+08:00</published><updated>2013-11-18T11:26:52.166+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MFC"/><category scheme="http://www.blogger.com/atom/ns#" term="程式設計"/><title type='text'>【已解決】CResourceException 異常處理</title><content type='html'>最近開發一個自訂控制項，當視窗經過多次放大、縮小後就會產生&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;First-chance exception&lt;/span&gt; at 0x000007fefcfe940d in XXX_x64.exe: Microsoft C++ exception: &lt;span style=&quot;color: red;&quot;&gt;CResourceException&lt;/span&gt; * __ptr64 at memory location 0x0027b360..&lt;br /&gt;
First-chance exception at 0x000007fefcfe940d in XXX_x64.exe: Microsoft C++ exception: CInvalidArgException * __ptr64 at memory location 0x00276b90..&lt;br /&gt;
Warning: Uncaught exception in WindowProc (returning 0).&lt;br /&gt;
&lt;br /&gt;
經過搜尋的結果，應該是使用資源後未釋放，造成資源耗盡。問題是沒有捕捉到產生異常的地方，要修改也無從下手。於是先用 try catch&amp;nbsp;在有可能的地方試試看&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;void ItemView::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

	// TODO:  Add your code to draw the specified item
	try {
		CDC*	pDC = CDC::FromHandle(lpDrawItemStruct-&amp;gt;hDC);
		. . .
	} catch (CResourceException*) {
		&lt;span style=&quot;color: red;&quot;&gt;TRACE(_T(&quot;Happened\n&quot;));&lt;/span&gt;
	}
}
&lt;/pre&gt;
&lt;br /&gt;
把中斷點設在 TRACE，經過操作視窗放大、縮小後，果然就捕捉到了。不過檢查程式碼的結果，並沒有發現未釋放資源的狀況。而且把程式碼註解掉先不要執行，依然在別的地方會產生異常，&lt;span style=&quot;color: red;&quot;&gt;可見這裡是 &quot;果&quot;，而非 &quot;因&quot;&lt;/span&gt;。是別的地方將資源耗盡，所以需要取用資源的地方得不到資源就會產生異常了。&lt;br /&gt;
&lt;br /&gt;
經過多方的查證，總算在上層的視窗找到一個可疑的地方&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;HBRUSH DlgScroll::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  Change any attributes of the DC here

	// TODO:  Return a different brush if the default is not desired
	&lt;span style=&quot;color: red;&quot;&gt;hbr = CreateSolidBrush(RGB(0, 0, 0));	//black&lt;/span&gt;
	return hbr;
}
&lt;/pre&gt;
&lt;br /&gt;
這裡會一直產生黑色的 Brush，但並沒有釋放掉的機制，所以凶手應該就是它了。更慘的是它不會產生異常，所以 try catch 了半天也捕捉不到。將程式碼改成以下的方式就正常了！&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;hbr = (HBRUSH)GetStockObject(BLACK_BRUSH);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
另外用 &lt;span style=&quot;color: blue;&quot;&gt;資源監視器&lt;/span&gt; (從 &lt;span style=&quot;color: blue;&quot;&gt;工作管理員&lt;/span&gt; 的 &lt;span style=&quot;color: blue;&quot;&gt;效能&lt;/span&gt; 頁中開啟) 也可以觀看記憶體使用的狀況&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUKPL8kTqI3tMHR8lZLqgEJMhDON3RZuQ9mNMbvh0xo8qEB9Zjk46cUPmmPEFVu15peVtvUVNzQcrD2dAGMUTK08TRC6prDLtV7fh8sI0MGlYrEQK7wOy49h-7V8f7lxoow17-5YedGg0/s1600/Exception.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUKPL8kTqI3tMHR8lZLqgEJMhDON3RZuQ9mNMbvh0xo8qEB9Zjk46cUPmmPEFVu15peVtvUVNzQcrD2dAGMUTK08TRC6prDLtV7fh8sI0MGlYrEQK7wOy49h-7V8f7lxoow17-5YedGg0/s640/Exception.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
到程式 Crash&amp;nbsp;為止，可以看到工作集記憶體增加了將近 800KB；而正常的版本只有幾 10KB&amp;nbsp;的上下變動而己。&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
另外假設 FromHandle 產生異常的話，那程式將直接結束，而不會將結果設定 pDC，所以 ASSERT 也是沒作用的。
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;	CDC*	pDC = CDC::FromHandle(lpDrawItemStruct-&amp;gt;hDC);
	ASSERT(pDC != NULL);
&lt;/pre&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/4661758414104049793/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/4661758414104049793' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/4661758414104049793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/4661758414104049793'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2013/11/cresourceexception.html' title='【已解決】CResourceException 異常處理'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUKPL8kTqI3tMHR8lZLqgEJMhDON3RZuQ9mNMbvh0xo8qEB9Zjk46cUPmmPEFVu15peVtvUVNzQcrD2dAGMUTK08TRC6prDLtV7fh8sI0MGlYrEQK7wOy49h-7V8f7lxoow17-5YedGg0/s72-c/Exception.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-3082552658929975868</id><published>2013-09-05T13:55:00.001+08:00</published><updated>2013-09-16T15:13:05.290+08:00</updated><title type='text'>[已解決] Ubuntu 12.04 LTS 無法連接網路</title><content type='html'>日前在公司的 Z87 主機板上安裝 Ubuntu 12.04 LTS 後，才發現網路無法使用，經過一番 Google 後才知道是晶片太新，Ubuntu kernel 不支援，只好手動安裝 Driver 了。所幸不太複雜，為了怕以後還要再來一次，所以就先記錄一下。&lt;br /&gt;
&lt;br /&gt;
首先到 &lt;a href=&quot;https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&amp;amp;DwnldID=15817&quot; target=&quot;_blank&quot;&gt;Network Adapter Driver for PCI-E Gigabit Network Connections under Linux*&lt;/a&gt; 下載 Driver&lt;br /&gt;
&lt;br /&gt;
接下來三個步驟就搞定了&lt;br /&gt;
&lt;br /&gt;
tar zxf e1000e-&amp;lt;x.x.x&amp;gt;.tar.gz&lt;br /&gt;
&lt;br /&gt;
cd e1000e-&amp;lt;x.x.x&amp;gt;/src/&lt;br /&gt;
sudo make install&lt;br /&gt;
&lt;br /&gt;
sudo modprobe e1000e insmod e1000e&lt;br /&gt;
&lt;br /&gt;
參考：intel Network Connectivity &lt;a href=&quot;http://www.intel.com/support/network/sb/cs-032514.htm&quot; target=&quot;_blank&quot;&gt;Linux* e1000e Base Driver overview and installation&lt;/a&gt;&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
2013/9/16&lt;br /&gt;
&lt;br /&gt;
今天的 Ubuntu 網路忽然又不能用了，於是又讀了一遍 e1000e 的 Readme，發現有可能是舊版的 e1000e Driver 所造成的，於是依照下列的步驟：先移除舊的，然後再安裝一次就 OK 了！&lt;br /&gt;
&lt;br /&gt;
sudo rmmod e1000e&lt;br /&gt;
sudo modprobe e1000e</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/3082552658929975868/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/3082552658929975868' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/3082552658929975868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/3082552658929975868'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2013/09/ubuntu-1204-lts.html' title='[已解決] Ubuntu 12.04 LTS 無法連接網路'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-987879516936367784.post-2679136782263944078</id><published>2013-08-30T14:00:00.005+08:00</published><updated>2018-01-28T23:32:52.103+08:00</updated><title type='text'>利用 GRUB2 掛載 ISO 檔安裝  OS</title><content type='html'>以前要安裝新的 OS 總是要利用光碟片來開機才能安裝，但最近碰到光碟機會挑片，無法讀取單面雙層的 DVD，每次要安裝還得跟別人借光碟機，實在有夠麻煩！&lt;br /&gt;
&lt;br /&gt;
後來偶然間看到 &lt;a href=&quot;https://help.ubuntu.com/community/Grub2/ISOBoot&quot; target=&quot;_blank&quot;&gt;Grub2/ISOBoot&lt;/a&gt; 才發現：原來 GRUB2 不只可以掛載 Partition，也可以掛載 ISO 檔模擬成光碟機 (類似 Windows 下的虛擬光碟機)，這樣就可以安裝了，而且速度還比實體光碟機快多了，反正現在硬碟空間那麼大，不在乎存放 ISO 檔的那一點點空間！&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;以下就用 Ubuntu 10.04 的 ISO 檔來實驗看看，首先編輯 menuentry&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;sudo gedit /etc/grub.d/40_custom&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
加入以下的設定&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;menuentry &quot;Ubuntu 10.04 ISO&quot; {
 set isofile=&quot;/ubuntu-10.04.4-desktop-i386.iso&quot;
 loopback loop (hd0,8)$isofile
 linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
 initrd (loop)/casper/initrd.lz
}
&lt;/pre&gt;
&lt;br /&gt;
其中 &lt;span style=&quot;color: blue;&quot;&gt;set isofile&lt;/span&gt; 與 &lt;span style=&quot;color: blue;&quot;&gt;loopback&lt;/span&gt; 是設定 ISO 檔的存放位置，像我是在 /dev/sda8 切一塊 ext4 的空間專門用來存放檔案&lt;br /&gt;
&lt;br /&gt;
至於後面兩個則是啟動指令，不同的 OS 會有不同的啟動方式，有機會再補上其它 OS 的資料，詳細的說明就請參考上面 GRUB2 的文件&lt;br /&gt;
&lt;br /&gt;
存檔後再執行&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;sudo update-grub&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
重新開機後就可以進入 Ubuntu 10.04 Live CD 了&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
2018/01/28&lt;br /&gt;
&lt;br /&gt;
以上的作法在 Ubuntu 17.10 上已經行不通了，參考 &lt;a href=&quot;https://help.ubuntu.com/community/Grub2/ISOBoot#grml-rescueboot&quot; target=&quot;_blank&quot;&gt;grml-rescueboot&lt;/a&gt; 的作法如下：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;安裝 grml-rescueboot &lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;sudo apt-get install grml-rescueboot&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;把 iso 檔案放到 /boot/grml/ 下&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;sudo mv ~/Downloads/&amp;lt;filename.iso&amp;gt; /boot/grml/&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;更新 grub&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;sudo update-grub&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
在安裝的過程中會出現因無法卸載而導致安裝失敗，參考 &lt;a href=&quot;https://help.ubuntu.com/community/Grub2/ISOBoot#Installing_Ubuntu_from_a_Menuentry_Boot&quot; target=&quot;_blank&quot;&gt;Installing Ubuntu from a Menuentry Boot&lt;/a&gt; 的作法如下：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;以試用的方式進入 Ubuntu&lt;/li&gt;
&lt;li&gt;開啟終端機執行卸載&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;sudo umount -l -r -f /isodevice&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;點選 &quot;安裝 Ubuntu&quot; 開始安裝&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
2013/9/30&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: magenta;&quot;&gt;Windows 7 x64 (from MSDN test OS)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
首先要說明的是，Windows 7 無法使用 Ubuntu 的方式來載入，後來參考&amp;nbsp;&lt;a href=&quot;http://www.librehat.com/grub2-boot-windows-pe-and-otheriso-file/&quot; target=&quot;_blank&quot;&gt;GRUB2引导Windows PE等ISO文件的办法&lt;/a&gt; 使用 &lt;a href=&quot;https://www.kernel.org/pub/linux/utils/boot/syslinux/&quot; target=&quot;_blank&quot;&gt;syslinux&lt;/a&gt; 內建的 memdisk (解開後位於 bios/memdisk 的路徑下) 來載入就行了，為了方便使用，我把它跟 ISO 檔放在相同的位置。&lt;br /&gt;
&lt;br /&gt;
接下來是 ISO 檔的製作，原本在 Windows 找了一些軟體，但製作出來的 ISO 檔都無法使用。後來直接使用 Ubuntu 內建的 &lt;span style=&quot;color: blue;&quot;&gt;Brasero 光碟燒錄程式&lt;/span&gt; 就 OK 了。開啟 Brasero 後點選 &lt;span style=&quot;color: blue;&quot;&gt;光碟複製&lt;/span&gt;，在目標光碟選擇 &lt;span style=&quot;color: blue;&quot;&gt;映像檔案&lt;/span&gt; 即可。&lt;br /&gt;
&lt;br /&gt;
最後就是 menuentry 的設定了&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;sudo gedit /etc/grub.d/40_custom&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
加入以下的設定&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;menuentry &#39;Boot Windows 7 64-bit ISO&#39;{
        set root=&#39;(hd0,msdos8)&#39;
        echo &#39;Loading Memdisk...&#39;
        &lt;span style=&quot;color: red;&quot;&gt;insmod memdisk&lt;/span&gt;
        linux16 /&lt;span style=&quot;color: red;&quot;&gt;memdisk iso raw&lt;/span&gt;
        echo &#39;Loading ISO...&#39;
        initrd16 /Win7_64.iso
}
&lt;/pre&gt;
&lt;br /&gt;
它跟上面不同的地方在於 GRUB2 先載入 memdisk，再利用 memdisk 載入 ISO 檔來執行；而不像 Ubuntu 直接由 GRUB2 載入。另外 linux16 與 initrd16 是用來載入 16-bit 程式的。&lt;br /&gt;
&lt;br /&gt;
存檔後再執行&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;sudo update-grub&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
就大功告成了！&lt;br /&gt;
&lt;br /&gt;
這裡附帶提一下 Windows 下的虛擬光碟機，原本想使用 Microsoft 的 &lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=38780&quot; target=&quot;_blank&quot;&gt;Virtual CD-ROM Control Panel&lt;/a&gt;，但它不支援 64-bit OS；後來改用&amp;nbsp;&lt;a href=&quot;http://www.slysoft.com/en/virtual-clonedrive.html&quot; target=&quot;_blank&quot;&gt;Virtual CloneDrive&lt;/a&gt; 就可以了，這樣裝 Visual Studio 就不需要光碟機了！(當然要先製作 ISO 檔)&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
2013/10/4&lt;br /&gt;
&lt;br /&gt;
用上述方式開始安裝後，會出現 &quot;&lt;span style=&quot;color: red;&quot;&gt;遺失必要的 CD/DVD 磁碟裝置驅動程式...&lt;/span&gt;&quot; (參考：&lt;a href=&quot;http://fireball-catcher.blogspot.tw/2012/07/grub4dos.html&quot; target=&quot;_blank&quot;&gt;Grub4Dos 系統安裝碟&lt;/a&gt;) 看起來上述掛載的方式只是載入一些前導程式，實際要安裝的程式內容並未掛載上來 (我猜想)，關閉錯誤訊息後回到主畫面，然後進入 &lt;span style=&quot;color: blue;&quot;&gt;系統管理員&lt;/span&gt; (Shift&amp;nbsp;+ F10) 利用 &lt;a href=&quot;http://www.ltr-data.se/opencode.html/#ImDisk&quot; target=&quot;_blank&quot;&gt;ImDisk&lt;/a&gt; 把 ISO 檔再掛載一次就可以了。 &lt;br /&gt;
&lt;br /&gt;
首先把下載的 ImDisk&amp;nbsp;用 7-Zip&amp;nbsp;解壓縮後，跟 ISO&amp;nbsp;檔放在一起，然後建立以下兩個批次檔&lt;br /&gt;
&lt;br /&gt;
SetupImDisk.CMD (安裝 ImDisk)&lt;br /&gt;
&lt;pre&gt;rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 132 .\imdisk.inf
&lt;/pre&gt;
&lt;br /&gt;
SetupCDROM.CMD (載入 ISO 檔)
&lt;br /&gt;
&lt;pre&gt;Set fullname=%~1
imdisk -a -f &quot;%fullname%&quot; -m #:
&lt;/pre&gt;
&lt;br /&gt;
然後輸入下列指令&lt;br /&gt;
&lt;pre&gt;pushd D:\ImageSource\imdisk // 切換到 ImDisk 的路徑 (實際上用 cd 切換到該路徑即可，但配置的磁碟機路徑需要自行找一下)
SetupImDisk.CMD // 安裝 ImDisk
SetupCDROM.CMD ..\Win7_64.ISO // 掛載 ISO 檔
&lt;/pre&gt;
&lt;br /&gt;
此外因為 ISO 檔需要在安裝的過程中重新掛載，所以將 ISO 檔從 ext4 移到 NTFS，但 memdisk 仍然放在 ext4 的位置，修改的 memuentry&amp;nbsp; 如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;menuentry &#39;Boot Windows 7 64-bit ISO NTFS&#39;{
        set root=&#39;(hd0,msdos8)&#39;
        echo &#39;Loading Memdisk...&#39;
        insmod memdisk
        linux16 /memdisk iso raw
        set root=&#39;(hd0,msdos9)&#39;
        echo &#39;Loading ISO...&#39;
        initrd16 /ImageSource/Win7_64.iso
}
&lt;/pre&gt;
&lt;br /&gt;
接下來就是把系統保留的 100MB 刪除，不過這一次沒做，下次有做再補吧
</content><link rel='replies' type='application/atom+xml' href='http://jw1903.blogspot.com/feeds/2679136782263944078/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/987879516936367784/2679136782263944078' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2679136782263944078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/987879516936367784/posts/default/2679136782263944078'/><link rel='alternate' type='text/html' href='http://jw1903.blogspot.com/2013/08/grub2-iso-os.html' title='利用 GRUB2 掛載 ISO 檔安裝  OS'/><author><name>牧童叔</name><uri>http://www.blogger.com/profile/03324459111368900372</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>