ホーム >プログラム >Delphi 6 ローテクTips

dsofile.dllをDelphiから使ってみる

どこでだったかは忘れたけれども、ID3タグを取得しようと関連情報をネットで探していたら、マイクロソフト製の dsofile.dll というものがあることを知りました。
なんでもこれを利用すればファイルのプロパティを読み込めるだけでなく書き込みもできるのだとか。
mp3infp.dll ではなし得なかったUnicode文字への完全対応もこれならできるのではないだろうか?という期待もこめて、よし一発試してみるか!
というページ。


で、ファイルを落としてインストールもして展開されたソースコードを開いてみるもよく解らない。
これどうやって使うの?と。
mp3infp.dll の場合は mp3infp_ExportFunc.h というヘッダーファイルをDelphiから使えるようにコンバートすれば使えるようになるのですが、 dsofile.dll の場合はそうではないようです。
Shellオブジェクトの使い方に近いのだろうかなぁ、、と。

↑を参考にDelphiへ翻訳してテスト。
やってみて分かったのが、 dsofile.dll というのはWordやEcxellなどのOfficeファイルの概要を知るためのものであって、ID3タグとかExif情報とは関係ないということ。ID3タグ取得に使えるかと思ったのですがだめでした。
というか、これを使うには dsofile.dll をインストールしないと使えないんじゃなかろうかと。ただ dsofile.dll をアプリに添付すればいいだけとは違うみたいな気もなきにしもあらず。
まぁ、私は使わないのでいいんだけど。

そういうことでID3タグ取得が目的であったので dsofile.dll は使えず、、ということなのだけれどももったいないのともしかして将来使わざるを得なくなるときもあるかと思い、書き残す方向で。


まずはdsofileのインストール。これはダウンロードした実行形式の圧縮ファイルをダブルクリックしてインストール先を指定するだけなので問題はありません。
無事インストールされたらDelphiで使えるようにします。

  1. Delphiのメニューから「プロジェクト」を選択
  2. 次に「タイプライブラリの取り込み」を選択
  3. 出てきたダイアログボックスの一覧から「DSO OLE Document Properties Reader 2.1 (Version 2.1)」を選択
  4. [インストール]ボタンを押す
  5. 「取り込めました」というようなメッセージがダイアログと共に出るのでダイアログを閉じる。

あとはコンポーネントパレットのActiveXのところにある「OleDocumentProperties」をフォームに貼り付ければDelphiが自動でuses節に必要となる OleServer と DSOFile_TLB を付け足してくれます。
そして CreateOleObject関数 を使えるように uses節に ComObj を書き加えて準備完了となります。

procedure TForm1.Test1Click(Sender: TObject);
var
  objFile: OleVariant;
  ls_WFile: WideString;
begin
  if (gfnbOpenFileDialog(ls_WFile, '', Handle)) then begin
    objFile := CreateOleObject('DSOFile.OleDocumentProperties');
    objFile.Open(ls_WFile);

    myDebug.gpcDebugAdd('Application name: ',            WideString(objFile.SummaryProperties.ApplicationName));
    myDebug.gpcDebugAdd('Author: ',                      WideString(objFile.SummaryProperties.Author));
    myDebug.gpcDebugAdd('Byte count: ',                  WideString(objFile.SummaryProperties.ByteCount));
    myDebug.gpcDebugAdd('Category: ',                    WideString(objFile.SummaryProperties.Category));
    myDebug.gpcDebugAdd('Character count: ',             WideString(objFile.SummaryProperties.CharacterCount));
    myDebug.gpcDebugAdd('Character count with spaces: ', WideString(objFile.SummaryProperties.CharacterCountWithSpaces));
    myDebug.gpcDebugAdd('Comments: ',                    WideString(objFile.SummaryProperties.Comments));
    myDebug.gpcDebugAdd('Company: ',                     WideString(objFile.SummaryProperties.Company));
    myDebug.gpcDebugAdd('Date created: ',                WideString(objFile.SummaryProperties.DateCreated));
    myDebug.gpcDebugAdd('Date last printed: ',           WideString(objFile.SummaryProperties.DateLastPrinted));
    myDebug.gpcDebugAdd('Date last saved: ',             WideString(objFile.SummaryProperties.DateLastSaved));
    myDebug.gpcDebugAdd('Hidden slide count: ',          WideString(objFile.SummaryProperties.HiddenSlideCount));
    myDebug.gpcDebugAdd('Keywords: ',                    WideString(objFile.SummaryProperties.Keywords));
    myDebug.gpcDebugAdd('Last saved by: ',               WideString(objFile.SummaryProperties.LastSavedBy));
    myDebug.gpcDebugAdd('Line count: ',                  WideString(objFile.SummaryProperties.LineCount));
    myDebug.gpcDebugAdd('Manager: ',                     WideString(objFile.SummaryProperties.Manager));
    myDebug.gpcDebugAdd('Multimedia clip count: ',       WideString(objFile.SummaryProperties.MultimediaClipCount));
    myDebug.gpcDebugAdd('Note count: ',                  WideString(objFile.SummaryProperties.NoteCount));
    myDebug.gpcDebugAdd('Page count: ',                  WideString(objFile.SummaryProperties.PageCount));
    myDebug.gpcDebugAdd('Paragraph count: ',             WideString(objFile.SummaryProperties.ParagraphCount));
    myDebug.gpcDebugAdd('Presentation format: ',         WideString(objFile.SummaryProperties.PresentationFormat));
    myDebug.gpcDebugAdd('Revision number: ',             WideString(objFile.SummaryProperties.RevisionNumber));
    myDebug.gpcDebugAdd('Shared document: ',             WideString(objFile.SummaryProperties.SharedDocument));
    myDebug.gpcDebugAdd('Slide count: ',                 WideString(objFile.SummaryProperties.SlideCount));
    myDebug.gpcDebugAdd('Subject: ',                     WideString(objFile.SummaryProperties.Subject));
    myDebug.gpcDebugAdd('Template: ',                    WideString(objFile.SummaryProperties.Template));
    myDebug.gpcDebugAdd('Title: ',                       WideString(objFile.SummaryProperties.Title));
    myDebug.gpcDebugAdd('Total edit time: ',             WideString(objFile.SummaryProperties.TotalEditTime));
    myDebug.gpcDebugAdd('Version: ',                     WideString(objFile.SummaryProperties.Version));
    myDebug.gpcDebugAdd('Word count: ',                  WideString(objFile.SummaryProperties.WordCount));

    objFile.Close;
  end;
end;

もしかして↑では objFile.SummaryProperties.ApplicationName みたいにやってるけどもこの SummaryProperties にもっと色々な情報を取得できる方法があるのかも、、?
と、思いソースコード眺めてみたけれどどうもなさそう。CustomPropertyプロパティ使ってforループまわしてみたけれどもだめでした。