在ubuntu 上使用wine 執行Delphi win32 應用
隨著delphi 10.x 系列開始支援Linux 開發,我們的伺服器端可以直接支援LInux 伺服器了,
由於客戶越來越多使用Linux 作為伺服器端, 但是對於過去老的win32 下開發的服務端,一時半會還無法直接轉到移植到Linux 下,我們
需要一個過渡的方法,來保證服務端滿足要求。這時候需要使用wine 來實現這種轉換。Wine (“Wine Is Not an Emulator” 的首字母縮寫)
是一個能夠在多種 POSIX-compliant 作業系統(諸如 Linux,macOS 及 BSD 等)上執行 Windows 應用的相容層。
Wine 不是像虛擬機器或者模擬器一樣模仿內部的 Windows 邏輯,而是將 Windows API 呼叫翻譯成為動態的 POSIX 呼叫,
免除了效能和其他一些行為的記憶體佔用,讓你能夠乾淨地集合 Windows 應用到你的桌面。
更多關於wine 的介紹,請移步官網瞭解。
首先,我們需要在ubuntu安裝 wine。這個很簡單
sudo apt install wine.
安裝完後,執行
wine --version
顯示執行成功。
我們先試著執行一個kbmmw 的smartbind 例子。因為裡面沒有網路和資料庫的功能。
在windows 下的介面為:
把這個exe 拷入到Linux 伺服器上,修改成可執行許可權。
在Linux 下執行·
wine Project1.exe
非常順利的執行了。
現在搞一下常用的比較麻煩的ADO 資料庫應用程式
我們先用delphi 建立一個ado 應用程式,訪問sql server 資料庫
這是一個標準的win32 ado 應用程式。在win10 下可以正常執行。
由於要使用win32 的API,我們使用標誌符,說明是win32 應用
WINEARCH="win32" wine Project3.exe
執行,出錯了
原因是沒有找到ado 相關的一些API。我們需要給wine 安裝ado驅動。
我們首先需要在微軟官網上下載MDAC
https://www.microsoft.com/zh-cn/download/details.aspx?id=5793
複製到linux 伺服器裡面
然後執行
WINEARCH="win32" winecfg
將這個地方修改成WINDOWS NT 4.0
點應用
然後再執行命令
WINEARCH="win32" wine MDAC_TYP.EXE
剩下的就和windows 下一樣的,一路安裝下去。
安裝完,點關閉。
再次開啟winecfg
WINEARCH="win32" winecfg
首先把wine 版本改回成win7
然後替換msado 函式
ok
現在執行命令
WINEARCH="win32" wine Project3.exe
程式跑起來了,但是,但是, 我的中文不顯示了。
我們再windows 目錄找到字型檔案simsun.ttc。
然後把此檔案複製到當前使用者的.wine 目錄,注意這個目錄是一個隱藏目錄。
注意上面的路徑。
現在我們再次執行
完美執行起來了。
當然此處建議win32 的資料庫驅動選擇使用unidac.使用直連方式,就不用這麼複雜了。
使用unidac 直連方式,就不需要上面的複雜配置,也不用顯式指明wine 的執行模式。直接實現了wine 的開箱即用,複製過來就可以執行。
命令更簡單了。
wine Project3unidac.exe
使用wine 執行windows 的應用程式,可以讓老程式執行在linux 下,但是開發新的桌面程式,還是建議使用Delphi FMX,這樣一套程式碼
和介面可以直接執行在windows、Linux、macos 上。