C++ Builder XE4
あるUDPポートを使う処理が実装されているフォームがある。
そのフォームを異なる2つのソフトで実装すると、2つのソフトは同時起動時に「アドレスとポートは既に使われています」のエラーが出る。
2つのソフト同時起動時に片方のソフトからのUDPポート使用をOFFにする、という方針であれば同時起動は可能となる。
このUDPポートを使う処理はフォームにおいてIndyのTIdUDPServerを使っている。「TIdUDPServerのActivateプロパティをtrueにする時にtry, catchでエラーがcatchされる時に、そのソフト側ではUDPを使わない」とすれば良いかと思う。
try {
IdUDPServer->Active = true;
} catch (...) {
// IdUDPServerを使わないフラグを立てる
}
気になったのは、「コンストラクタでtry, catch()を使っていいのかどうか」。
「コンストラクタで例外を送出する」件については禁止している本の記載があったり、以下のようなリンクの情報があったりする。
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html
上記のコードの場合は例外送出ではなくIdUDPServer不使用フラグを立てるだけなので問題ないかと考えているが、実際のところはどうなのだろうか。
問題がある場合はOnCreate()での対応も検討している。
以下も関連ありそう。
http://d.hatena.ne.jp/slayer845/20091228/1262012011
http://d.hatena.ne.jp/slayer845/20091231/1262235480