5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Windowsの既存業務プログラムをWine上で動かそうとしてぶつかった壁

Last updated at Posted at 2017-11-25

Windows 10のアップデートで業務アプリで使用するMySQL Connector/Netのアセンブリが破壊される問題があり
今後LinuxにWineを入れて既存システムを運用できないか検討することになりました。
自宅PCにUbuntuを入れてLinux環境にやっと慣れてきたので、実際に動かせるのかいろいろ試してみました。

その結果、以下のような問題点がありました。

  • Wineが64bit設定だと.Net Frameworkをインストールするのが困難。(WINEARCH=win32 winebootで対応)
    参考:Wine環境(WINEPREFIX)を分けてWindowsアプリを上手に管理する
  • Winetricksの「error: dotnetXX conflicts with dotnet20, which is already installed.」問題。参考:.NET 3.5 conflicts with .NET 2.0
  • Wineのstable版ではクリップボードをLinux上のプログラムと共有できない(devel版では修正済)
  • プリンター未設定時、プリンター一覧の取得時、Windowsでは「Microsoft XPS Document Writer」が返るがWine上では例外が発生する
  • フォント描画の仕組みが異なる為か、同じフォントを指定しても、太字や斜体の時にMeasureString(フォントの幅を取得)の結果が異なる
  • 文字入力のIMEの変換候補リストが入力中のキャレットの近くに表示されない。文字入力プログラムibus,Fcitxどちらもダメ

これらは些細な問題で、プログラムの一部修正や、顧客に了承していただくことで解決できるかと思います。
しかし慣れないLinuxに四苦八苦しコツコツ解決しながら、特に問題だと思ったのは、NetBIOS名の解決とふりがな入力でした。

#Wine上でNetBIOS名の解決が行えない
LinuxにはSambaというNetBIOS(SMB)に対応するためのプログラムがありますが、なぜかNetBIOS名をWineアプリケーション側で取得できない問題があります。
いろいろと解決法を探しましたが、libnss-winbindを入れてLinux側でWinsの名前解決ができてもWine側では無視されます。(WineではなくMonoならばいける)

NetBIOSの名前解決は行えなくても、IPアドレスを直接指定すれば問題なくデータベースやプリンターにも接続できます。
しかしプリントサーバーやDBサーバーがDHCPでネットワークに接続されている環境では、毎日変わるかもしれないIPアドレスを指定することはできません。
DHCPをやめてIPアドレスを固定にするのが理想ですが、顧客の都合なども考えるとやはりLinuxPC側でなんとか出来ないとまずそうです。
いろいろ考えた結果、Linuxネイティブのプログラムは名前解決できる為、redirコマンドをLinux起動時に実行してlocalhostへポートフォワードさせることで解決できそうでした。

参照:色々なport forwarding方法
(iptablesやstoneが紹介されていますが、redirはインストールや設定も考えると一番手軽だと思いました)

#ふりがな取得などのIMEを使うAPIやクラスライブラリが使用できない
ふりがなの自動入力は業務アプリでは必ずと言っていいほど使われているため、かなりクリティカルな問題だと思います。
ユーザビリティを考えれば、Webアプリですら可能なふりがなの自動入力を手動で運用してもらうというのはさすがに了承して頂けないでしょう。

こちらはまだ具体的な解決案はありませんが、Linuxへふりがなを返す単純なサービスをlocalhostに立て、ふりがなAPIが失敗した場合にそちらから取得すれば、解決できないだろうかと考えています。

追記
現在のWineではIMEがOn状態の場合、Linux側でフィルターされたような感じになり、変換中は一切のキーバッファが格納されません。
そのため、Windowsと異なりimm32.dllのAPIを使用しても、ProcessKeyを取得することは不可能。

IME関連のバイナリimm32.dll.soとwinex11.drv.so(ソースwine/xim.c)の修正を行えば、変換中のキー入力をGetVirtualKey()で取得できるはずと思いソースとにらめっこしていますが、・・・まだ勉強不足で修正は行えていません。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?