Delphi相談室(上級者用)その12

このエントリーをはてなブックマークに追加
928デフォルトの名無しさん:2005/08/01(月) 15:45:56
ファイルをPC外に持ち出されないように、
エクスプロラーで、「コピー」操作を
行った段階で、その事をDelphiから
感知する方法はありますでしょうか。
929デフォルトの名無しさん:2005/08/01(月) 15:47:22
ファイル システム フィルタ ドライバを書きましょう。
ttp://www.microsoft.com/japan/whdc/driver/filterdrv/default.mspx
ttp://www.amazon.co.jp/exec/obidos/ASIN/4774116661/250-6294777-6809015
なんのことだかわからないなら、無理です。あきらめましょう
930デフォルトの名無しさん:2005/08/01(月) 15:48:22
いわゆるクリップボード監視アプリでは似たようなことやっているけど、
ドラッグアンドドロップとか、ファイルダイアログでのファイル移動操作とかも考慮すると、
完全に防ぐのは難しい。
931デフォルトの名無しさん:2005/08/01(月) 15:57:00
satoといいます。
ファイルをPC外に持ち出されないように、
エクスプロラーで、「コピー」操作を
行った段階で、その事をDelphiから
感知する方法はありますでしょうか。
よろしく、お願いします。
Windows2000 Delphi6.0です。
932デフォルトの名無しさん:2005/08/01(月) 17:07:45
MLと2chでマルチする人も珍しい
933デフォルトの名無しさん:2005/08/01(月) 17:10:01
フィルタドライバってネットに資料全然ないな(英語では調べてないけど)
ファイルを暗号化して別ファイルとして保存、別のプログラムで復号したら
トラッキングするのはかなり難しくなりそうだけど・・・
難しいというか、面倒と言うべきかな
934デフォルトの名無しさん:2005/08/01(月) 18:21:04
929 であげた資料は日本語ですが...
普通の SDK の外の資料だからあまり読む人はいないのかもしれないけど、
プリンタドライバとかでも必要だから、読む人は読んでいるんだろう。

ファイルシステムを丸ごと作るわけではなく、ミニポートドライバを作るだけで
すむから、速度を気にしなければ COM が使える人なら簡単なんだけどね
935デフォルトの名無しさん:2005/08/03(水) 18:45:38
>>932
同じスレにもう一度投下する人もな
936デフォルトの名無しさん:2005/09/01(木) 13:39:09
すみません教えてください。
Win32APIのReadConsoleとか使ってコンソールアプリを作っているのですが
パスワード入力のところで、エコーバック無しで入力させたいのですが
どのようにすれば良いのでしょうか?
SetConsoleModeとか?いろいろやってみたのですがダメです。
937936:2005/09/01(木) 16:00:25
ありゃりゃ、このスレってよく見たら氏んでた?

Win32API質問箱でもいってくる。
マルチになるんでこの質問はスルーしてください。
938デフォルトの名無しさん:2005/09/01(木) 16:57:08
Delphiでコンソールってあんまりやらないからな
まあ、がんばってくれや
939デフォルトの名無しさん:2005/09/28(水) 20:37:06
DLL を使うアプリなんだけど、
もしDLLが無ければそのDLLを吐き出して終了して
次実行したらDLLが使えるというような仕掛けにしようと思うのだけど、
実行時動的リンク だと大量にある関数をいちいちポインタ表現するのが面倒
ロード時動的リンク だと、ロード時にエラーメッセージが出るのは良いとしても
その後の実行で SysInit InitializeModule 内でメモリアクセスエラーが出て強制終了されてしまう。

スマートな解決方法は何かあるかな?

案1、別の実行ファイルでDLLがあるかどうかだけチェックする・・・・結局格好悪いし普段の起動が遅くなる
案2、_InitExe を書き換えてしまう。 ・・・・これだけの為にはチョッと・・・
940デフォルトの名無しさん:2005/09/28(水) 20:58:53
DLLをロードする前にチェックするんじゃだめなのか?
941デフォルトの名無しさん:2005/09/28(水) 21:06:34
>>940
それは実行時動的リンクでしょ。
なにせ100近く関数があるから
全部の関数ポインタとを書くのは、ちょっと勘弁してくれって感じ。
・・・・でもそうするしかないか。

