AcroExch.App: Lock メソッド

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 の場合
    image
  • 本家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からのエラーメッセージの例です。
    実行エラー(1)
     
    "0x030743d7" の命令が "0x00000008" のメモリを参照しました。メモリが "read" になることはできませんでした。
    プログラムを終了するには [OK] をクリックしてください
    プログラムをデバッグするには [キャンセル] をクリックしてください

    実行エラー(2)

    実行時エラー '-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

http://livedocs.adobe.com/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/IAC_API_OLE_Objects.103.16.html

参考

http://www.adobe.com/jp/support/kb/ds/510/ds_510323_ja-jp.html

戻る


キーボード

ブラウザ画面の文字サイズを変更するショートカットキー

  1. [ CTRL ] + [ + ]  :  文字を大きく

  2. [ CTRL ] + [ - ]  :  文字を小さく
Shortcut Keys

  1. [ CTRL ] + [ + ]  :  Up the font size

  2. [ CTRL ] + [ - ]  :  Down the font size

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れるとエラーになる場合が有ります。その時はコードの前後に <code> ・・・</code> タグを入れてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください