[英]compiling in visual studio 2005 and visual C++ 6.0
謝謝
是的,如果使用/ MD(默認設置)編譯DLL的代碼,則必須將CRT庫部署到目標計算機。 如果這只是一個沒有任何其他依賴項的獨立DLL,則可以使用靜態CRT選項進行編譯,因此您不必部署這些庫。 右鍵單擊您的DLL項目,“屬性”,“ C / C ++”,“代碼生成”,“運行時庫” = / MTd以進行“調試”配置。 重復執行Release配置,現在使用/ MT。
Google的“ P / Invoke封送處理”以了解有關如何從托管程序中調用非托管代碼的更多信息。
由於nobugz已經涵蓋了您的第一個問題,因此讓我繼續講第二個問題。 這並不難理解。
在Windows中編譯DLL時,鏈接器將創建一個導出地址表(EAT),該地址列出所有導出的功能(DLL提供的功能)以及指向在DLL自身中實現位置的指針。
編譯鏈接到DLL的應用程序時,鏈接器將創建一個導入地址表(IAT),其中列出了在其他DLL中實現的所有功能以及實現這些功能的DLL的名稱。 知道函數存在於DLL中的方式來自添加到項目中的.lib文件。 這告訴鏈接器函數是在DLL中實現的。
然后在運行時,在加載應用程序時,Windows加載器將檢查IAT以查看需要加載哪些DLL,找到它們,然后更新應用程序IAT(在內存中)以指向已加載DLL中的導出函數。
這就是它工作的基礎,希望我沒有包括任何嚴重的錯誤。 當然,P / Invoke是這之上的另一層。
如果您想了解有關DLL的工作原理的更多信息,請始終查閱MSDN文檔,並且如果您想獲得足夠的詳細信息以方便使用,請閱讀以下Windows Inside文章第1 部分和第2部分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.