吹き出し状の表示

解決


yTake  2014-08-10 07:02:45  No: 46555

すみません。ご教授願います。

ある特定書式のファイルのアイコン上(ファイル名上)にアイコンを持って行った場合に、そのファイルの中の特定の情報を吹き出し状に表示させる事は可能でしょうか?
Windouws7のプレビュー・ペインが機能的にはとてもよく似ています。

TBalloonHintと言うコンポーネントがありましたが、基本的にオブジェクトに登録した”ヒント内容”を吹き出し状に表示するもので、例えば、そのヒント内容の変わりに、カーソル位置のファイル内容を代入すれば良い様に思いましたが、TBalloonHintがアプリケーション・フォーム上でしか有効ではない様でWindowsのファイル上ではそもそも表示されない様です。

1)カーソル位置にあるファイルのファイル名を取得。
2)取得したファイルから特定の情報を読み出す。
3)得られた情報を吹き出し状に表示します。

TBalloonHintで上述を実現可能でしょうか?
或いは、別のより適切なコンポーネントがあれば、ご教授下さい。

よろしくお願いします。


DEKO  2014-08-10 12:52:08  No: 46556

> アイコンを持って行った場合に、
これは Explorer の事を仰っていますか?

> Windouws7のプレビュー・ペインが機能的にはとてもよく似ています。
であれば素直にプレビューハンドラを実装するのがよろしいかと。

[Is there a Preview Handler VCL for Windows 7? (StackOverflow)]
http://stackoverflow.com/questions/5195988/is-there-a-preview-handler-vcl-for-windows-7


yTake  2014-08-10 18:44:01  No: 46557

DEKOさん
ありがとうございます。

>これは Explorer の事を仰っていますか?
はい。

>であれば素直にプレビューハンドラを実装するのがよろしいかと。
ハンドラが良くわかりません。確認です。
Explorerのプレビューを一部改装すると言う事ではないですね。
アプリケーションにExplorerと同様のプレビューハンドラを組み込むと言う事ですね。
疑問として、Explorerのプレビューハンドラと衝突しないのでしょうか?

>[Is there a Preview Handler VCL for Windows 7? (StackOverflow)]
を参照させてもらいました。
’10’のところにコード例がありました。
はじめの
type
  IIPreviewHandler = interface(IUnknown)
等、
で機能を宣言しているのでしょう。(実態はuses節で読み込み)

次の
  TMyPreviewHandler = class(IIPreviewHandler, IIPreviewHandlerVisuals, IOleWindow, IObjectWithSite)
と、
  TMyStream = class(IIPreviewHandler, IInitializeWithStream, IStream)
で、
具体的にプレビュー内容を表示するコードを記述すると思います。
今回の場合、"TMyPreViewHandler"にファイルの判別と内容の抽出と表示をコーディングすれば良いと思います。
"TMyStream"には、何を記述するのでしょう?

少し、コンポーネントを利用するのと勝手が違うので、ご教授頂ければ幸いです。


yTake  2014-08-10 20:21:09  No: 46558

すみません。

念の為、今一度、こちらで想定している機能内容を説明します。

こちらで意図している吹き出し状の表示とは、Explorerのプレビューウィンドウへの表示や最下段のヒントエリアとは違います。

フォルダー・オプションの”表示”タグで詳細表示中の”フォルダーとデスクトップの項目の説明をポップアップで表示する”により、その表示がオンオフできる機能の事です。
通常、カーソルをファイル上へ持って来ると、吹き出し状に矩形エリアポップアップされ、1)種類、2)サイズ、3)更新日時が表示されます。

この3項目に変わって若しくは追加して、ある特定内容を表示させたい
と思っています。

プレビュー・ハンドラのアプリケーションへの実装で実現できる事でしょうか?
意図が正しく伝わっていたでしょうか?

改めて、よろしくお願いいたします。

当方、
32bit Win7+DELPHI XE3
です。


DEKO  2014-08-10 21:40:05  No: 46559

こんな事ならできますよ。
https://twitter.com/ht_deko/status/498309427301064704
(別にファイル内容を表示しなければならない訳ではありません)

> ポップアップで表示
これはプレビューハンドラ程簡単にはできない気がします。


yTake  2014-08-10 22:50:12  No: 46560

DEKOさん、
ありがとうございます。

参照させて頂きました。プレビューハンドラを実装する事で、
Explorerのプレビュー・ウィンドウに何かを表示(内容に限らず)させる事が可能と言う事ですね。
つまり、カーソル位置のファイル名を取得可能と言う事ですね。

