Tommy 碎碎念
https://blog.teatime.com.tw/
Tommy Wu's blog
tommy
2024-03-29T20:04:57Z
-
Visual Studio 2012 在 Windows 8 底下無法使用 Shell32.Shell 的問題?
https://blog.teatime.com.tw/1/post/427
<p>最近開始用 C# 寫 .Net 的程式, 發現就寫程式的方便性來說, 比起直接用 C/C++ 寫要方便許多. 所以... 原本有些為了方便, 使用 php 來寫的 script, 也都順便改用 C# 來寫.</p><p>因為 Windows 8 與 Visual Studio 2012 出來後, 就由 MSDN 中抓回來用, 其實算很好用. 不過... 碰到一個原本在 Windows 7 搭配 Visual Studio 2010 時可以正常運作的程式, 改用 Windows 8 搭配 Visual Studio 2012 就會出現錯誤.</p><p>出錯的地方很簡單, 就類似這樣:</p><pre class="csharp"><div class="insertcode"><pre class="csharp" style="font-family: monospace"><span class="kw1">namespace</span> Shell32Test<br /><span class="br0">{</span><br /> <span class="kw4">class</span> Program<br /> <span class="br0">{</span><br /> <span class="kw1">static</span> <span class="kw1">void</span> Main<span class="br0">(</span><span class="kw4">string</span><span class="br0">[</span><span class="br0">]</span> args<span class="br0">)</span><br /> <span class="br0">{</span><br /> <span class="kw4">object</span> shell <span class="sy0">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Shell32.<span class="me1">Shell</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="br0">}</span><br /> <span class="br0">}</span><br /><span class="br0">}</span></pre></div></pre><p>會出現下面的錯誤:</p><pre class="csharp"><div class="insertcode"><pre class="csharp" style="font-family: monospace">Unable to cast COM <span class="kw4">object</span> of type <span class="st0">'System.__ComObject'</span> to <span class="kw4">interface</span> type <span class="st0">'Shell32.Shell'</span>. <span class="kw1">This</span> operation failed because the QueryInterface call on the COM component <span class="kw1">for</span> the <span class="kw4">interface</span> with IID <span class="st0">'{286E6F1B-7113-4355-9562-96B7E9D64C54}'</span> failed due to the following error<span class="sy0">:</span> No such <span class="kw4">interface</span> supported <span class="br0">(</span>Exception from HRESULT<span class="sy0">:</span> 0x80004002 <span class="br0">(</span>E_NOINTERFACE<span class="br0">)</span><span class="br0">)</span>.</pre></div></pre><p>不過, 同一個程式, 在 Windows 7 下, 不管用 Visual Studio 2010 或 2012 都可以運作. 而且, 把那個可以運作的執行檔, 複製到 Windows 8 也一樣可以正常運作.</p><p>後來, 發現在 Windows 8 底下用 Visual Studio 2012 寫 Windows Form 的程式時, 也可以正常運作. 似乎只有在 console 程式會無法運作.</p><p>比較一下兩者的程式碼, 發現 Windows Form 的程式會在 Main 前面加上<span class="pln">一行:</span></p><pre class="csharp"><div class="insertcode"><pre class="csharp" style="font-family: monospace"><span class="br0">[</span>STAThread<span class="br0">]</span></pre></div></pre><p>試著加上變成:</p><pre class="csharp"><div class="insertcode"><pre class="csharp" style="font-family: monospace"><span class="kw1">namespace</span> Shell32Test<br /><span class="br0">{<br /> [STAThread]<br /></span> <span class="kw4">class</span> Program<br /> <span class="br0">{</span><br /> <span class="kw1">static</span> <span class="kw1">void</span> Main<span class="br0">(</span><span class="kw4">string</span><span class="br0">[</span><span class="br0">]</span> args<span class="br0">)</span><br /> <span class="br0">{</span><br /> <span class="kw4">object</span> shell <span class="sy0">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Shell32.<span class="me1">Shell</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="br0">}</span><br /> <span class="br0">}</span><br /><span class="br0">}</span></pre></div></pre><p>這樣子居然可以正常執行了. 真是個奇怪的 bug. </p>
程式設計
C#
VS2012
Windows 8
.Net
2012-09-19T17:32:58Z
tommy