飴屋

開発日記

2019/3/17

PhotoshopをAdobe CCにして、いつの頃からかたまに問題が起こるようになったので、修正方法をメモしておこうと思います。

Photoshopに何か作業をやらせる場合、単調な作業はアクションにまとめてボタン一つで実行できるようにしますが、もうちょっと複雑なことをやろうとすると外部のアプリケーションからPhotoshopを操作したくなります。幸いPhotoshopはCOM経由でPhotoshop内のオブジェクトを操作できるようになっているので、それを使わせてもらっています。しかし、ある日、突然この外部からの操作がうまく実行されなくなったことがありました。(ついさっきまた発生しました。一年位前にも多分発生しました。)どうも直前にPhotoshopのバージョンアップが行われていたので、これが原因だと思われます。Adobe CCでは古いバージョンのアプリケーションが併存できるので、試しに古い方のPhotoshopを立ち上げてみて、そちらを外部から操作しようとしたらうまくいきました。

これは何が原因だったかというと、COMでオブジェクトを呼び出すときのオブジェクトの名前を指定するのですが、その名前と新しいバージョンのPhotoshopが結びついてなかったのが悪かったのでした。

$$app = Win32::OLE->GetActiveObject('Photoshop.Application') || Win32::OLE->new('Photoshop.Application')
or die "Cannot find Photoshop";

↑これはPerlでWin32::OLEモジュールを使ってPhotoshopを操作しようとしているときの問題の箇所です。「Photoshop.Application」という名前でPhotoshopのアプリケーションオブジェクトを取得しようとしているところですね。しかし、「Photoshop.Application」という名前は古い方のPhotoshopと紐づいているのでした。この紐づけはどこで行われているのか調べてみると、レジストリ上で設定されているそうです。(ちなみにWindowsでの話です。)

\HKEY_CLASSES_ROOT\Photoshop.Application

↑この中でCLSIDとCurVerが設定できるのですが、CurVerの値は古いPhotoshopを指しているようです。この辺をいじって新しいPhotoshopに値を設定するとうまくいくようです。今回はPhotoshopが2018年版から2019年版に変わったことが原因だと思われますので、該当するアプリを探してみると、先ほどのレジストリパスの隣に

  • Photoshop.Application.120
  • Photoshop.Application.120.1
  • Photoshop.Application.130
  • Photoshop.Application.130.1

↑こんなのが並んでいました。120が2018年版の方で、130が2019年版の方だと推測されます。それに加えてマイナーバージョン「.1」みたいな表記がついたのもそれぞれ存在していました。それぞれ中にはCLSIDの値が入っていました。「レジストリをいじるときは自己責任で、下手するとOSがおかしくなる」という先人の言葉がありますが、まぁ、試しにこの情報を元にレジストリを編集してみることにします。

先のPhotoshop.ApplicationのCurVerは2019年版の名前「Photoshop.Application.130」で書き換え、同じくCLSIDは「Photoshop.Application.130」の中のCLSIDと同じ値に設定してあげました。(「Photoshop.Application.130.1」の方が最新バージョンっぽい感じがしますが、結論から言うとこれは関係ありませんでした。(試してみました。))

その結果、外部のプログラムから前と同じように呼び出せるようになりました。それはまぁ、よかったのですが、来年くらいにまたPhotoshopのバージョンが上がった時に同じことをしなくちゃならないのでしょうかね。
Adobe CCの管理ソフトはその辺のレジストリ操作まではやってくれないのかな。それとも、外部プログラムの方の呼び出し箇所で「Photoshop.Application.130」みたいにバージョン番号付きで呼び出す方がいいのかな。複数バージョンを併存できるが故の問題なのかもしれません。

Last-Modified