>> ポップアップで表示
>これはプレビューハンドラ程簡単にはできない気がします。
そうですか。

プレビューさせたい内容が多くはないので、ポップアップ程度の領域で十分だと思いました。

例えば、いくつかのファイルから一つを選んで開きたいのですが、ファイル名からは内容が確認できず、開いてみないと目的のファイル化どか、分からないとします。
この時、ファイルの内容のID、名前、日付などをファイルを開く事無く確認できればと思いました。

プレビュー・ハンドラを利用して、プレビュー・ウィンドウへこれらを表示すると言うのが、現実的でしょうか?


DEKO  2014-08-10 23:07:08  No: 46561

> プレビュー・ハンドラを利用して、プレビュー・ウィンドウへこれらを表示すると言うのが、現実的でしょうか?

そうですね。プレビュー内容は何でもいいので、
プレビューハンドラならば任意の項目を表示する事ができると思います。

[Explorer] プレビューハンドラ (Delphi Forum)
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1524


yTake  2014-08-11 01:00:02  No: 46562

DEKOさん、ありがとうございます。
参考のページもありがとうございます。
ヘルプにも情報がなく苦慮しておりました。助かります。

参考ページをみて試行錯誤しています。

目的のプレビュー・ハンドラをコーディングしてDLLとして作成し、システムフォルダーへコピーし登録すると言う流れは分かりました。

先ず。”PreviewHandler.pas”を作成しました。とりあえず、そのまま貼り付けました。
次が固有のプレビュー処理の記述と思います。とりあえず、DEKKOさんの例をそのまま試させて頂き、コンパイルが通れば、"DoPreView"の内容を変更する事で実現できると思いましたが、
uses節でエラーです。
Interface部で、
"HEditor"と"DelphiFountain"
が通りません。

これらは、プレビュー表示でのデータ読み込みと表示の見栄え等を決めている様に思います。
わずか、3・4つの項目を表示するだけなので、これらを使わなくても良いと思います。
ただ、何かデータを読み込むオブジェクトは何か定義する必要があると言う事でしょうか?
フォームが無いので、TEdit等のコンポーネントを配置すると言う事もできません。


DEKO  2014-08-11 01:32:54  No: 46563

TEditor を正しくインストールしているのであれば、
ユニットスコープを解決できていないのだと思います。

プロジェクトプションでユニットスコープに VCL を追加してみてください。


DEKO  2014-08-11 01:33:30  No: 46564

誤: プロジェクトプション
正: プロジェクトオプション


DEKO  2014-08-11 01:38:46  No: 46565

> ただ、何かデータを読み込むオブジェクトは何か定義する必要があると言う事でしょうか?
> フォームが無いので、TEdit等のコンポーネントを配置すると言う事もできません。

元ネタでは TLabel に表示していますね。


yTake  2014-08-11 03:16:23  No: 46566

DEKOさんのTEditorをダウンロード、インストールする必要があると言う事ですね。
まだ、ダウンロード・インストールはしておりませんでした。

元ネタの方を良く見ていませんでした。確かに、TLabelが使われていました。
こちらで試してみました。

とりあえず、構文上はエラーの無い形にできました。

よく分からないので、選択したファイル名が表示される様にと思い、
procedure TPascalPreviewHandler.DoPreview(const FilePath: string);
の内容を
  TextLabel.Caption := 'TEST PreView Hadler :' + FilePath;
としました。

生成されたDLLをシステムにコピーし、登録して、あるファイルを選択してみましたが、”プレビューできません”となります。
また、テキストファイルを選択すると、これまで通りファイル内容が表示されます。登録したDLLは動作していない様子です。
DLL登録時にはエラーはありません。正常に実装された旨のメッセージが出ました。

Label1のCaptionとしてファイル名が表示されるはずですが、Label1をフォーム上などに配置していません。この場合、どこに表示されるのでしょうか?

Constructorのところで、Alignment := Centerなどとしていますので、PreViewウィンドウの中央に表示されると思いましたが、、、

何分、DLLの作成を始めハンドラの操作も不慣れで、参考コードをよく理解できていません。

ヒントを頂けると幸いです。


DEKO  2014-08-11 03:52:29  No: 46567

