[リストへもどる]
一括表示

投稿時間:2003/07/04(Fri) 11:36
投稿者名:こまった
Eメール:
URL :
タイトル:
VBから読込み専用でImaging起動
お世話になります。VB初心者です。
VB6.0からWindows標準のImagingをShellExecute関数(API)で
起動しているのですが、ファイルを読込み専用で開きたいと考えています。
Imagingの機能では、ファイルを開く時に「読込み専用ファイルとして開く(R)」
という、オプションの指定が出来るのでVBプログラムからも出来ると勝手に
解釈しています。
[現状]
  ShellExecute(Me.hwnd, vbNullString, "wangimg.exe", "C:\Temp\aaa.bmp", "", 1)
[独自調査]
  @MS-DOSのコマンドプロンプト上で幾つかのパターン(Exeの後に"-r","-R","/r","/R"等)を
   実験してみましたがダメでした。
  Aインターネットにて関連記事がないか調査してみましたがダメでした。

宜しくお願い致します。

投稿時間:2003/07/04(Fri) 18:48
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VBから読込み専用でImaging起動
表示する(開く)前に SetAttr でファイルの属性を読取専用に設定しておけばいいかと
思います。
終了時は元の属性に戻す。

投稿時間:2003/07/05(Sat) 09:45
投稿者名:こまった
Eメール:
URL :
タイトル:
Re^2: VBから読込み専用でImaging起動
> 表示する(開く)前に SetAttr でファイルの属性を読取専用に設定しておけばいいかと
> 思います。
> 終了時は元の属性に戻す。

ご解答有難うございます。
開く前にSetAttrで属性を読取専用にする手段を実施したのですが、終了時に元に戻す事が
困難です。
Imagingの終了を検知する方法として以下の事を実施してみましたが、良い結果を得る事が
出来ませんでした。

 @FindWindowにて動作中のImagingを監視しようと考えましたが、Imagingにはクラス名が
  なく監視する事が出来ませんでした。

 A動作中のImagingを監視するためプロセスIDが必要となり、ShellExecute関数の起動を止め
  Shellに変更し戻り値のプロセスIDを使用してみましたが、監視のためにVB側が動作中となり
  一度に複数のImagingを開いた場合は監視が困難です。
  (仕様では、「一度に複数(数十枚)のImagingを開く」事を目的にしています。)

 BShellExecute関数で起動後、Sleepにて一定時間後に属性を元に戻す事も実施しましたが
  PC・ネットワークの負荷によりImagingが開く前に属性を戻してしまいダメでした。

上記以外に何か良い監視方法があれば「開く前に読取専用」に設定する事も可能ですが、
可能であれば、開く時に読込専用(Imaging起動時のコマンドラインで)にするのが一番良いと
考えております。

投稿時間:2003/07/05(Sat) 12:29
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: VBから読込み専用でImaging起動
> 上記以外に何か良い監視方法があれば「開く前に読取専用」に設定する事も可能ですが、
だったら表示した後すぐに元に戻せばいいのでは。
Private Sub Command1_Click()
    Call sOpenImaging("C:\Temp\aaa.bmp")
End Sub
Private Sub sOpenImaging(ByVal ImgFile As String)
    Dim Ret As Long
    Dim MyAttr As Integer
    MyAttr = GetAttr(ImgFile)
    If MyAttr <> vbReadOnly Then
        SetAttr ImgFile, vbReadOnly
    End If
    Ret = ShellExecute(Me.hwnd, "Open", "wangimg.exe", _
                                ImgFile, vbNullString, 1&)
    Sleep 1000
    SetAttr ImgFile, MyAttr
End Sub


> 可能であれば、開く時に読込専用(Imaging起動時のコマンドラインで)にするのが一番良いと
> 考えております。
wangimg.exe の方でサポートしていれば出来るのでしょうが、サポートしていないと簡単にはできない
かと思います。(ダイアログボックスのチェックボックスの設定とは違います)

>Windows標準のImagingを
因みにOSは何ですか?
WindowsXP には添付されていませんし、Windows98 ではC:\WINDOWS\KODAKIMG.EXEのようです。

