2009-11-17 29 views
1

使用Visual C++ 2008 Express Edition。我將我的應用程序與導入庫(.lib)鏈接,以獲取目標系統上可能存在或可能不存在的DLL。在問你之前:我不能用我的應用程序分發DLL。在使用DLL之前確定DLL的存在

如果DLL不存在,只要我叫出來的DLL功能(但是不會早!),我得到這樣

此應用程序未能消息啓動,因爲SomeLibrary.dll是未找到。重新安裝應用程序可能會解決此問題。

我想要發生的是,應用程序檢測到DLL不存在,只是禁用依賴它的功能。我可以打電話給LoadLibrary,看看它是否成功,但我不確定這是否足夠。也許進口圖書館在幕後做更多的工作?

是一個簡單的LoadLibrary調用是否足夠?如果不是,我還需要做什麼?這甚至可以完成?

更新:當然,我可以使用LoadLibrary,然後爲每個我想使用的功能GetProcAddress。但是,這是一個麻煩,我希望避免這種情況,只需使用提供的導入庫。

回答

1

這是DelayLoad鏈接器選項的用途,但我不知道Express版本是否支持它。

+0

「延時加載」確實是魔術字!非常感謝! – Thomas

1

不,LoadLibrary()正是你想要的。使用它的唯一結果是在成功加載DLL時將函數指針設置到DLL中的麻煩,但該過程在網絡上的其他地方已得到很好的覆蓋。

+0

我知道這一點,但我寧願避免這種麻煩,而是使用提供的導入庫。你是說我不能吃我的蛋糕,也吃了嗎? – Thomas

+0

這將有可能編寫一個工具加載一個導入庫併爲所有這些生成C代碼,但我不知道這樣的事情。感謝志願者編寫它。 :) –

1

如果你去檢查here(MSDN),你會看到,當LoadLibrary加載失敗,函數返回NULL值,你甚至可以檢查特定的錯誤使用GetLastError功能(這應該是一個找不到文件)。

+1

這是完美搭配 –