みんなどうしてるんだろ? 正規表現置換でやれば、それほどでも無いのかな?
942デフォルトの名無しさん:2005/09/28(水) 21:10:04
>DLL を使うアプリなんだけど、
>もしDLLが無ければそのDLLを吐き出して終了して
>次実行したらDLLが使えるというような仕掛けにしようと思うのだけど、
別に終了する必要はないし・・・そのまま動的リンクへ

>実行時動的リンク だと大量にある関数をいちいちポインタ表現するのが面倒
>ロード時動的リンク だと、ロード時にエラーメッセージが出るのは良いとしても
>その後の実行で SysInit InitializeModule 内でメモリアクセスエラーが出て強制終了されてしまう。
>スマートな解決方法は何かあるかな?
面倒でも動的リンクでいちいち記述するのが逆にスマートかも
943デフォルトの名無しさん:2005/09/28(水) 21:14:14
>>939読んで何かつっかかえていたんだが、ヘルプひっくりかえして思い出した。
Delphi for .NETには仮想ライブラリインターフェースっつうDLLの遅延ロードに便利そうなものが新設されてた。
まあ_InitExeなんて書いてるぐらいだから.NETはお呼びでないだろうが。
944939:2005/09/28(水) 21:33:59
今まで、実行時動的リンクする時は

procedure Hoge(hage:Integer);
begin
if assigned(pHoge) then Hoge(hage) else MyRaise( 'Hoge');
end;
こんな感じのを作ってたけど、
さすがにこれを100も書くのは無理。

それをあきらめて、直接間接コールさせれば、 正規表現置換で出来そう。

>>943 うん。 いまだにD5だし
945デフォルトの名無しさん:2005/09/28(水) 21:36:42
ロード時動的リンクでロードできなかったらDLLを吐いた後即座に終了して、
自分自身を再実行させるんではだめですか

再実行は終了直前に別のプロセスとして起動させるか
batファイルを吐いて実行させるか
946939:2005/09/28(水) 22:02:12
>>945
ロード時動的リンクはOSがまずエラーメッセージを出すみたい。

これはいいんだけど、

ロード時動的リンクに失敗すると、Delphiで作ったアプリは
その後のセットアップルーチン内でメモリアクセスエラー出してしまうんで
結局DLLを吐き出す事が出来んのです。
それには、スタートアップルーチンである InitExeを書き換えてしまうしかない


で結局
procedure Hoge(hage:Integer); stdcall;
 ↓
procedure RaiseHoge(hage:Integer); stdcall;begin MyRaise('Hoge');
type THoge = procedure (hage:Integer); stdcall;
var Hoge:THoge;

さらに

p=GetProcAddress(hModule, 'Hoge'); if p=nil then Hoge=RaiseHoge else Hoge=THoge(p);
とやれば、正規表現置換でなんとかなりそう

947デフォルトの名無しさん:2005/09/28(水) 22:35:32
なるほどね
ただLoader.exeの可能性も考えていいんじゃないか?
programからVCL抜きで小さいの作れば起動もそれほど遅くならないし
それはそれでスマートだと思うけど
948デフォルトの名無しさん:2005/09/28(水) 22:55:54
とか何とかやってる間に100個位書けるんジャマイカ
949デフォルトの名無しさん:2005/09/29(木) 00:14:36
要は実行タイミングが得られればいいんだろ?
もう一個DLL作って、それが最初にロード時リンクされるように
順番を調整して、そのDLLの中で目的のDLLの存在確認をとる
なんてのはどうだ?
思いついただけだが。
950デフォルトの名無しさん:2005/09/29(木) 00:27:09
それか、_InitExe直せるぐらいなら自己書き換えなんて楽勝だろ。
.exeでもDLL同様にエクスポートはできるから、
100個の関数をプロトタイプと名前を合わせた
ダミー関数として作っておいて自身のエクスポートテーブルに載せる。
あとは自身のエクスポートテーブルを参照して、
各関数と同名でGetProcAddressして、結果によって
ダミー関数の実体を書き換えてやれば…。
思いついただけだってば。
951デフォルトの名無しさん:2005/10/13(木) 18:33:55
procedure TForm1.Button1Click(Sender: TObject);
var
    Form2: TForm2;
begin
    Form2 := TForm2.Create(self);
    Form2.Show;
    Form2.Parent := self;
end;

こうして実行すると、チャイルドウィンドウとしてForm2が開かれます。
ここでForm2がForm1の範囲をはみ出すとForm1にスクロールバーが出ます。