投稿時間:2003/07/05(Sat) 13:27
投稿者名:こまった
Eメール:
URL :
タイトル:
Re^4: VBから読込み専用でImaging起動
> だったら表示した後すぐに元に戻せばいいのでは。
> Private Sub Command1_Click()
>     Call sOpenImaging("C:\Temp\aaa.bmp")
> End Sub
> Private Sub sOpenImaging(ByVal ImgFile As String)
>     Dim Ret As Long
>     Dim MyAttr As Integer
>     MyAttr = GetAttr(ImgFile)
>     If MyAttr <> vbReadOnly Then
>         SetAttr ImgFile, vbReadOnly
>     End If
>     Ret = ShellExecute(Me.hwnd, "Open", "wangimg.exe", _
>                                 ImgFile, vbNullString, 1&)
>     Sleep 1000
>     SetAttr ImgFile, MyAttr
> End Sub
>

解答有難うございます。
ShellExecute関数実行後、一定時間のSleepで元に戻す事を
実施しました。
 しかし、Sleep値にもよりますがImagingがSleep値以内に立ち
上がらない場合(CPU・ネットワーク負荷?)、元に戻したファイル
を読込んでしまい、読込専用にはなりませんでした。
従って、現在はSleep値を3秒で実施していますが、他に良い方法が
あればと考え投稿した次第です。(説明不足で申し訳有りません)

OSにつきましては、WinNT4.0・Win2000を対象にしており、
 WinNT4.0の Imagingは "wangimg.exe"
 Win2000 の Imagingは "kodakimg.exe"
となります。

投稿時間:2003/07/05(Sat) 16:35
投稿者名:Say
Eメール:
URL :
タイトル:
Re^5: VBから読込み専用でImaging起動
>FindWindowにて動作中のImagingを監視しようと考えましたが、Imagingにはクラス名が
>  なく監視する事が出来ませんでした。

だったらWindows Captionから拾えば?
たとえばこう。


Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias _
        "ShellExecuteA" (ByVal hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias _
        "FindWindowA" (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
Dim strBMPpath(7) As String
Dim strWinCaption(7) As String
Private Sub Command1_Click()
Dim lngHwnd As Long
    If List1.ListIndex >= 0 Then
        Call sOpenImaging(strBMPpath(List1.ListIndex))
        lngHwnd = 0&
        Do While lngHwnd = 0&
            lngHwnd = FindWindow(vbNullString, strWinCaption(List1.ListIndex))
            DoEvents
        Loop
        List2.AddItem strWinCaption(List1.ListIndex)
        List2.ItemData(List2.NewIndex) = List1.ListIndex
        List3.AddItem lngHwnd
    End If
End Sub

Private Sub sOpenImaging(ByVal ImgFile As String)
    Dim Ret As Long
    Dim MyAttr As Integer
    MyAttr = GetAttr(ImgFile)
    If MyAttr <> vbReadOnly Then
        SetAttr ImgFile, vbReadOnly
    End If
    Ret = ShellExecute(Me.hwnd, "Open", "kodakimg.exe", _
                                ImgFile, vbNullString, 1&)
    'Sleep 1000
    'SetAttr ImgFile, MyAttr
End Sub

Private Sub Form_Load()
    Dim i As Long
    Me.Show
    List1.AddItem "ABC.BMP"
    List1.AddItem "あいう.bmp"
    List1.AddItem "2003.bmp"
    List1.AddItem "てすと.bmp"
    List1.AddItem "Test2.bmp"
    List1.AddItem "おひるね.bmp"
    List1.AddItem "猫と少女.bmp"
    List1.AddItem "なんかの地図.bmp"
    For i = 0 To 7
        strBMPpath(i) = App.Path & "\" & List1.List(i)
        strWinCaption(i) = List1.List(i) & " - イメージング (読み取り専用)"
    Next
    Timer1.Interval = 500
    Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    Dim i As Long
    Dim lngHwnd As Long
    Dim ImgFile As String
    Dim strBuffer As String
    If List2.ListCount > 0 Then
        For i = List2.ListCount - 1 To 0 Step -1
            strBuffer = List2.List(i)
            lngHwnd = FindWindow(vbNullString, strBuffer)
            If lngHwnd = 0 Then
                ImgFile = strBMPpath(List2.ItemData(i))
                SetAttr ImgFile, vbNormal
                List2.RemoveItem i
                List3.RemoveItem i
            End If
            DoEvents
        Next
    End If
End Sub

投稿時間:2003/07/07(Mon) 09:27
投稿者名:こまった
Eメール:
URL :
タイトル:
お礼
>Windows Caption

ご解答有難うございます。
「Windows Caption」うまくいきました。
但し、WindowsNT・Windows2000でのWindows Caption名が異なるので
OSを判定しCaption名を切替える事とします。
(インターネットにてOS判定の良い参考例を検索してみましたが、
 Win2000を判断するものはありませんでした。
 もう少し調べてみます。)

以上、大変有難う御座いました。