VB6+XP
EXIF情報の取得は規格の不統一などでかなり面倒のようなので下記のようなもので撮影日時を取得しようとしました。これで撮影日時は取れるのですが時間が分までしか出ません。秒まで欲しいのですが方法があったら教えてください。
Private Sub Command1_Click()
Dim WSHShell As Object
Dim WSHFolder As Object
Dim FolderName As Variant
Dim PicDate As Variant
FolderName = "d:\画像\2007_8"
Set WSHShell = CreateObject("Shell.Application")
'ファイルが存在するフォルダを指定(※Variant型を指定して下さい)
Set WSHFolder = WSHShell.NameSpace(FolderName)
PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("04300002.jpg"), 25)
MsgBox(PicDate)
End Sub
PicDate = の右端の25を変えたらどうなるかを2,3試したところ
色々な情報が出てくるようです。
そこで試しに下記のような事をして見ました。
その結果では31にすると下記の様に秒まで出て来るようですが如何?
2007:03:17 09:45:59
Private Sub Command1_Click()
Dim WSHShell As Object
Dim WSHFolder As Object
Dim FolderName As Variant
Dim PicDate As Variant
Dim i As Long
Open "c:\info.txt" For Output As #1
FolderName = "C:\Canon"
Set WSHShell = CreateObject("Shell.Application")
'ファイルが存在するフォルダを指定(※Variant型を指定して下さい)
Set WSHFolder = WSHShell.NameSpace(FolderName)
'PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), 27) 'ピクセル
'PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), 26) 'size
'PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), 25) '写真の撮影日
'MsgBox (PicDate)
For i = 0 To 40
PicDate = WSHFolder.GetDetailsOf(WSHFolder.ParseName("IMG_2378.JPG"), i) '
Print #1, CStr(i) & " : " & PicDate
Next i
Close #1
Label1.Caption = "終 了"
End Sub
Nov様、できました。本当にありがとうございました。
いろいろ試しましたが"31"が出ないファイルもありますので下記のようにして処理することにしました。ご親切、御礼申し上げます。
Private Sub Command1_Click()
Dim WSHShell As Object
Dim WSHFolder As Object
Dim FolderName As Variant
Dim PicDate As Variant
Dim PicDate25 As Variant
Dim PicDate31 As Variant
FolderName = "d:\画像\2007_8"
Set WSHShell = CreateObject("Shell.Application")
'ファイルが存在するフォルダを指定(※Variant型を指定して下さい)
Set WSHFolder = WSHShell.NameSpace(FolderName)
PicDate25 = WSHFolder.GetDetailsOf(WSHFolder.ParseName("04300002.jpg"), 25)
PicDate31 = WSHFolder.GetDetailsOf(WSHFolder.ParseName("04300002.jpg"), 31)
if PicDate31><"" then
PicDate=PicDate31
Else
PicDate=Format(PicDate25, "yyyy/mm/dd hh:mm:ss")
end if
MsgBox(PicDate)
End Sub
# 本題とは関係ないところに反応。
> Set WSHShell = CreateObject("Shell.Application")
イコールの左辺(変数名)と右辺が合っていないようです。
ProgID "Shell.Application" で得られるのは、Shell オブジェクトです。
WshShell オブジェクトならば、ProgID は "WScript.Shell" ですね。
魔界の仮面弁士様、回答をありがとうございます。
WScript.Shellを試すために参照設定しようと調べましたがこれにはWindows Scripting Host Runtime Libraryが必要のようです。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/wshshell.htm
VB6で探しましたがこれに相当するライブラリが見当たりませんがこのような場合はどのようにすれば宜しいでしょうか?
また当初の目的である撮影日時(秒まで)の取得にはどのような方法があるのか、簡単にできるものがあればご指導ください。
> WScript.Shellを試すために
今回の目的であれば、WshShell を試す必要は無い気がします。(^^;
> これに相当するライブラリが見当たりませんが
ProgId が分かっている場合は、そこから逆引きできる場合があります。
たとえば、WScript.Shell の場合、レジストリから
HKEY_CLASSES_ROOT\WScript.Shell\CLSID
のキーを見ると、そこから
{72C24DD5-D70A-438B-8A42-98424B88AFB8}
という値を得る事ができます。後はその値を元に、
HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}
の下のキーを見ていけば、
C:\WINDOWS\System32\wshom.ocx
というファイル名を発見できるかと。
あとはそれを参照設定すれば、
Dim a As IWshRuntimeLibrary.WshShell
Set a = New IWshRuntimeLibrary.WshShell
Dim b As Object
Set b = CreateObject("WScript.Shell")
といったコードを得られます。
ちなみに、(WshShell ではなく)Shell オブジェクトの方は、
参照設定するのは Shell32.DLL です。
(Win98 などの古い OS の場合は、別のファイル名になっていますが)
Dim c As Shell32.Shell
Set c = New Shell32.Shell
Dim d As Object
Set d = CreateObject("Shell.Application")
> また当初の目的である撮影日時(秒まで)の取得にはどのような方法があるのか、
私の知っているのは、GDI+ の API を使って、&H9003 のプロパティID から、
"2003-08-03_14-46-50" のような形式で、撮影日時を得る方法ぐらいです。
http://www.atmarkit.co.jp/fdotnet/dotnettips/047exif/exif.html
> 簡単にできるものがあればご指導ください。
う〜ん。.NET なら bitmap.PropertyIdList 経由で簡単に得られるのですが、
GDI+ の Flat API を使うとなると、幾つかの Declare 宣言が必要なので
ちょっと面倒かも。
> 私の知っているのは、GDI+ の API を使って、&H9003 のプロパティID から、
> "2003-08-03_14-46-50" のような形式で、撮影日時を得る方法ぐらいです。
GDI+ を使って、プロパティID を得る例。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200709/07090026.txt
サンプルで読み取っているのは、&H9003 (ASCII, 20) のプロパティではなく、
&H5100 (Long), &H5101 (Short, 1) の例なので、微妙に異なりますけれどね。
魔界の仮面弁士様 大変詳細な解説をありがとうございます。
>今回の目的であれば、WshShell を試す必要は無い気がします。(^^;
あえてWshShellを使わなくても今回の目的には前回方式でとりあえずOKと判断し解決のチェックを入れさせていただきました。
ランタイムライブラリを探す方法、設定の方法など今後色々と役立つものと思います。あらためてお礼申し上げます。