Skip to main content
Inspiring
January 7, 2023
Question

ExtendScript ExternalObjectを使ってC++でInDesignのComponent Object Modelを操作したい

  • January 7, 2023
  • 2 replies
  • 1061 views

こちらのサイト

https://qiita.com/MAA_/items/b1a35ab73af9f7b327e0 

でExtendScriptからC++ネイティブコードが呼べる事を知りました。

CEPについて書いてありますがInDesignのExtendScriptから実行出来ました)

 

そこで、C++でInDesignのComponent Object Modelを操作したいと考えました。

C++でInDesignのComponent Object Modelを操作について、何か参考になるサイト等でもご存じの方、おられませんでしょうか?

This topic has been closed for replies.

2 replies

Ten A
Community Expert
Community Expert
January 8, 2023

InDesignのCOMはVS向けの構成ですから、ネイティブ系をスクリプトからコールするのであればiScriptで実装した方が何かと手間が省けるように思います。

Inspiring
January 8, 2023

Ten Aさん

iScriptって何でしょう?

調べてもよくわかりません。

Ten A
Community Expert
Community Expert
January 8, 2023

InDesignSDKのドキュメントに記述があります。

Ten A
Community Expert
Community Expert
January 7, 2023

勘違いしてはいけません。スクリプトからネイティブオブジェクトをコールするのではなくて自身で実装したAPIをスクリプトから呼び出すための仕組みです。InDesignのオブジェクトモデルにはアクセス出来ません。

わたしはOpenCVとか鬼車などを組み込んでスクリプトからアクセスしています。

Inspiring
January 7, 2023

Ten Aさん

>自身で実装したAPIをスクリプトから呼び出すための仕組みです。

 

私の言葉足らずで申し訳ありません。

「自身でInDesignのComponent Object Modelの操作を実装したAPIをスクリプトから呼び出したいと考えました。」です。

 

Excelになりますが

https://qiita.com/BenjaminBenton7/items/52cfcfe493551e3b69f9 

を参考にして

ExcelのComponent Object Modelの操作を実装したAPI(私の場合Windowsですのでdll)をExtendScriptのExternalObjectを使ってInDesignで実行してExcelが呼び出せたので

同じくComponent Object ModelのあるInDesignも同様にしたいと考えた次第です。

Inspiring
January 8, 2023

自身でInDesignのComponent Object Modelの操作を実装したdll(Windows)をExtendScriptから呼び出す事が出来ました。

 

私の行った手順(Windows)
VisualStudioCommunityを使用して
InDesignのタイプライブラリをC++ソースにimportする。
#import "C:\Users\user\AppData\Local\Adobe\InDesign\Version 18.0-J\ja_JP\Caches\Scripting Support\18.0\Resources for Visual Basic.tlb"
(私の場合のパス)

 

ビルドすると「2回以上初期化されています。」のエラーが出ました。
resources for visual basic.tlh
resources for visual basic.tli
のファイルが作られているのでその2つを別の場所に移動。
resources for visual basic.tlhのエラーが出た部分を修正。
resources for visual basic.tlhにresources for visual basic.tliのパスが記載されいるのでそれも修正して
resources for visual basic.tlhをC++ソースにinclude(includeですので注意)
でタイプライブラリを読み込むエラーが出なくなりました。

 

後はdllに含めたい関数に

CoInitialize(NULL); // COMの初期化
InDesign::_ApplicationPtr App("InDesign.Application"); // インスタンス作成
App->Paste(); // ペースト
CoUninitialize(); // COMを閉じる

 

等々