2017-08-17 239 views
-2

我試圖從非託管DLL導入到我的C#程序的功能。從非託管DLL導入函數時0x8007007F是什麼意思?

這是我的代碼:

[DllImport("MarkEzd.dll", EntryPoint = "lmc1_Initial2", CharSet = CharSet.Unicode, 
    CallingConvention = CallingConvention.StdCall)] 
public static extern int piplmc1_Initial(string PathName, bool TestMode); 

.... 

int intlmc1_Initial = piplmc1_Initial(m_strEzCADSotwareFullPath, false); 
if (intlmc1_Initial > 0) 
{ 
    return; 
} 

的誤差,譯自法文:

無法加載DLL MarkEzd.dll,指定的程序無法找到例外德HRESULT:0x8007007F

這個錯誤是什麼意思?

+0

你看過www.pinvoke.net了嗎? kernal32.dll方法有示例代碼。只有公共方法可以使用DllImport訪問。有時這些方法的名稱會稍微變化,所以DLL導出查看器應該提供正確的名稱。確保該dll位於正在用於編譯的文件夾中。您可能同時擁有調試版和發行版文件夾,並且該dll必須位於正確的文件夾中。請發佈您收到的錯誤消息。 – jdweng

+0

問題中的信息不對。錯誤代碼127是在調用'GetProcAddress'後得到的'ERROR_PROC_NOT_FOUND'。此外,爲什麼要調用'LoadLibrary'來加載DLL,但是使用p/invoke作爲該DLL中的函數'piplmc1_Initial'。如果你使用後者,那麼你不需要明確地使用'LoadLibrary',框架可以爲你處理。看來你並沒有把整個故事告訴我們。請直接瞭解事實,並顯示[mcve]。 –

+0

嗨,名稱似乎是正確的DLL導出查看器,當然DLL文件是在調試文件夾(我只在此刻使用此文件夾)。 – Jerome

回答

0

錯誤消息告訴您,您加載的DLL不會導出名爲lmc1_Initial2的函數。

你應該仔細檢查這個庫的文檔,也許它會很明顯的地方出現錯誤。也許一個不同的DLL導出該函數。也許這個名字被錯誤地轉錄了。請注意,字母大小寫很重要,所以您必須使所有大寫和小寫字母正確。

如果文檔沒有幫助,請使用類似dumpbin或Dependency Walker的工具來檢查DLL的導出函數名稱。

+0

好的,我會回到我的應用程序並尋找它。有些東西是stange,當我打開Lmc1.dll時,我可以在每個函數之前看到「public」或「protected」,但前面沒有MarkEzd.dll,這是否意味着該函數不會被導出? – Jerome

+0

當你在什麼地方打開DLL時? –

+0

與依賴沃克。 – Jerome