我有一個編譯爲32位的共享庫。我可以在64位應用程序中使用它,還是需要將共享庫編譯爲64位?從64位應用程序加載32位共享庫?
回答
不,您無法通過常規方式在64位應用程序中加載32位庫。
這裏有一些聰明的黑客,比如有一個32位應用程序加載庫並通過IPC接口導出函數,但是如果您有選擇將庫編譯爲64位,那麼這是是迄今爲止最好的選擇。
您提到的這個巧妙的破解仍然在32位進程中加載DLL。你是否知道這些在64位進程中加載32位DLL的黑客? – 2011-04-19 21:06:46
@約翰:沒有什麼可行的。你當然可以做一些事情,比如在你的進程中分配內存,並手動讀取32位dll中的二進制代碼。但處理器會將其視爲無法正常運行的64位指令。它不能用x86-64/x86架構完成。 – 2011-04-19 21:20:23
無法從64位應用程序動態或靜態加載32位庫,反之亦然。
有許多變通的,我知道的:
- 充分利用DLL的64位版本
- 使該應用程序的32位版本
- 介紹一COM代理對象(也稱爲代理)作爲通信中介。 Described here。
- 主機的DLL在一個單獨的(32位)和EXE使用IPC技術
有許多的進程間通信(IPC)的技術。這裏有幾個例子:
- 命名管道
- 窗口形式交往
- 插座
- HTTP監聽
- WCF服務(described here)
- .NET remoting
+1,儘管IPC技術列表中缺少共享內存,共享文件,數據庫表,RFC,COM和視頻屏幕戳);換句話說:我建議「有一些進程間通信IPC)技術:「您添加了」其中一些是:「短語。 – TheBlastOne 2012-10-17 16:02:30
- 1. 在64位應用程序中加載32位DLL庫
- 2. 調用32位或64位程序從啓動加載程序
- 3. 從32位應用程序啓動64位應用程序?
- 4. 在32位swt eclipse rcp應用程序中加載64位ole
- 5. 32位/ 64位Windows/Linux應用程序
- 6. 從Excel應用程序對象中查找位(32位/ 64位)?
- 7. 大廈32位共享庫的64位Linux與cmake的
- 8. 共享庫-64位上的Java 32位Ubuntu
- 9. 混淆了32位和64位共享對象/庫
- 10. 在64位應用程序中使用32位庫
- 11. 64位庫,應該與32位和64位進程工作
- 12. 在Centos中鏈接64位應用程序與32位庫5.6 64位
- 13. 從32位應用程序啓動64位進程?
- 14. Outlook 64位使用從32位應用程序的64位兌換
- 15. Xcode:編譯與32位庫的64位應用程序
- 16. 在32位和64位進程之間共享共享內存段
- 17. 從32位應用程序調用64位COM控件
- 18. 從64位目標應用程序調用32位lib文件
- 19. 使用SPSite從32位應用程序訪問64位SharePoint
- 20. iOS 32與64位應用程序
- 21. 將asp.net從32位移植到64位webform應用程序
- 22. 是否可以從32位應用程序訪問64位dll?
- 23. 從32位應用程序打開64位註冊表
- 24. 從32位應用程序訪問64位註冊表
- 25. 將iOS應用程序從32位升級到64位
- 26. SHGetSpecialFolderPath,如何從32位應用程序訪問64位CSIDL
- 27. 將數據從32位應用程序傳遞到64位應用程序?
- 28. 從32位應用程序啓動「不相關」的64位應用程序
- 29. 如何從32位C++應用程序啓動64位Java應用程序?
- 30. MATLAB:編譯64位Windows 64位安裝的32位共享庫安裝了64位MATLAB
什麼操作系統?這可能很重要。 – 2011-04-19 18:29:06
Windows 7和Red Hat Linux。 – Brian 2011-04-19 18:30:56
@保羅:實際上應該沒關係。假定x86-64,處理器在任何給定點處於長模式(64位),保護模式(32位)或實模式(16位)。當一個線程被調度時,該模式被設置爲匹配只能是其中之一的進程。這是x86/x86-64如何工作的核心問題。 – 2011-04-19 19:07:37