none
Call DLL檔, 出現0x8007007E錯誤訊息 RRS feed

  • 問題

  • 大家好, 不好意思, 小弟目前開發一個系統, vb.net製作畫面, 自己用c++寫了一個dll(暫且稱Main.dll)來包其他元件的dll(其他統稱Client.dll),

    先說明一下, 本機開發環境:

    1. OS:Windows7 x64

    2. IDE:VS2013

    3. 開發方式:VB.NET + VC++, CLR方式開發

    目前要將系統移轉至相同的Win7x64下, 先在測試環境安裝.net framework4.5.1, vc++2008, 2010, 2012, 2013專發套件, 但是我呼叫我自己寫的dll卻發生上述錯誤, 看來應該是dll相依性問題, 猜測Client.dll有的是用vc++6.0開發, 因此我將vc6.0 debug下的dll拿到開發環境下, 仍然行不通.

    最後我在測試環境下安裝vs2013就可以正常運行了, 但我想不通移到線上環境, 除了.net framework和c++轉發套件, 我還遺漏了什麼?

    能不能請各位大大指點迷津呢?

    謝謝!!


     
    • 已編輯 bunchyu 2017年12月16日 下午 12:21 標題打錯
    2017年12月16日 下午 12:10

解答

  • 可能的原因是您的DLL需要的DLL不只一個, 您可以用Dependency Walker查查看
    • 已標示為解答 bunchyu 2017年12月16日 下午 04:33
    2017年12月16日 下午 01:35
  • 謝謝this大大的協助, 經過這幾天難以入眠的夜晚..(?!, 還有今日和一位"黑暗執行緒"大大討論後, 稍早我終於成功了!!!

    以下記錄一下解決過程:

    ====================================================================

    [前言]
    就像幾位前輩說言, 當要把系統移植到正式環境時, 沒有安裝開發環境的正式機, 基本上就是要安裝相關套件讓系統可以正常工作, 不過像我目前遇到的情形是, 我使用VS2013 .net framework 4.5 / vc++開發的系統, 在正式機上也安裝了相對應的framework與vc++2013轉發套件x64/x86, 仍然會有出現"0x8007007E"的錯誤訊息! 這我就納悶了...好, 我猜想是因為一些我引用的第三方dll, 當初是使用vc++6.0開發, 因此將一些vc++6.0的library放進執行檔路徑下, 但還是不行.....

    以下開始說明我解決的過程,

    1. 使用Dependency Walker:

    透過這個軟體可以查看我呼叫的dll, 它各自又呼叫了那些dll, 這時我依照上面的fullpath說明去尋找所有相關的dll, 我大概從system32資料夾下找了5, 60個dll, 然後放到我執行檔路徑下, (這邊也許我有做錯的地方, 因為我沒有把它塞進system32, 一部分是我測試機空間真的非常小, 連備份1G的dll檔也無法), 測試我的程式但還是無法成功!!!萬念俱灰阿!!

    2. 使用Process Monitor

    "黑色執行緒"大大介紹我使用這款軟體, 看執行程式發生錯誤時, 看什麼DLL無法呼叫成功; 其實這個程式我之前也有使用, 但無法看出其中奧秘, 前輩和我說可以篩選"resutl = NAME NOT FOUND"去一個一個看到底是什麼問題, 其實檢查到這裡, 我還是有點一籌莫展的感覺, 但忽然看到Process Monitor裡面有些呼叫"SysWow64"資料夾裡的dll無法成功?! 這邊想到前輩之前提到有x64的dll放到x32資料夾發生錯誤(反之亦然)的可能, 會不會我先前該複製的dll來源錯了, 並不是system32呢?

    [處理方式]

    "SysWow64"這個資料夾就是放32位元的folder, 因此我改從這個資料夾將相關dll, 放到我測試機的相應資料夾時, 結果!!我的程式就正常執行了!!我都要淚流滿面了!!

    [後話]

    雖然解決了這個問題很高興沒有錯, 但我心中不免納悶, 這些dll不是應該在安裝c++轉發套件x86, 就會安裝32位元的dll到相應的32位元資料夾下嗎?但看起來我安裝了VS2013 c++ x86/x64轉發套件沒有解決這個問題, 不曉得有沒有哪位大大有看過這種情形呢?

    總之對我來說解決了一道難題, 希望未來未來有遇到這種情形的朋友, 可以拿去參考來解決相關問題!


    • 已標示為解答 bunchyu 2017年12月16日 下午 04:33
    2017年12月16日 下午 04:27

所有回覆

  • 可能的原因是您的DLL需要的DLL不只一個, 您可以用Dependency Walker查查看
    • 已標示為解答 bunchyu 2017年12月16日 下午 04:33
    2017年12月16日 下午 01:35
  • DLL 三種類型,你是哪種?

    1. 函數型 DLL ,如 kernal32.dll

    2. COM DLL ,如 OWC

    3. .Net Managed DLL ,通常你的錯誤訊息 0x800 開頭的,只會出現在 1/2 ,2 的機會比較大。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年12月16日 下午 03:59
  • 謝謝this大大的協助, 經過這幾天難以入眠的夜晚..(?!, 還有今日和一位"黑暗執行緒"大大討論後, 稍早我終於成功了!!!

    以下記錄一下解決過程:

    ====================================================================

    [前言]
    就像幾位前輩說言, 當要把系統移植到正式環境時, 沒有安裝開發環境的正式機, 基本上就是要安裝相關套件讓系統可以正常工作, 不過像我目前遇到的情形是, 我使用VS2013 .net framework 4.5 / vc++開發的系統, 在正式機上也安裝了相對應的framework與vc++2013轉發套件x64/x86, 仍然會有出現"0x8007007E"的錯誤訊息! 這我就納悶了...好, 我猜想是因為一些我引用的第三方dll, 當初是使用vc++6.0開發, 因此將一些vc++6.0的library放進執行檔路徑下, 但還是不行.....

    以下開始說明我解決的過程,

    1. 使用Dependency Walker:

    透過這個軟體可以查看我呼叫的dll, 它各自又呼叫了那些dll, 這時我依照上面的fullpath說明去尋找所有相關的dll, 我大概從system32資料夾下找了5, 60個dll, 然後放到我執行檔路徑下, (這邊也許我有做錯的地方, 因為我沒有把它塞進system32, 一部分是我測試機空間真的非常小, 連備份1G的dll檔也無法), 測試我的程式但還是無法成功!!!萬念俱灰阿!!

    2. 使用Process Monitor

    "黑色執行緒"大大介紹我使用這款軟體, 看執行程式發生錯誤時, 看什麼DLL無法呼叫成功; 其實這個程式我之前也有使用, 但無法看出其中奧秘, 前輩和我說可以篩選"resutl = NAME NOT FOUND"去一個一個看到底是什麼問題, 其實檢查到這裡, 我還是有點一籌莫展的感覺, 但忽然看到Process Monitor裡面有些呼叫"SysWow64"資料夾裡的dll無法成功?! 這邊想到前輩之前提到有x64的dll放到x32資料夾發生錯誤(反之亦然)的可能, 會不會我先前該複製的dll來源錯了, 並不是system32呢?

    [處理方式]

    "SysWow64"這個資料夾就是放32位元的folder, 因此我改從這個資料夾將相關dll, 放到我測試機的相應資料夾時, 結果!!我的程式就正常執行了!!我都要淚流滿面了!!

    [後話]

    雖然解決了這個問題很高興沒有錯, 但我心中不免納悶, 這些dll不是應該在安裝c++轉發套件x86, 就會安裝32位元的dll到相應的32位元資料夾下嗎?但看起來我安裝了VS2013 c++ x86/x64轉發套件沒有解決這個問題, 不曉得有沒有哪位大大有看過這種情形呢?

    總之對我來說解決了一道難題, 希望未來未來有遇到這種情形的朋友, 可以拿去參考來解決相關問題!


    • 已標示為解答 bunchyu 2017年12月16日 下午 04:33
    2017年12月16日 下午 04:27
  • 不好意思@@ 因為我發起的這篇文章我一直沒有更新, 所以只看到this大大回復的留言.....

    To "FAE9D91C-3F07-4090-91EB-E3F70E4D0617" 大大:

    沒錯, 我也這麼想, 但我安裝了vs2013 c++ 轉發套件, 仍然無解...

    To "心冷熱情熄" 大大:

    沒錯, 我的dll裡面相依性包含了1和2兩種dll, 但這部分, 我以為安裝了對應的c++轉發套件即可解決, 還是我的理解錯了@@ 不好意思因為我也有點一知半解..希望大大解惑, 謝謝唷!!

    2017年12月16日 下午 04:44
  • 1 屬於拷貝到對了位置就可以用,但位置請使用系統提供的指名路徑,因為你的解法,有可能其中某個檔使用到絕對路徑,所以導致必須把 x86 的 dll 放到 x64 的工作目錄去。

    2 屬於需要註冊。

    通常 3 可包含 2 可包含 1 ,1 不能包含 2 不能包含 3 。

    註:基本上各大論壇都有簽名檔功能。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年12月17日 下午 03:23