> DEKOさんのTEditorをダウンロード、インストールする必要があると言う事ですね。
正確には本田さんのを mae さんが改変したものを DEKO が改変したものです (^^;A

> DLL登録時にはエラーはありません。
という事はコマンドプロンプトはちゃんと管理者権限で実行されているという事ですね。
TLabel の代わりに TPanel を使ってみるとか…。

# 或いは TPanel の上に TPanel を貼ってみるとか。


DEKO  2014-08-11 03:53:42  No: 46568

誤: TPanel の上に TPanel
正: TPanel の上に TLabel


yTake  2014-08-11 04:18:24  No: 46569

TEditorの件、経緯が分かりました。

登録は管理者権限で行っています。

DLL用のプロジェクトにユニットを追加しただけなので、フォームがありません。
"Tpanel"の上に"TLabel"を貼ると言う事が出来ません。

また、DLLのデバッグを行ってみようと思います。
まだ、デベロッパーキャンプは十分読み込めていません。
DLLなので、呼び出し元のホストアプリケーションを指定する必要がありますが、
"Explorer"を指定してみましたが、どうも違う様です。
また、パラメータの指定もあります。カーソル座標などを座標で入力するものなのか、デバックの過程で実際にマウスで操作できるのか、どうかも分かりません。

何度もすみません。ご教授頂けるでしょうか?


yTake  2014-08-11 08:08:29  No: 46570

デバッガーを使えないので、"ShowMessage"を
ProcedureのDoPreview内と、ConstructorのCreate内に配置してみました。
結果、ファイルを選択しても、いずれのShoMessageも表示されませんでした。
これはプレビューの表示の問題ではなく、作成したDLL自体が呼び出されていないと言う事になるのでしょうか?

何か参考になるでしょうか?


DEKO  2014-08-11 12:13:39  No: 46571

> DLL用のプロジェクトにユニットを追加しただけなので、フォームがありません。
> "Tpanel"の上に"TLabel"を貼ると言う事が出来ません。

"貼る" という表現は適切ではなかったかもしれませんが、
TLabel.Parent に TPanel を指定すればできますよ。

FPanel := TPanel.Create(AParent);
FPanel.Parent := AParent;
FLabel := TLabel.Create(AParent);
FLabel.Parent := FPanel;
...


yTake  2014-08-11 17:45:27  No: 46572

ありがとうございます。
確かに、デザイナー上で貼り付けするにしても、それはソースコードに展開されているわけで、ソースの記述書式が分からないと質問すべきでした。

で、ご指示の様にTLabelのParent指定をTPanelに設定してみましたが、特に変化はみられませんでした。

元ネタに基づき試行してみましたが、配置したShowMessageすら表示されません。

ちょっと、小康状態に陥りました。

どの辺をチェックすると良いのでしょう?


DEKO  2014-08-11 19:05:33  No: 46573

> どの辺をチェックすると良いのでしょう?

とりあえず私が提示したサンプルを動かしてみて、
・TEditor を TMemo に代える
・TMemo を TEdit に代えてファイル名だけ表示してみる
・目的の事をやってみる
という風に段階的に改変するのがよろしいかと思います。


yTake  2014-08-12 20:18:31  No: 46574

yTakeです。

TEditorで試してみる事にしました。

HEditrを展開したフォルダーへライブラリパスを通した後で、
HEditReg.pas をコンポーネントインストールしたところ、コンパイル時にエラーです。

”[dcc32 致命的エラー] HEDITREG.PAS(19): F1026 ファイル 'DsgnIntf.dcu' が見つかりません”

となります。

'DsgnIntf.dcu'はPC上に無い様です。

インターネット上などでは、コンパイラーオプションを指定するなどの方法が示唆されていますが、XE3ではその様なオプション等の設定が分かりません。

インターネットからダウンロードできるのでしょうか?

よろしくお願いします。


yTake  2014-08-12 21:08:00  No: 46575

DEKOさんのページに"-LUDesignIDE"オプションの紹介をみつけました。

オプションが同様だったので、試してみましたが、
結果は、改善されませんでした。

引き続き、調べてみます。


DEKO  2014-08-12 21:29:23  No: 46576

> -LUDesignIDE
これは C++Builder 用の指定です。

> HEditReg.pas をコンポーネントインストールしたところ、コンパイル時にエラーです。
Delphi 2009〜XE6 までのパッケージが用意されているのですが...。

readme_Unicode.txt にも書いてありますよね?

> [インストール方法]
> Packages フォルダにあるパッケージを開いてインストールしてください。
> [ツール | オプション] で Source フォルダをライブラリパスに追加する必要があります。


yTake  2014-08-12 22:07:22  No: 46577

DEKOさん
ありがとうございます。

>これは C++Builder 用の指定です。
確かに、良く見るとその様になっていました。

>Delphi 2009〜XE6 までのパッケージが用意されているのですが...。
ダウンロードにはパッケージが見当たりません。

>readme_Unicode.txt にも書いてありますよね?
"readme_Unicode.txt"も見当たりません。"README.TXT"と"HISTORY.TXT"があります。

ダウンロードが違う様です。
確認してみます。


DEKO  2014-08-12 22:47:39  No: 46578

> ダウンロードにはパッケージが見当たりません。
> "readme_Unicode.txt"も見当たりません。"README.TXT"と"HISTORY.TXT"があります。

それは本田さんオリジナルの TEditor (ANSI 版) なのでは?


DEKO  2014-08-12 22:50:02  No: 46579

直リンク貼っておきますね。
http://ht-deko.minim.ne.jp/software/hedit252U_modified.zip


yTake  2014-08-12 23:37:18  No: 46580

DEKOさん
すみません。
ご指摘の通りでした。
DEKOさんの版をみつけました。(直リンクもありがとうございます)
ダウンロードさせて頂き、環境的にはエラーのない状況に出来ました。
お騒がせして、申し訳ありません。

動作の確認はこれからですが、またしばらくアクセスできません。

結果は追ってRESさせて頂きます。


yTake  2014-08-13 17:36:50  No: 46581

遅くなりました。

結果、動作していない様です。
今まで通りにプレビューが表示されるだけです。
TEditorで表示されている様には見えません。

ここで、DoPreViewルーチン内にShowMessageを配して、デバッグしてみようと思いビルドし直し、DLLを差し替えようとしたら、エラーになりました。
”Preview Handler Surrogate Hostによってファイルは開かれている為、操作を完了できません。”
となります。これは一見PreViewHandlerが一部機能しているとも考えられます。
しかし、これまで、元ネタ等で試していた時には、DLLを差し替えても出なかったエラーです。
DLLの登録削除は正常に完了されています。

これではDLLを差し替えられず、デバッグができない状況になってしまいました。

DLLのデバッグ方法は何か特別なのでしょうか?

よろしくお願いいたします。


yTake  2014-08-13 17:51:56  No: 46582

Windows側のプレビューをオフにしてみました。プレビュー表示は一切なくなりました。
しかし、”Preview Handler Surrogate Hostによってファイルは開かれている為、操作を完了できません。”
が出ます。

ということは、作成登録したTEditor版プレビューのDLLは一部機能していて、表示だけうまく行っていないと言うことでしょうか?
また、このDLLが一部機能している為、削除できないと考えられます。
つまり、削除の為、マウスで選択した時点で登録作成したプレビューが機能してしまい、ファイルオープン状態になってしまう?

と言う事は、この選択を外し、コマンドプロンプトから削除しないとダメと言う事でしょうか?


DEKO  2014-08-13 17:55:56  No: 46583

今回のような件のデバッグに ShowMessage() を使うのは
適切ではないかと思います。ログ吐くなりするのがよろしいかと。

> 今まで通りにプレビューが表示されるだけです。
テキストが表示されるのですか?それとも「プレビューできません」でしょうか?

テキストが表示されるのであれば、DLL の登録がうまくいっていません。

1.DLL を %SystemRoot%\System32 へコピー
2.すべての Explorer を閉じる
3.コマンドプロンプトを管理者権限で起動
4.CD %SystemRoot%\System32
5.念の為に regsvr32 -U PascalPreview.dll して登録解除
6.regsvr32 PascalPreview.dll して登録

これでもおかしいのであれば、

1.すべての Explorer を閉じる
2.念の為に regsvr32 -U PascalPreview.dll して登録解除
3.regsvr32 C:\Windows\System32\PascalPreview.dll して登録
  (フルパス名で登録)

とし、Explorer を開いてみてください (但し、上記例は 32bit Windows 用)。

> ”Preview Handler Surrogate Hostによってファイルは開かれている為、操作を完了できません。”
ウィルス対策ソフトとかでブロックされていたりしませんか?PascalPreview.dll を除外リストに突っ込んでみるとか?


yTake  2014-08-13 19:22:58  No: 46584

ShowMessage()は使わない様にします。
ファイルへ書き出す様にしてみたいと思います。

今まで通りのプレビューとは、テキスト・ファイルはその内容が白黒文字で表示され、テキスト・ファイルではない場合には、「プレビューを利用できません」と表示されます。

"C:\WINDOWS\SYSTEM32\"へ"cd"してから、(削除してから)登録しても、
フルパスで指定して(削除してから)登録しても結果は変わりません。

Explorerを閉じるとは、開いている全てのWindowを閉じると言う事ですね。
サービスとしてのExplorer自体を終了する事ではありませんよね。
XE3とコマンドプロンプト以外のアプリケーションは起動していません。

PascalPreview.dllを除外すると言う事はありませんが、ウィルス対策ソフトは稼動していました。念の為、"Realtime Protection"をオフにしました。アンインストールはしていません。
ただ、オンのまま、これまでは問題なかったのですが、、、

結果、削除は可能になりました。


DEKO  2014-08-13 20:10:10  No: 46585

> 今まで通りのプレビューとは、テキスト・ファイルはその内容が白黒文字で表示され、
> テキスト・ファイルではない場合には、「プレビューを利用できません」と表示されます。

*.pas 等を選択しても白黒テキストな訳ですね。

> Explorerを閉じるとは、開いている全てのWindowを閉じると言う事ですね。

そうです。一旦閉じて開き直さないと反映されません。

> 結果、削除は可能になりました。

何かしらウィルス対策ソフトの影響は受けているようですね。

PascalPreview.dll が正しく登録されているのであれば、
[HKEY_CLASSES_ROOT\CLSID\(ソースコードにある GUID)] にレジストリエントリがあるハズです。
そしてここが正しければプレビューは正しく動作すると思います。

別の PC が用意できるのであれば、別の PC で試してみてはいかがでしょうか?
(DLL 持っていくだけなので)

Windows 7 32bit (32bit でビルドした DLL を使用) / 64bit (32bit でビルドした DLL を使用)
当方ではいずれでも (別 PC です) 正常動作しています。


yTake  2014-08-13 21:00:37  No: 46586

DEKOさん、ありがとうございます。

レジストリを確認しました。
4つのGUIDは正しく見つかりました。
と言う事は、何か根本的に間違っている?のでしょうか?

ソースは取り合えず全コピーのはずです。
但し、USE節なので、"VCL."を頭に付ける必要のあったものがありました。これはライブラリパスの関係で、問題ではないと思います。

警告が多数出ていますが、エラーではないので無視しています。
例えば、
”[dcc32 ヒント] PreviewHandler.pas(201): H2443 インライン関数 'TFont.GetStyle' はユニット 'System.UITypes' が USES リストで指定されていないため展開されません”
”[dcc32 警告] htSearch.pas(27): W1061 指定された WideChar 定数 (#$00FF) を AnsiChar に縮小変換した結果、情報が失われました”
”[dcc32 警告] htSearch.pas(604): W1063 指定された AnsiChar 定数 (#$81) を WideChar に拡大変換した結果、情報が失われました”
等です。
九割方、"htSearch.pas"ですが、これらが実行時影響しているのでしょうか?

また、エラーや警告ではありませんがプロジェクト・ソースのところのUSE節が
uses
  ComServ,
  uPascalPreView in 'uPascalPreView.pas',
  PreviewHandler in 'PreviewHandler.pas';
となっています。
元々、
uses
  ComServ,
  PreviewHandler,
  uPascalPreview in 'uPascalPreview.pas';
としていましたが、勝手に”in 'PreviewHandler.pas'”が付加されます。

何か役に立つでしょうか?


yTake  2014-08-13 21:02:27  No: 46587

別のPCは、32bit-Win7がありません。
64bit-Win8ならあるのですが、


DEKO  2014-08-13 21:29:11  No: 46588

> 但し、USE節なので、"VCL."を頭に付ける必要のあったものがありました。これはライブラリパスの関係で、問題ではないと思います。

上にも書きましたが「プロジェクトプションでユニットスコープに VCL を追加してみてください。」で解決します。

> htSearch.pas
気になるようでしたらこの辺↓をご確認ください。
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1522

> UITypes
uses に追加すれば消えます (XE2 以前では追加する必要はありません)。

上記の事象はどれもプレビューハンドラの動作とは関係ありませんね。

> 64bit-Win8ならあるのですが、

あまり比較対象にはなりませんが、64bit コンパイラでコンパイルして、
そちらでも試してみるとか…。


DEKO  2014-08-13 21:32:06  No: 46589

> 勝手に”in 'PreviewHandler.pas'”が付加されます。
プロジェクトに追加するとそうなりますよね。


yTake  2014-08-14 01:03:01  No: 46590

レジストリに関して、今回はサンプルがありそのレジストリ操作はそのまま利用できましたが、もし、ゼロから構築するとして、GUIDの値などはどの様に定めれば良いのでしょう?値を見ても十六進文字列の様で意味不明です。
DLL開発用に情報公開されているのでしょうか。

今回、ソースで用いている値が4つともレジストリエディタで確認できました。

これでも動作していない様子です。

そこでプロセスを確認するために、ステップを通過するとテキストファイルに文字列を出力する様に追加してみました。
procedure debug_out( str : String );
var
  tf  : TextFile;

begin
   AssignFile( tf, 'c:\Windows\System32\PascalPreview.txt' );
   ReWrite( tf );
   WriteLn( tf, str );
   CloseFile( tf );
end;
これを、"Constructor()"と"DoPreview()"に配置しました。

一旦、DLLの登録を削除し、改めて登録しました。(Windowsは閉じています)
その後、Windowsからテキストファイルを選択してみましたが、内容が白黒で表示されました。
PascalPreview.txtにも何も書き出されていません。
つまり、PascalPreview.DLLへは飛んでいないと言う事でしょうか?
管理者で”REGSVR32”を実行しています。REGSVR32の実行時にエラーはありません。レジストリの値も、ソフトの設定が反映しています。

既存のプレビューとはどの様に切り替わるのでしょう?プレビュー形式の選択などの設定はありません。DLLを配置して登録するだけで上書き的に置き換わると言う事でしょうか?

何か簡単な事を見落としている様なきがしてなりません。


DEKO  2014-08-14 01:42:47  No: 46591

> もし、ゼロから構築するとして、GUIDの値などはどの様に定めれば良いのでしょう?

コードのコメントに思い切り書いてある気が (^^;A

>  AssignFile( tf, 'c:\Windows\System32\PascalPreview.txt' );

UAC が有効だとここには書き出せませんね。

> PascalPreview.txtにも何も書き出されていません。

…という事は UAC を切ってある、と。

> つまり、PascalPreview.DLLへは飛んでいないと言う事でしょうか?

正常に登録されているのならば、

[Window Title]
RegSvr32

[Content]
PascalPreview.dll の DllRegisterServer は成功しました。

[OK]

この内容のダイアログが表示されます。
レジストリに値が存在するという事は、ここまでは OK なのだろうと思います。

> DLLを配置して登録するだけで上書き的に置き換わると言う事でしょうか?

そのハズです。なので「他の PC で試してみては?」とアドバイスしてみました。


yTake  2014-08-15 04:30:18  No: 46592

少々、間が開いてしまいました。

なんとか、Win7(64bit)マシンを用意できました。

32bitのDLLもそのまま動作するとの事で、試してみました。

配置は、"C:\Windows\System32"

"C:\Windows\System32"へ、cdして、

登録コマンドは、"..\System32\regsvr32 ..\System32\PascalPreview.dll"

としました。

管理者権限で実行しましたが、エラーとなりました。

”モジュール"..\System32\PascalPreview.dll"は読み込まれましたが、DllRegisterServer への呼び出しはエラーコード 0x80004005 により失敗しました。”
となります。

エラーコードを検索してみましたが、未だよく分かりません。

開発機であるWin7(32bit)では登録にエラーはありません。

>Windows 7 32bit (32bit でビルドした DLL を使用) / 64bit (32bit でビルドした DLL を使用)

とありましたので、64bitWin7用にでも、DELPHI側で64bitでメイクする必要はないと解釈しました。

未だ解決できていません。
何かアドバイスがあれば、賜りたいと思います。


yTake  2014-08-15 04:59:24  No: 46593

訂正です。
用意できた環境は、32ビットWin7でした。

同じ32ビットWin7で、一方で登録時にエラーとなるのが、原因不明です。


DEKO  2014-08-15 05:10:05  No: 46594

> 64bitWin7用にでも、DELPHI側で64bitでメイクする必要はないと解釈しました。

すみません…typo していますが、
32bit Explorer では 32bit DLL が、64bit Explorer では 64bit DLL が必要なのです。
32bit アプリケーションからは 32bit DLL しか呼び出せず、
64bit アプリケーションからは 64bit DLL しか呼び出せないので、
64bit の Explorer からは 64bit のプレビューハンドラしか実行できません。

それと、64bit Windows には 二種類の regsvr32 があります。
(32bit 版も 64bit 版も regsvr32 です)
System32 の regsvr32 を使う場合には 64bit DLL である必要があります。

64bit Windows で 32bit 版 regsvr32 を使う事はできますが、それは SysWOW64 にあります。
(64bit Vista には 32bit Explorer がありますが、Windows 7 以降にはありません)
これ以上は脱線するので、興味がおありでしたら以下をお読み下さい。

[Regsvr32 ツールを使用する方法および Regsvr32 のエラー メッセージをトラブルシューティングする方法]
http://support.microsoft.com/kb/249873/ja

[64 ビット Windows プログラミング ガイド for Delphi 64 ビット コンパイラ (Delphi Tips)]
http://ht-deko.minim.ne.jp/tech070.html

・Windows 7 64bit 版の Explorer は 64bit アプリケーション
・64bit アプリケーションが呼び出せるのは 64bit DLL のみ
・System32 にある Regsvr32 を使って 64bit DLL を登録できる

…という事で、PascalPreview.dll は 64bit である必要があります。

> 64bit コンパイラでコンパイルして、

ここは間違っていませんね (^^;A


DEKO  2014-08-15 05:14:00  No: 46595

> エラーコード 0x80004005 により失敗しました

http://support.microsoft.com/kb/914232/ja

エラー コード 0x80004005
この問題が発生するは、Windows 製品のライセンス認証 (WPA) が必要なファイルが破損または紛失した場合。この現象は、次の条件のいずれかに該当する場合に発生します。

・サード パーティ製のバックアップ ユーティリティやウイルス対策プログラムは、Windows XP のインストールを妨げます。
・手動で WPA が必要なファイルが変更されます。

ウイルス対策ソフトで PascalPreview.dll を "除外" したらどうなりますか?
停止ではウイルス対策ソフトの機能が停止しないものがあります。


yTake  2014-08-15 05:52:37  No: 46596

試験用のPCでウィルス対策ソフトをアンインストールしました。(再起動も)
OSは32ビットWin7 professional SP1
です。

この環境で、32ビットで生成したPascalPreview.dllを、
>regsvr32 ..\System32\PascalPreview.dll
しましたが、
”モジュール"..\System32\PascalPreview.dll"は読み込まれましたが、DllRegisterServer への呼び出しはエラーコード 0x80004005 により失敗しました。”
となります。

開発用PCで、ウィルス対策ソフトの設定で、"PascalPreview.dll"を除外登録しましたが、結果に改善はみられません。

因みに、出力テキストファイルを書き込み許可のあるフォルダーに設定し試してみました。結果は、何も出力されません。ファイルその物が生成もされていません。
PascalPreview.dllのDoPreview()には飛んで来ていないと言う事でしょう。

皆目原因が分かりません。


DEKO  2014-08-15 06:03:40  No: 46597

ウイルス対策ソフトの影響を "受けにくくしたい" のであれば、以下の手順を試してみてください。

[現状の PascalPreview.dll を登録解除]
0.開いている Explorer をすべて閉じる
1.コマンドプロンプトを管理者権限で起動
2.regsvr32 -U PascalPreview.dll (DLL を登録解除)
3.del C:\Windows\System32\PascalPreview.dll (古い DLL を削除)

[新しく PascalPreview.dll を登録]
0.開いている Explorer をすべて閉じる
1.C:\TEST フォルダを作成
2.PascalPreview.dll を C:\TEST にコピー (UAC の影響を受けず、ウイルス対策ソフトの影響を受けにくい)
3.コマンドプロンプトを管理者権限で起動
4.regsvr32 C:\TEST\PascalPreview.dll (DLL を登録)

…これでうまくいくのなら、
これまでの件はすべてウイルス対策ソフトのせいです。


DEKO  2014-08-15 06:14:35  No: 46598

関係ないとは思いますが [プロジェクト | オプション] で、
・バージョン情報が付いていないなら付けてみる。
・ランタイムテーマが有効でないなら有効にしてみる。
これも試してみてください。


yTake  2014-08-15 06:36:30  No: 46599

C:\TESTフォルダーを作成しPascalPreview.dllを配置しました。
System32内のPascalPreview.dllは削除しました。
全て、ウインドウを閉じ、管理者としてコマンドプロンプトを起動し、
C:\TEST内のPascalPreview.dllを登録しました。エラーはありません。
バージョン情報は付いていました。ランタイムテーマは無効でしたので有効にしてあります。
結果、改善は見られません。

ソースのビルドに問題があるのでしょうか?
DLL生成プロジェクトを作成し、ユニットを2つ追加し、元ネタのソースをPreviewHandler.pas、DEKOさんのソースをuPascalPreview.pasとしました。
デバッグ用にテキストファイル出力を追加した以外はほぼ元のソースのままのはずです。

何か、念のため、確認した方が良い箇所などあるでしょうか?


DEKO  2014-08-15 06:46:05  No: 46600

> DLL生成プロジェクトを作成し

DLL のプロジェクトもファイルがあったハズですが、ご自分で新規作成されたのですか?
…もしそうなら、

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall;

この部分はちゃんと存在しますか?

ちなみに当方、
・Windows 7 32bit × 2
・Windows 7 64bit × 1
で試しましたが、何の問題も出ていません。


DEKO  2014-08-15 06:47:16  No: 46601

> DLL のプロジェクトもファイルがあったハズ

PascalPreview.dpr の事です。


DEKO  2014-08-15 06:55:51  No: 46602

ちなみに PascalPreview のサンプルは
TEditor ver 2.52 Unicode Edition の Samples フォルダにも含まれています。


yTake  2014-08-15 09:37:12  No: 46603

説明不足でした。
存在します。
自分でDLLプロジェクトを新規作成し、
exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall;
を、貼り付けました。

ライブラリ・パスに、heditorのsourceフォルダーとへ通し、mecsutils.pasも含めました。


yTake  2014-08-15 10:17:23  No: 46604

わかりました。

私が本プレビューの動作を理解できていませんでした。
勝手に、全てのテキストファイルが、TEditorで表示されると思っていました。
拡張子が、".pas", ".dpk", ".inc"の3つだったのですね。
これら3つは、TEditorで表示されました。
".dpr"ファイルのみ何故か”プレビューを利用できません”となります。

私の理解不足で大変お手間を取らせてしまいました。申し訳ございません。

RESEDITでレジストリの確認の件が出た時も全く意味が分かっていませんでした。単に確認しただけでした。

後は、
・TEditor を TMemo に代える
・TMemo を TEdit に代えてファイル名だけ表示してみる
・目的の事をやってみる
を、順次試してみます。

ここで、プレビューさせたいファイルの拡張子を変えたい場合、TGUIDを設定すれば良いとは分かりますが、具体的にはどう設定すれば良いか、未だ、分かっていません。
調べてみます。
また、拡張子で判断せずに、選択したファイルの中身で判断すると言う事は可能でしょうか?


DEKO  2014-08-15 10:45:48  No: 46605

> 勝手に、全てのテキストファイルが、TEditorで表示されると思っていました。

拡張子からはテキストファイルかどうかは判断できませんよね?
*.DAT というファイルがあったとして、それがテキストなのかバイナリなのかは開いてみるまでは判りません。

 ’画像のプレビューハンドラは’
 ’・*.dpr, *.pas, *.dpk, *.inc を関連付け’
 ’・プレビューウィンドウには TEditor (Unicode Edition) を使用’

対応拡張子は提示したリンク先にちゃんと書いてあり、コードのコメントにもが書いてありましたよ (^^;A

結果を求めるのは悪いことではないとは思いますが、
もう少し落ち着いて情報を整理してみるといいかと思います。

「さっき書いたよ…」「リンク先に書いてあるよ…」というのが何度も続くと
正直「アドバイスをちゃんと聞いてないのかな?」と思ってしまいます。

> プレビューさせたいファイルの拡張子を変えたい場合、
> TGUIDを設定すれば良いとは分かりますが、具体的にはどう設定すれば良いか、未だ、分かっていません。

新しい拡張子のために自分で好き勝手に GUID を割り当てればいいのです。
要は他の人が作ったアプリの GUID とカブらなければいいのですから。

[GUID (Wikipedia)]
http://ja.wikipedia.org/wiki/GUID

> また、拡張子で判断せずに、選択したファイルの中身で判断すると言う事は可能でしょうか?

想定できる拡張子すべてにご自身で作成されたプレビューハンドラを割り当てて、
中身を判断してから表示する内容を変えるというのは可能です。


yTake  2014-08-15 14:56:08  No: 46606

すみません。反省しきりです。

先を急ぎすぎた面はあります。ただ、リンクやコメントをみても分からなかったり、誤解をしていたりと、、、(言い訳ですね)

結果として、ご迷惑をお掛けしました。ごめんなさい。
(いつも、真摯にRES頂き感謝しております)

>新しい拡張子のために自分で好き勝手に GUID を割り当てればいいのです。
>要は他の人が作ったアプリの GUID とカブらなければいいのですから。
そうなんですね。試してみます。

以後、少し落ち着いて進めてみます。


yTake  2014-08-15 22:43:51  No: 46607

色々とありがとうございました。
目的まで到達してはいませんが、おかげ様で、この項は一段落つける事ができました。
取り合えず、閉めさせて頂きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加