注意: 參考不同的型別程式庫可能會呈現可執行的平台相依

文章翻譯 文章翻譯
文章編號: 281913 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

徵狀

編譯參考一個以上的型別程式庫 (如 Microsoft Windows 2000 架構的電腦) 的一個平台上的 Visual Basic 專案之後, 產生的二進位檔無法在其他平台 (如 Microsoft Windows NT 4-、 Microsoft Windows 95-、 Microsoft Windows 98-,及 Microsoft Windows ME 型電腦) 上執行,並取得發生存取違規 (AV)。

發生的原因

它會讀取 dllname 型別程式庫中的項目時,Visual Basic 編譯器會區分大小寫。如此一來如果專案參考兩個或多個型別程式庫,並在不同的情況下,例如在程式庫 A,dllname("kernel32.dll") 和 dllname("KERNEL32.DLL") 程式庫 B 中的不同程式庫中拼法是同一個 DLL dllname 項目編譯器產生匯入的兩個區段為相同的 DLL,並呈現二進位的平台相依。

狀況說明

Microsoft 已確認這是在本文開頭所列之 Microsoft 產品中的有錯誤。

其他相關資訊

重製行為的步驟

  1. 設定 Windows 2000 架構的電腦和 Windows NT 4 架構電腦兩者都具有最新的 Service Pack。也安裝 Visual Basic 和 Visual C++ 6.0 服務封包 5 與兩台電腦上。
  2. 在 Windows 2000 基礎] 電腦上複製和貼上下列介面描述語言 (IDL) 程式碼貼入 [記事本],並將它存成 lcase.idl。使用 MIDL.EXE midl lcase.idl 編譯它。產生的型別程式庫名稱是 lcase.tlb
    [
      uuid(D618AA4D-814A-47a2-9AC1-DDE18EDF1C54),
      version(1.0),
      helpstring("Lower case test")
    ]
    library lcasetest
    {
        [
          dllname("kernel32.dll"),
          version(1.0),
          helpstring("Sleep function exported by kernel32.dll")
        ]
        module lcasetest {
            [
    			entry("Sleep"), 
    			helpstring("sleep - lcase test.")
    		]
            void _stdcall Sleep([in] long dwMS);
        };
    };
    					
  3. 在步驟 1 中, 建置 ucase.tlb 以下列的 IDL 程式碼:
    [
      uuid(3F215C63-D0AD-4980-93F2-5DDF850061E4),
      version(1.0),
      helpstring("Upper case test")
    ]
    library ucasetest
    {
        [
          dllname("KERNEL32.DLL"),
          version(1.0),
          helpstring("Sleep function exported by kernel32.dll")
        ]
        module lcasetest {
            [
    			entry("Sleep"), 
    			helpstring("sleep - ucase test.")
    		]
            void _stdcall Sleep([in] long dwMS);
        };
    };
    					
  4. 建立 Visual Basic 標準 EXE 專案。預設會建立 Form1。
  5. 在 [專案] 功能表上按一下以選取 [參考]。在 [參考] 對話方塊中瀏覽到 lcase.tlb] 及 [ucase.tlb、 選取這兩個程式庫,然後再按一下 [確定]]。
  6. 將下列程式碼加入至 Form1:
    Private Sub Form_Load()
        lcasetest.Sleep 1
        ucasetest.Sleep 1
    End Sub
    					
  7. 在 [檔案] 功能表上按一下以 儲存 該專案,然後選取 [製成 Project1.exe 來編譯專案。
  8. 執行 Project1.exe,執行檔,並請注意表單就會顯示有沒有錯誤。
  9. 將 Project1.exe 複製到 Windows NT 4 架構的電腦並執行它。請注意就會發生存取違規。
  10. 複製和相同的專案,在 Windows NT 4 架構的電腦上編譯並執行它這兩個 Windows NT 4 和 Windows 2000 基礎電腦上。請注意它在 Windows 2000 電腦上失敗。

屬性

文章編號: 281913 - 上次校閱: 2014年2月24日 - 版次: 3.0
這篇文章中的資訊適用於:
  • Microsoft Visual Basic 4.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
關鍵字:?
kbnosurvey kbarchive kbmt kbbug kbcompiler kbnofix KB281913 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:281913
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com