TOP > AcroExch.App > Lock [...]
説明
他のAcrobatアプリケーションを操作出来ない様に一時的にロックします。
サーバーでOLE(IAC)の同時実行する時に使用するのがベストでしょう。
基本的にクライアント・パソコンで使うメソッドではありません。
※補足と注意事項は必須です!
形式
VARIANT_BOOL Lock(BSTR szLockedBy);
引数
- 第一引数(BSTR szLockedBy) : 排他制御するプログラム識別子(任意の文字列)
注意:実際のテストでは意味を成さなかった。値は何でも構わない。空白でもOK。
戻り値
- -1 : True(真)で成功した。
OLE(IAC)によってAcrobatアプリケーションは利用されていない。 - 0 : False(偽)で失敗した。
OLE(IAC)によってAcrobatアプリケーションは利用されている。
バージョン情報
当メソッドはテスト環境を作るのが非常に難しいので、ページ下部に動作環境だけでの検証とさせて頂きます。
サンプル:ExcelのVBA
説明:処理中は他のAcrobatアプリケーションの起動や、OLE(IAC)を操作出来ないようにする。
また、他でOLE(IAC)が使用中の時はループで処理が終わるまで待つ。
- 参照設定を事前に行う。
- 以下のサンプルはテスト用です。
F8キーでステップ実行して動作確認します。
001 Public Declare Sub Sleep Lib "kernel32" _
002 (ByVal dwMilliseconds As Long)
003
004 Sub AcroExch_App_Lock()
005
006 Dim objAcroApp As New Acrobat.AcroApp
007 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
008 Dim lRet As Long '戻り値
009 Dim l As Long 'ループ用のカウント
010 Const CON_LOOP = 20 'ループ回数のMAX
011
012 l = 0
013 'IACの排他制御をオンにする
014 lRet = objAcroApp.Lock("syori01")
015 Do While (lRet = 0)
016 '他のプログラムで排他制御されている
017 If l >= CON_LOOP Then
018 'ループ限度を越えた
019 'エラー処理・・
020 GoTo AcroExch_App_Lock_Skip
021 End If
022 '0.5秒待つ
023 Sleep 500
024 l = l + 1
025 Loop
026 '他で排他制御が解除された
027
028 'テスト確認用に画面表示する
029 lRet = objAcroApp.Show
030 lRet = objAcroPDDoc.Open("E:\Test02.pdf")
031 objAcroPDDoc.OpenAVDoc ("E:\Test02.pdf")
032
033 '・・・・・ココで一時停止して何か処理を行ってみる
034
035 '以下のCloseは不要。実行すると次でエラーになる。
036 'lRet = objAcroPDDoc.Close
037
038 '全てのドキュメントを強制的に閉じる
039 '※以下をしないとプロセスが残る。
040 lRet = objAcroApp.CloseAllDocs
041
042 'アプリケーションの終了
043 lRet = objAcroApp.Hide
044 lRet = objAcroApp.Exit
045
046 AcroExch_App_Lock_Skip:
047 '排他制御の開放
048 lRet = objAcroApp.UnlockEx("syori01")
049
050 'オブジェクトの強制開放
051 Set objAcroPDDoc = Nothing
052 Set objAcroApp = Nothing
053 '※この後,Acrobatプロセスがメモリから消えるのに2~4秒掛かる
054 End Sub
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
補足
- 上記サンプルのテストは Excel 2003 のVBAと Excel 2007 のVBAを同時に立ちあげて検証しました。
- データベースで言う排他制御とは少し意味合いが異なります。
- 第一引数の値で排他制御を行う訳では無いです、AcrobatアプリケーションがOLE(IAC)操作されているかどうか、又はAcrobatアプリケーションが起動されているかどうかを判断するだけです。つまり第一引数の値は無視されます。
- LockメソッドがTrue(-1)を返した後は、デスクトップからAcrobatアプリケーションは起動出来ません。起動しても以下のダイアログが表示され、何も操作は出来ません。 ※Acrobat 8.0 Pro の場合
- 本家Adobe社の英語解説と比べて、当サイトの解説内容がかなり異なります。御注意ください。
- UnlockEx(又はUnlock)メソッドはAVDoc.OpenInWindowExメソッドと何らかの関係が有るみたいですが、当サイトでは解説していません。
- UnlockEx(又はUnlock)メソッドはオブジェクト「Set objAcroAPP = Nothing」 の前ならどのタイミングで実行しても構わないです。
- Lockメソッドの戻り値がFalseの時のループ回数とSleep時間は各自で調整して下さい。
- 処理的にAcrobatを画面表示する必要が無ければ、Showメソッドを実行する必要はありません。CPUの無駄使いも防げます。
- 同時実行のテストはOffice 2003 とOffice 2007 の Excel を使って行いました。一つのOfficeのVBA開発環境では2つの実行テストが出来ません。各バージョンの異なるExcelのVBA開発環境ならば2つ同時に立ち上げる事が可能です。
注意事項:必読!
- Lockメソッド実行の前にShowメソッドなど別の(AcroApp)オブジェクトのメソッドを使用しては駄目です。別のAcrobatインスタンスが立ち上がったと勘違い?をしてLockメソッドがFalse(0)を返します。つまり、Lockメソッドが失敗します。
- Lockメソッドを使ったシステムを構築したときは、他のOLE(IAC)ロジックも必ずLockメソッドの結果を判断して処理の実行を制御(待ち状態に)して下さい。厳密にテスト検証は出来ていませんが、Lockメソッドを使ったロジックが実行中に他のOLE(IAC)ロジックを実行させると、予期しないエラーが出る事があります。
以下はその時に表示されたVBAからのエラーメッセージの例です。
"0x030743d7" の命令が "0x00000008" のメモリを参照しました。メモリが "read" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
プログラムをデバッグするには [キャンセル] をクリックしてください
実行時エラー '-2147417851 (80010105)':
'CloseAllDocs' メソッドは失敗しました: 'CAcroApp' オブジェクト - くどいようですが、Lockメソッドを使う時は他のOLE(IAC)プログラムでも全て Lockメソッドを使うようにして下さい。そうしないと予期しない不具合が発生し、プロセスがメモリに残ってしまいます。もちろん処理が終わったらUnLockEx(又はUnlock)メソッドを実行します。エラーが起きてもUnLockEx(又はUnlock)メソッドは実行して下さい。
動作確認環境
- WindowsXP Pro( + SP2 + フルWindowsUpdate) +
Acrobat 7.0.9 Pro + Office 2003 - WindowsXP Pro( + SP3 + WindowsUpdate) +
Acrobat 8.1.7 Pro + Office 2003(+ SP3) + Office 2007(+ SP2)
Adobe Web 解説 URL(英語) v9.1
参考
< 戻る >
ブラウザ画面の文字サイズを変更するショートカットキー
|