その後マウスでForm2移動してを内側にした上でスクロールバーをクリックすると、
エラーが出ます。(スクロールバーはVerzとHorzと両方の場合のみ)

これって何でエラーが出るんでしょうか?
対策として、Form2が動いたときForm1のスクロールのアップデートをしようかと思っていますが、
どういうコードに
952デフォルトの名無しさん:2005/10/13(木) 18:39:47
MDIFormではダメなの?
953951:2005/10/13(木) 18:46:45
>>952
あ、その存在を忘れていました。


確かにMDIフォームならスクロールバーはリアルタイムに直されますね。

でも、ボタンの下にForm2が入っちゃう。
954951:2005/10/13(木) 18:55:57
やっぱりMDIフォームじゃない解決策お願いします。
955デフォルトの名無しさん:2005/10/13(木) 19:17:46
Form を Form に貼り付けるような厨房アプリなんてつくるなよー
956デフォルトの名無しさん:2005/10/13(木) 20:19:32
>>955
フレームがない頃はFormPanelなんてのがあったりしたなぁ。
今でもドッキングがあるし、普通じゃない?。
957デフォルトの名無しさん:2005/10/13(木) 21:26:27
なら、ドッキングさせりゃいいじゃない
958デフォルトの名無しさん:2005/10/14(金) 08:45:17
Frame もすでにあるし
959デフォルトの名無しさん:2005/10/31(月) 09:03:33
TPanelとか、回転できますか?
960デフォルトの名無しさん:2005/10/31(月) 12:08:10
そのままの形では回転できない。モニタ回すしかない。
961デフォルトの名無しさん:2005/10/31(月) 13:04:53
じゃあ、TPanelに回転機能を付けたコンポーネント希望。
ネットに落ちてないかな?
962デフォルトの名無しさん:2005/10/31(月) 13:10:09
>>959 >>961
ここってDel上級者用じゃないのか?
回転したいpanelのRectを部分の画像をコピーして回転させればイイじゃん。
それを別で表示
963デフォルトの名無しさん:2005/10/31(月) 13:18:05
>>961は自称上級なんだろ。
964デフォルトの名無しさん:2005/10/31(月) 13:27:12
>>959 はageたかっただけだろ
965デフォルトの名無しさん:2005/10/31(月) 13:37:41
>>962
その内容をコンポーネント化する方法きぼんぬ。
966デフォルトの名無しさん:2005/10/31(月) 13:46:39
画像を回転してもウィンドウを回転したことにならないよ
967デフォルトの名無しさん:2005/10/31(月) 13:48:28
TPanel は子ウィンドウなのでウィンドウとしての性質はOSが決めている。
だから真の意味では回転できない。
968959:2005/10/31(月) 13:49:35
ウィンドウ自体回転になってなくても良いです。

でも、TImage(おっと、今使ってるのTPanelじゃなかった、TImageのビットマップだった)の中の
ビットマップの人が回転してて欲しいでつ。
969デフォルトの名無しさん:2005/10/31(月) 13:52:46
イメージ 回転 Delphi でググル
970デフォルトの名無しさん:2005/10/31(月) 14:00:21
971デフォルトの名無しさん:2005/10/31(月) 16:03:11
Canvas.Pixels[X,Y]でアクセスすると激遅になるだろうし、
結構面倒だね。
972962:2005/10/31(月) 16:39:56
>>971
Scanlineで取る事ぐらいするだろww
973デフォルトの名無しさん:2005/10/31(月) 16:47:54
上級スレにしては回答も低級すぎだな
974デフォルトの名無しさん:2005/11/01(火) 01:28:21
煽れば教えてもらえるという考えは誤りです。
975デフォルトの名無しさん:2005/11/01(火) 15:17:59
2005でMSAccess2003で作ったdb1.mdbに接続したいのですが、
データエクスプローラでMSAccessに新しい接続を追加して
「接続の変更」でプロパティ画面見たいのを出して、
「Database」のところにdb1.mdbのパスを入力して
「Password」と「UserName」をくうらんにして
テストを押したのですが、
「接続が開きませんでした」とメッセージが出て接続できません。
誰かお知恵を貸してください。
976デフォルトの名無しさん:2005/11/02(水) 12:22:53
既にあるExeファイルのアイコンを書き換えようと思っているんですけど
どうすればできるのでしょうか?
Delphiに限らずどこかにサンプルとか落ちてないですかね。。。
977デフォルトの名無しさん
>>976
UpdateResourceでできるようです。