タイトル
執筆:2024.10.10
編集:2024.10.10
Delphi 12にアップグレードしたらAndroidのbuildができなくなった。
C++は13からサポート終了したそうですね。その終了理由 がわけわかめですが?
過去にKylix, .net のサポート打ち切りで信用できない開発言語ですので、とうとうきましたね
C++Builder: 削除された iOS と Android
RAD Studio Athens は、iOS 64 ビット プラットフォームと Android 32 ビット プラットフォームを削除しました。
そろそろ Delphi androidを Visual Studioに移植したほうがよさそうです。幸い1プロジェクトでcoplilot先生に手伝ってもらえば数日あれば移植終わりそうです。
近いうちに .NET MAUI に移植したいと思います。
とりあえず復旧できたの手順を書いておきます
現象
標準インストールしただけでは、不具合があり
SDK 基底パス, avdmanager.bat または androud.bat の場所, SDK APIの場所
が無効になっていて利用できない。
» Delphi12] アップグレードしたらAndroidのbuildができなくなった。'">続きを読む
タイトル
執筆:2024.10.10
編集:2024.10.10
iPhoneとAndroidを同時に開発できるクロスプラットフォーム開発ツール
を Copilot 先生に相談してみた。
.NET MAUI
.NET MAUI はオープンソースであり、Xamarin.Forms を進化させ、モバイルからデスクトップ シナリオに拡張したものです。
.NET MAUI アプリのサポート対象プラットフォーム LINK
新規プロジェクトを実行しただけでファイルが数千個できる(ファイル数: 2,275、フォルダー数: 1,182)。android apk 140MB.
🚫 ネットワークドライブに配置すると意味不明なエラーが表示されて実行できない。
📌 実行しないとページをビュジュアル編集できない変な仕様。
🚫[致命的欠陥] .NET MAUI XAML デザイナーは、Visual Studio 2022 ではサポートされていません。
Xamarin: [C#]
「Xamarin」は2024年5月1日に終了、「iOS 17」「Android 14」に対応せず
Xamarinは、C#を使用してiOSとAndroidの両方で画像の入出力を行うことができます。`System.IO`名前空間を使用してファイル操作を行い、`Xamarin.Forms`の`Image`コントロールを使用して画像を表示できます。
React Native: [JavaScript]
React Nativeも画像の入出力をサポートしています。`react-native-fs`パッケージを使用してファイルシステムにアクセスし、画像の読み込みや書き込みを行うことができます。
Flutter: [Dart]
Flutterは、画像の読み込みや書き込みを簡単に行うためのライブラリを提供しています。`Image`ウィジェットを使用して画像を表示し、`image_picker`パッケージを使用して画像を選択・保存することができます。
Unity: [C#]
主にゲーム開発に使用されるクロスプラットフォームエンジンですが、
iOSとAndroidのアプリ開発にも利用できます。3Dグラフィックスやインタラクティブなコンテンツに強みがあります。
» 続きを読む
タイトル
執筆:2023.10.28
編集:2023.10.28
Android11は仕様がかわり
画像は 各ストレージ直下の[ DICM と Pictures ]フォルダ内(その子フォルダ)でしか保存できません。
アプリの権限は、[ READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE ]が必要です。
またすべてのフォルダで画像を保存できるようにするには、'android.permission.MANAGE_EXTERNAL_STORAGE'権限を取得する必要があります。
マニフェストとコード(権限リクエスト)と両方記述が必要です
ContentResolver.insert
に渡す Uri は、
.getContentUri([定義済み定数|ボリューム名]) から取得します。
定義済みの Uri 変数定数を使うと メインストレージにしか書き込めません。(ここが皆がわからずに SDcradに書き込めないと はまっている箇所です)
使える 外部 volumeは、
"external_primary" , MediaStore.VOLUME_EXTERNAL_PRIMARY
"xxxx-xxxx"; // SDカードの場合は数値に置き換える
です。
MediaStore.VOLUME_EXTERNAL_PRIMARYの値は "external_primary" です。
Delphi などJAVA以外から操作する場合は、定数は定義されていないので 文字列を使ったほうがいいでしょう。
'xxxx-xxxx'は MediaStore.getExternalVolumeNames(context)で一覧を取得できます。
uri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
uri = MediaStore.Images.Media.getContentUri("external_primary");
uri = MediaStore.Images.Media.getContentUri("xxxx-xxxx");
uri = MediaStore.Files.getContentUri(volume);
のようになります。
SDCardは ファイルパスが
/strage/xxxx-xxxx/
になっています。
xxxx-xxxxは、メディアごとの識別子なので、別のカードやフォーマットすると変わってしまいます
ファイルパスは
メインストレージ: /strage/emulated/[ユーザーID:通常は0]/相対パス(可視領域)
外付けメディア: /strage/xxxx-xxxx/相対パス(可視領域)
ファイル名から取得する場合は、正規表現で ^/strage/([^/]+)/ にファイル名がマッチするか確認すればいいと思います
MediaStore.getExternalVolumeNames(context)のリスト値にないなら、メインストレージとか仮想メディアとか。
仕様が規格外の端末は相手にする必要はないと思います。
マッチしたらそれが ファイルの volumeです。getContentUriに渡す値になります!
ContentResolver.insert関数の結果で得た URIを
ContentResolver.openOutputStream関数に渡してオープンすると パスとファイルが作成されるので
存在しないフォルダの準備はしなくていいです。
フォルダを指定したい場合は、
ContentResolverに渡す値に, "relative_path" の項目で 相対パス(可視領域) を追加します
Pictures/子フォルダ/テスト.jpg に保存したい場合は
"relative_path"の値は "Pictures/子フォルダ" になります
タイトル
執筆:2023.10.26
編集:2023.10.26
Android11
アプリから外部MicorSDカード領域に保存した画像がMediaStoreに登録できません!
getContentResolver().insert
EXTERNAL_CONTENT_URI
Requested path doesn't apper under [/storage/emulated/0]
なぜ emulated/0 にパスを勝手に変更しているの?
内部のユーザー領域なら正常に実行できる。
外部MicorSDカード領域のパスの場合上記のエラーになる。
フラグは、2種類しかないし INTERNAL_CONTENT_URI は、違うし。
ほかにフラグが増えたとか?
EXTERNAL_CONTENT_URI: The content:// style URI for the "primary" external storage volume.
ほかのアプリ(ファイラーだと)で名称変更でするとMediaStoreに上がってくるので APIレベル指定の違いかな?
古いアンドロイドならOKなのかな?
なにか互換性の設定がいるとか?
よくわからないので別の古い端末で動作確認してみよう。
追記
解決しました
Androidサイトのヘルプにも記述がないから苦労した。
ネットにも情報ないし、みんな迷走してSDCardへの保存が使えないと思い込んでいる模様。
getContentUri([定義済み定数|'ボリューム名']) です。
SDカードは、ボリューム名を入れます。ボリューム名は、getExternalVolumeNames関数から取得できます.
getExternalVolumeNames関数の結果
external_primary : 本体に保存する場合
4桁数値-4桁数値 : SDカードに保存する場合
LContentUri := TJImages_Media.JavaClass.getContentUri(StringToJString([定義済み定数|ボリューム名]));
// 'external_primary' or '4桁数値-4桁数値' : Android11
// 'external' : 古いAndroid
LJNewURI := TAndroidHelper.ContentResolver.insert(LContentUri, LJContentValues);
if (TJBuild_VERSION.JavaClass.SDK_INT >= 29) then // (Android10 API 29) // MediaStore.VOLUME_EXTERNAL_PRIMARY : Constant Value: "external_primary" LVolume := 'external_primary' else LVolume := 'external'; // LVolume := 'xxxx-xxxx'; // SDカードの場合は数値を書いて有効にする LContentUri := TJImages_Media.JavaClass.getContentUri(StringToJString(LVolume)); //LContentUri := TJMyAndroidUtils.JavaClass.getContentUriFromFilename( // TAndroidHelper.Context, StringToJString(LContentFilename)); ShowDebugMessage('ContentResolver:Uri:' + #10 + JStringToString(LContentUri.toString()));
» 続きを読む
タイトル
執筆:2023.10.23
編集:2023.10.23
[Delhi11 BUG] パス情報がない OpenPictureDialog1.FileName
再現方法
Windows11でAndoroidデバイスを接続して、AndoroidデバイスのSDカード内のファイルを選択する
OpenPictureDialog1は利用できないフォルダも表示されるので選択後に拒否する
LFileName := OpenPictureDialog1.Files[0]; if Pos('\',LFileName) = 0 then begin ShowMessage('ドライブ情報が取得できないため操作できません。'); Exit; end;
テキストなどを編集を選択すると
AppData\Local\Microsoft\Windows\INetCache\IE\**
に飛ばされる
エクスプローラーに表示されているドライブ情報自体が実在しないフェイクみたい
アンドロイドアプリ作ったことないので急遽Windowsアプリでしのごうと数時間で作ったのに
アクセスできない つかえなーい!!
いちいちAndroidからSDカード抜かないと操作できないので、どうしよう
・却下:ネットワークドライブに移動。 一番無難かもしれないが勝手にパケ食いされると困る。
・(めんどう):Andoridアプリ作る
とりあえず、電源切ってSDカードを移動して対応しよう。
昨日の夜 頑張って作ったのにショックだ!!
» 続きを読む
タイトル
執筆:2023.08.30
編集:2023.08.30
Lazarus lazreport の 超絶シンプルサンプル1 です。
Delphi 11を起動して パレットにreport検索してもでてこないですね。現行バージョンはレポート付属していないのでしょうか?
ということでレポートが付属されているLazarusへ 全部もしきはレポート部分だけDLLで移行しないといけないケースが発生しないとは限らないため使い方を確認することにしました。
Delphi からの移行でlazreportの使い方がわからないであきらめたというページを目にしたので
lazreportの超絶シンプルなサンプルを紹介します。
テンプレート形式でファイルを保存するようなので Raveレポート に似ていますね。
以下は超シンプルなサンプルです。
(1) 新規プロジェクトを作成してください
※事前にlazreportを有効にしてパレットにインストールしておいてください。
(2) TButton 2個, TfrReport をフォームに配置します。
(3)フォームに配置した frReport1 を右クリックして「デザインレポート」を呼び出してください。
テンプレートをフォームに埋め込む場合は、 frReport1.StoreInForm をtrueにしてから次の作業をしましょう。
その場合は、コードのfrReport1.LoadFromFileの読み込み部分は必要ありません。
(3-1) オブジェクトインスペクタを表示します。
[レポート編集画面です]
Tools : Toolbars : Object inspector をチェックして表示させます。
オブジェクトを右クリックしてもこの項目はでてこないため、これがないと話になりません。
使い方がわからないという記事を見かけたので多分これが原因でしょう。
(3-2) 左の縦ツールバーの「矢印のすぐ下」の 「rectangle object」挿入をクリックして右の画面に配置します。
(3-3) Closeを選択して、テンプレートを保存してください。
そのまま保存すると'Untitled.lrf'という名前になります。
(4) フォームのボタンをクリックします。コードを書き込んでください。
(5) frReport1のイベントOnBeginDocをクリックします。コードを書き込んでください。
procedure TForm1.Button1Click(Sender: TObject); begin // プレビュー frReport1.LoadFromFile(ExtractFileDir(Application.ExeName) + DirectorySeparator + 'Untitled.lrf'); frReport1.ShowReport; end; procedure TForm1.Button2Click(Sender: TObject); begin // 印刷 frReport1.LoadFromFile(ExtractFileDir(Application.ExeName) + DirectorySeparator + 'Untitled.lrf'); // プリンタの設定を開きたい場合はここに処理を加える if frReport1.PrepareReport() then frReport1.PrintPreparedReport('1', 1); // ページ範囲, 印刷数 end; procedure TForm1.frReport1BeginDoc; var AfrObject : TfrObject; begin AfrObject := frReport1.Pages[0].FindObject('Memo1'); if Assigned(AfrObject) then AfrObject.Memo.Text := 'こんにちは'; end;
準備完了です。
実行してボタンをクリックしてください。
レポートの出来上がりです。
簡単でしたね!
テンプレートを埋め込む場合は
・frReport1.StoreInForm をtrue
・リソースとして保存してStreamからロード
などの方法があります。
組み込みのプレビューが 英語表記なので、
lazreport\source\languages\に日本語に該当するlr_const.ja.poがないためです。
いつの間にか数年前?数十年前?から「プチモンテ
Delphi ・Lazarusの掲示板」がIDEの翻訳担当しているそうなので
日本語のLazarus掲示板に注文出せばだれか暇人が翻訳してコミットすると思います
組み込みのプレビュー
・英語表記
・文字サイズとアイコンがかなり小さい
・デザインが古臭い 時代を感じる
ので自分でプレビューフォーム作ったほうがいいような気もします。
2023年 旧
Delphi (Borland時代) を捨てる!?
執筆:2023.08.18
編集:2023.08.18
Windows10で表示不具合を起こすので旧
Delphi のアプリを
Delphi 11にアップグレードすることに決定。
アップグレードによるコード修正が大変なんだろうなぁとずっと敬遠していて
問題になったプロジェクトをリポジトリに入れてバックアップして、フォルダもコピーして
試しに実験してみると、 無修正でバージョンアップ完了。
表示不具合も同時に解消。
もー 旧
Delphi (Borland時代) のアプリはゴミでしかないです。
生成アプリの動作OS
Delphi 2 : Win 95 以降
Delphi 6 - : Win 98 以降
Delphi 11 : Win vista 以降
現在 サポートされているOSは、Windows10,11しかないので
これって、実害ないですよね。あと2年でWin10も終了です。
というかいろいろな不具合を持っている旧
Delphi の生成アプリはデメリットしかないです。
修正の必要が発生したら、バックアップとプロジェクトアップグレードをすればいいだけなので、旧
Delphi は必要ないです。
Delphi 最新版の無料版だと
・生成されるEXEが超デカイ
・最短1年程度で再インストールになるのが欠点。
・無料でつっておいて、気まぐれで昔のように無償版終了とかいうのもあるかもしれない。
そういうリスクも含めてアップグレードしよう。
ヘルプファイルが昔のは例文も同梱されていてみやすかったりするので、捨てがたい状況でしたが
2023年技術革新により時代は変わり、BING先生やCHATGPTでコード聞けば解決するので もういらないでしょう。
今日は、さっそく
Delphi 2 -
Delphi 6無料版をパソコンからアンインストールすることにします。
Delphi 2005は、
Delphi .Netのアプリ(小規模)がいくつかあるので C#に移植してからアンインストールする予定です。
ちなみに、Lazarusという まがい品があるようですが、UTF8KeyPressで絵文字の場合イベントが発生しないなどの不具合、その他もろもろあるようなので、使わないほうがいいですよ。開発⇒バグ足止め⇒バグ足止め⇒バグ足止め(ループ) と 時間をどぶに捨てるだけです。
Delphi 11 [CE]
新しいファイル
移行後不要
プロジェクト
ファイル
.dproj
.bdsproj
.bdsproj.local
.dof
.cfg
制限で使えないので不要
バージョン情報とか正しくインポートされていないので、手動確認後に不要なファイルは消去しましょう
Windows 10は、 2025 年 10 月 14 日 にサポート終了を迎えます。
Windowsのサポートは9~10年と既成事実は変化ないので、
Windows11は、推定終了日: 2032年1月13日か2031年10月14日 じゃないかと思っています。
» Delphiを捨てる!?'">続きを読む
タイトル
執筆:2023.08.16
編集:2023.08.16
Borland時代のDelphi で作ったアプリはWindows10で表示の不具合などいろいろ問題を起こすので
Delphi 11へサクッと移行したほうがいいです。
普通にコード書いてるだけなら無修正でコンパイル通って移行できると思います。
プロジェクトオプションの PEのバージョンを 既定値の6.0から 5.0 にするとXPでも動作します。
PE 6.0 vista以降
PE 5.0 XPなど
JCL 2.8 [master]
JCL 2.1
Delphi 6
OK
OK
Delphi 2005
Error ❌
(Delphi 内部バグ)
- jvcl3_39 jcl2_1
Delphi 11
OK
Windows ME,XP, VISTAなんて使わないでしょ。
古い
Delphi はプロジェクトアップグレードして
古い
Delphi と すっきり お別れしよう!!
Delphi 無料エディション1年だからと敬遠しているあなた。
生成したexeもリポジトリにいれておけば問題なし。
新規プロジェクトは断然 Visual Studio をお勧めします!!
それいけ ドット ネット
» Delphi jedi version'">続きを読む
Bing 作成 超すごい /
Delphi でこんにちは
執筆:2023.04.18
編集:2023.04.18
Edgeを起動します
右隅の上にある【B】マークをクリックします。
チャット 作成 分析情報
とあるので 作成をクリックします
下記の内容を書き込んで、ボタンを押すとなんとすごいわかりやすい解説が出来上がり。
これは、執筆時間短縮になると思いますね。
Bing 作成機能
執筆分野
Delphi 言語でこんにちはをボタンクリックで表示するコードを書いてください
トーン
熱狂的
形式
段落
長さ
長い
[下書きの生成]
» Delphi でこんにちは'">続きを読む
タイトル
執筆:2022.10.17
編集:2022.10.17
git 空フォルダを含める
gitは空フォルダに対応していないため下記の方法で1ファイルコミットします。
フォルダの中身は不要の場合
.gitignore
*
!.gitignore
フォルダの中身を後から追加する場合
.gitignoreで 個別対応できないような場合は、適当な空ファイルを追加しておく
.gitkeep 慣例的な名前らしい
どういう場面に必要か?
コンパイラがフォルダを自動生成できないような場合に必要。(
Delphi など)
rustをインストールしてみた
執筆:2022.09.26
編集:2022.09.26
GoogleはKotlin という言語や低レベルはrustにシフトしているらしく、GoogleのGo言語は、オワコンらしいのですね。
rustもオワコン説もありますが
開発元がmozillaというのがマイナスイメージ、ダメ実装ポイ雰囲気なので長年無視していましたが、最近大手が基幹システムに採用しているということで再注目を浴びているようなので、地位が確立し当面消滅はしないだろうということで触ってみることにしました。
初見
とにかく、rustの他人のコードは読みにくい。
はぁ? っていう感じですね。変な記号だらけで 頭をグルグル ブドウ糖消費しまくって 考えないと理解不能です。
考案した人パズルが好きなのかな?意地悪い性格じゃないかな?
人が読みやすい、わかりやすい構造考えようよ
mod 普通この分野のmodは 割り算のあまり だろう、 moduleを略すなよといいたい。
fnもそう 普通に functionやfuncでいいのに。
度が過ぎる省略は逆に生産性を低下させる。
変な略しているのに、他はたらたら長文、設計思想がめちゃくちゃ。
変なとこで略すと無意識に頭で変換で脳細胞がいくつかが痛むし養分減るからからほんと勘弁だよ
phpみたいに零細企業のアプリ ハカイダーみたいなのがOSSコード破壊するのがいるので、RUSTだとレベルが一定以上必要になるので
読みにくい考える仕様にすることで結果としてバグが減ることに貢献するとは思う。
ただ度が過ぎるとみんないなくなる。
他人のコード読みにくい = メンテナンス難
気になるところは、go言語と同じく外部ライブラリだよりで、バンドルではないのでライブラリのセキュリティや将来性(アップデート)、安全性に疑問が残ります 。
言語の例外を実装しないのが最近の流行り?
webで情報収集して概要はつかんだので
公式のdocを読みます
変数関係はすぐに理解できました。
その他が問題ですね。へんてこりんな記号だらけで、何がしたいのやら。
.is_ok()
.unwrap
Result値がOk列挙子なら、unwrapはOkの中身を返します。ResultがErr列挙子なら、 unwrapはpanic!マクロを呼んでくれます。
は?
そんなもの用意するなら最初から例外実装しなさいよ。
エラーで実行止めるわけないだろ。設計したやつばかか?
アプリ終了か終了おすまでエンドレスだろ普通。
rustのコードみたらunwrapだらけ
delphi だと通常 try exceptで例外起きそうな場合は全部例外封殺するので
個人的には、なくてもいいかもと思ったりもしますが
完全にないとなると気持ち悪いですね。想定外のところをスルーされると怖いですね。
というか戻り値にエラー処理強要するなら例外を実装しろといいたい。
.unwrapとか 苦し紛れに後から実装したのでしょうか?
説明書を見ながら標準ライブラリを何か普通に使おうとしたら
error[E0658]: use of unstable library feature
は? いやいや 仕様 糞すぎるでしょ
コアをフォークして自分色に染めようかと一瞬おもったくらいですよ
それはいいとして
実行ファイルがデカイ!
printしただけで 5MB。
うーん。ですね。
スタンドアロンならいいですが、webだとレスポンスに影響するので読み込みサイズは小さいに越したことはないです。
stripコマンドで少し小さくできるそうです
もやもやしますが SSDの時代なのでこれも気にしないことにします。
ということで、コンパイラをインストールして、サンプルのこんちにはを試して終了となりました。
サンプルだけなら、インストールしなくても 公式サイトのデモページで実行できます。
今のところバッファオーバーランを起こすようなアプリないですし、そういうのは、すべてC#とかdelphi とかスクリプト言語でかけば発生しませんしね。
低レベル操作やREST APIを
クロスコンパイルしたい場合は、便利かもですが、
rustの使い所が現在ないです。
WEBで使いたい場合は、
https://docs.rs/cgi/latest/cgi/
https://docs.rs/cookie/latest/cookie/
https://docs.rs/formdata/latest/formdata/
webフレームワーク を使いたい場合は
axum
actix-web
国際化は
https://docs.rs/rust-i18n/latest/rust_i18n/
や
https://docs.rs/gettext/latest/gettext/
リソース組み込む場合は、
https://docs.rs/resource/latest/resource/
このあたりを使えばサクッとかけるのではないでしょうか。
練習に小さいプロジェクトを移行するのもいいと思いますが
慣れた言語でサクッと短時間で書いたほうがストレスがなくていいですね
» 続きを読む
Windows ホストにDNSサーバーを立てる
執筆:2021.07.18
編集:2021.07.18
編集:2021.11.19
編集:2021.12.5
注)2021-11-19
DNSサーバーを立てると WSLサービス Ubuntu、docker が利用できません。
エラー: 0xffffffff
Press any key to continue...
参考:WslRegisterDistribution failed with error: 0xffffffff #4364
https://github.com/microsoft/WSL/issues/4364
DNSサービスは、別マシンに作ったほうがいいかもです
注)2021-12-5
Atermの上位機種のルーターにDNS機能がないので、まさかの買い替え前の低速の低価格のほうのルーターに「DNSルーティング設定」という簡易DNS機能が搭載されていました。
Aterm
買い替え前
のAterm
(脆弱性あり:
メーカー未対応)
脆弱性問題解決
と高速化のために
数年前に買ったルーター
Aterm WG1800HP4
簡易NAS
〇
×
DNSルーティング
〇
×
中継機能/子機モード
×
〇
付属品:USB子機
〇
×
速度 WIFI
300Mbps
1300Mbps
450Mbps
速度 有線
1000Mbps
1000Mbps
WIFIバージョン
WIFI4
WIFI5
WIFIの脆弱性があるのでセキュリティ的に問題がありますが、古いルーターから wifiを飛ばせば、簡単に名前解決でき、スマホ、タブレットでプライベートドメイン名でアクセスできました。
必要な時だけ電源いれて、出力を12.5%に絞っているので外にはほとんど漏れていないと思います。
いろいろ触ってわかったこと
中継機能/子機モードは、WIFIを使ったブリッジ接続で、中継機能/子機モードの違いはWIFIのアクセスポイントの有無だけ。
親機がスマホの場合、中継機能/子機モードは、DHCP機能がなくなるので、任意の固定プライベートIPを割り当てるには もう1個ルーターを挟む必要がある。
「DNSルーティング設定」がある最新のルーターに買い替えれば、脆弱性も含めて解決ですね
来年以降、WIFI6の安くていいのがあれば買い換えてみようと思います。
手持ちのルーターで解決できる問題でしたので
WSL2と競合するのでWindowsのDNSアプリは撤去しました。
Aterm WG1800HP4は、先日解約したトリオモデムと相性が悪く、NECサポートに問い合わせて教えてもらった設定にしないと 不定期にインターネット未接続になる(WAN端子切断)現象があったので、
また次のプロバイダでAtermでデフォルト設定で接続できないとか発生すると、目から涙になるので
WIFIルーターは脆弱性問題で長く使える製品ではないし
今度は、お試しで 他のメーカーにしようと思います!
C:\WINDOWS\SYSTEM32\DRIVERS\etc\hosts
/etc/hosts
に設定を加えていましたが管理が面倒です
https://www.nic.ad.jp/ja/newsletter/No22/080.html
> HOSTS.TXTからDNSへ
なるほど私は原始的なことをしていたわけですね 😅
ホストOSのほうは、コメントを入れたりしているので、手書きでいいのですが
ゲストOSにもドメインと固定IPを割りあてているため毎回入力更新はとても面倒です。
ゲストOSは、ホストのDNSサーバー指定するだけで解決するので
アプリで管理したほうがいいかも
ということで、検討に入りました。
アプリで対応する場合
・Windows付属のDNSサーバー
(Windows Serverを持っていないので詳細不明)
・WSL2のゲスト内のDNSサーバー
・仮想マシンのゲストOSのDNSサーバー
・DNS専用 Windowsアプリ
機材で対応する場合
・DNSサーバー機能のあるなんらかの端末
ルーター、NAS、パソコンなど
フリーアプリは、余計な機能があると思うので、自前で調達。
さて、3分クッキングで完成できるのがありますよね。
TIdDNSServerを貼り付けて、入力して、Buildしたら完成。
カップラーメンより早い出来。
設定値をディスクに保存する場合は、書き込み権限などセキュリティを意識しないといけないし面倒。
設定値を変更したい場合は、コードを直接修正してアプリを再構築すればいいでしょう。
とにかく複数のこまかい管理は したくないのです.
取り合えず、下記の仕様で暫定運用してみようと思います
・アプリの多重起動を禁止しておく
・一定周期で、ホストOSのhostファイル更新時刻を確認する
・ホストOSの hostファイルを読み込んで、192.168.* の設定を取り込む
# private IP address
# 10.0.0.0 10.255.255.255 10\.
# 172.16.0.0 172.31.255.255 172\.(1[6-9]|2[0-9]|3[01])\.
# 192.168.0.0 192.168.255.255 192\.168\.
・不足分のドメインリストをアプリで設定する
一度構築してしまえばアプリは、ほぼ無管理で運用できそうな予感
セキュリティ対応のDNSにしないとよくないらしいですが、ルーター管理のローカルネットワーク内だから大丈夫でしょう。
» 続きを読む
Delphi 2.0を64ビットWindowsにインストールするには?
執筆:2019.05.14
編集:2019.05.14
インストーラーが 16ビットアプリのため 64ビットのWindowsでインストーラーを起動すると
このアプリはお使いのPCでは実行できません
と表示されます
スタートアップと圧縮を展開するためのアプリが16ビットのため起動できません。
しかし、32ビット用のインストーラーは圧縮して同梱されているので、それを取り出して呼び出すことでインストールが可能になります。
作業手順
インストールメディアから32ビットインストーラーを取り出します
CDROMにINSTALL というフォルダーがあるのでUSBなどにそのままコピー します
32bitのWindows で INSTALL\setup.exeをクリック します
次へを押すと、インストールに必要なファイルのコピーが始まるので、少し待ってから
CTRL + TAB で フォーカスをエクスプローラーに切り替えます
エクスプローラーのアドレスに %temp% と入力しリターンキーを押します
%temp%フォルダー内に「_INS0432._MP 」というファイルがあるので
(1)の 「install」フォルダーにコピーし、名称をsetup32.exeに変更します。
「_INS0432._MP 」→「setup32.exe 」
インストーラーに戻り、インストールの中止をクリックし終了します。
これで 64ビット対応のセットアップ準備ができました。
64ビットWindowsにDelphi 2をインストール
インストールしたい64ビットWindows で
(1)のフォルダーの setup32.exe をクリックします。
★ 64ビットWindows10で
インストールとアンインストールを行い正常に動作したことを確認しました
★ BDEも動作することを確認しました
デモのFISHFACTをコンパイルし実行
スタートメニューへの登録は、失敗するため、
Delphi 2.0へのショートカットは自分で作成する必要がある
Delphi に限らず、同様のエラーが発生するインストーラーに対しても有効な方法です。
» Delphi2.0を64ビットWindowsにインストールするには?'">続きを読む
普段使っているアプリを
Delphi 10.2で再構築すると
3倍のサイズになりとても大きくなりました。少しの修正が必要でした。
531KB
Delphi Win32
2555KB
Delphi 10.2
©や🍮とか入力できるようになったのでいいとしましょう。
対応していない場合は c ?? となります
同じものを .netで作るとおそらく 20-30KBくらいではないかと思います
2時間あれば、.Netへ移植できそうなアプリなんですけど、困っていないし、面倒ですからね。
移行に関して、
RegExpr → RegularExpressions
PAnsiChar → PWideChar
他数点
の変更が必要でした。
» Delphi10.2 Unicode に移行してみた'">続きを読む
#error ディレクティブ
delphi
コンパイル
C/C++
C#
Delphi
停止
#error メッセージ
{$Message Fatal 'メッセージ'}
継続
#warning メッセージ
{$Message Warn '警告だよ'}
{$Message Hint 'ヒントだよ'}
{$Message Error 'エラーだよ'}
#pragma message("")
{$Message Hint 'ヒントだよ'}
{$Message Warn '警告だよ'}
{$Message Error 'エラーだよ'}
{$Message Fatal '致命的なエラーだよ'}
{$IF CompilerVersion > 18.5}
{$Message Fatal '
Delphi 2007 for Win32 以前のバージョンを使ってください'}
{$IFEND}
{$IF CompilerVersion < 20.0}
{$Message Fatal '
Delphi 2009 (Unicode版)以上を使ってください'}
{$IFEND}
{$IF CompilerVersion < 32.0}
{$Message Fatal '
Delphi 10.2 Tokyo (VER320)以上を使ってください'}
{$IFEND}
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/
Delphi コンパイラ指令のリスト:インデックス
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/MESSAGE 指令(
Delphi )
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/コンパイラ バージョン
Delphi のプロテクションツール (メモ)
Delphi に引きこもらないで、すばらしいVisual Studioの良さを確かめてほしいです。
Visual Studio 2017,2015 Communityは、制限なしの無料ですからね。
なれた環境でチャチャチャと高速リリースするのは戦術としては有効ではありますのでDelphi の否定はしませんが
脱Object pascal言語を推奨しています。
それいけ、 Visual Studio !!
Windowsストアアプリにしてしまえば、販売も期限や制限もマイクロソフトが管理してくれるので完全自動販売機化できます。 ついでにマルチデバイス対応してしまえば、iOSやAndoridからの収益も
さらにさらに、国際化すれば相乗効果でもっともっと売り上げがアップするかも
というとこで、デスクトップでちまちま制限をかける時代は、
パッケージ製品や特定の業務に特化したアプリ以外では終焉を迎えつつあります
Windowsストアアプリは、無料版
Delphi では作れません。
(参考リンク)
Delphi / C++Builder で Windows 10 ストアプリ制作
開発側 RAD Studio / Delphi / C++Builder Berlin 10.1 Update 2以降
購入者側(ユーザー端末)にWindows 10 Anniversary Update以降
が必要
でも、
VidualStudioなら完全無料でWindowsストアアプリがつくれ
しかも開発環境由来のバグに見舞われることがほぼないので、開発に専念できます 。
某開発ツールとは大違いです
ただ問題点があって、VidualStudioだと付属ツールで逆コンパイルができてしまうので難読化処理が必要になります
Delphi
Vidual Studio
マルチデバイス
有料版
無料
Windowsストアアプリ
有料版
無料
難読化
ターゲットによる
基本的に必要
難読化
.Netアプリ
基本的に必要
備考
Delphi
?
Win32ネイティブバイナリの場合は任意
(Delphi .Netは必要)
不明
Android
基本的に必要
Android SDK に含まれている
Proguard
proguard.cfg
-keep class クラス名 { *; }
iOS
不明
不明
amazonアプリの設定(
コードの難読化 )
アプリ側で旧形式の制限をかけたい場合
* フリー
TurboPower
OnGuard
使っていないのでなんともいえませんが無料だそうです
* ○○××の市販ツール
10万円もするそうです。昔は3,4万円だったような気がします。
Delphi 言語ユーザーが激減したこと
アプリマーケットの影響で需要がめっきりなくなったこと
が価格上昇に反映されていると推測されます。
はじめよう Windows ストア アプリ (メモ)
Delphi FileSize ファイル名指定
function FileLen(const AFilename: WideString): Int64;
var
info: TWin32FileAttributeData;
begin
Result := -1;
if NOT GetFileAttributesExW(PWideChar(AFilename), GetFileExInfoStandard, @info) then
EXIT;
if (info.dwFileAttributes AND FILE_ATTRIBUTE_DIRECTORY > 0) then
EXIT;
// raise Exception.CreateFmt('Can not get file size : %s', [AFilename]);
Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
end;
function FileSize(const AFilename: WideString): Int64;
begin
Result := FileLen(AFilename);
end;
標準の関数ではファイルハンドルが必要で、この関数は直接ファイル名を指定できます。
また、標準の関数では32ビット整数のため大きなサイズのファイルを正しく返せない不具合を起こしますがこの関数は64ビット整数で返します。
Unicodeファイル名対応です。 AnsiString,stringをいれても自動型変換が行われるので、SHIFT_JISファイル名でも動作します。
戻り値:
成功した場合は 0以上
失敗した場合は -1
の値が返ってきます
Delphi 10.1 Berlin Starterは使いにくい
デバッグ時のローカル変数一覧 : なし
定義の検索: ジャンプしない
リファクターがない
データベース使えない
ハイ!!
ということで
無料の フル機能の Microsoft Visual Studio のほうが1万倍?1億倍くらい いいです。
アプリは、Dephiから無料のマイクロソフト製品へシフトしよう!!
バグから解放されて生産効率 超アップ!!
Delphi 2.0 ロゴ画面で止まる Windows10
症状
2016年4月は、Windows10で起動していました。
2017年2月に起動するとロゴから起動しなくなっていました。
原因:
おそらくWindows10のメジャーアップデートもしくはセキュリティソフトが原因です
一時的な対処方法 Workaround
(1) bin\CMPLIB32.DCL 名称変更. CMPLIB32-.DCLなどなんでもいい。
(2)
Delphi 2.0 を起動します
次のエラーが表示されるのでOKをクリックします
Cannot open component library C:\Program Files\Borland\Delphi 2.0\BIN\CMPLIB32.DCL (error code 126).
(3) (1)のファイルを元の名前に戻します
(4) コンポーネント - ライブラリを開く をクリックします
(5) bin\CMPLIB32.DCL を選択します
(6) コンポーネントがロードされ、一応動作可能になります
※ (1)と(3)はレジストリ変更でも同様のことができます。
※ 次回起動するとロゴで停止するので、毎回処理が必要です。
一時的な対処方法 Workaround その2
QuickReportがいらない場合は削除することで回復することができます。
CMPLIB32.DCLのバックアップを忘れずに、(QuickRepoのREG.pasがないため)
(1) タスクマネージャーで フリーズした
Delphi 2 を強制終了する
(2) コンポーネント読み込めないように 名称変更する
C:\Program Files\Borland\
Delphi 2.0\BIN\
CMPLIB32.DCL
を
bin\CMPLIB32-.DCL
に変更する
(3)
Delphi 2を起動する
起動しない場合は、ほかの原因
(4) コンポーネントを読み込む
コンポーネント - ライブラリを開く (2) のファイルを選択する
(5) ライブラリの編集:問題のコンポーネントを削除する
(5-1) コンポーネント - インストールをクリック
インストールされた ユニット
「QuickRep」を選択し削除する
(5-2) 次に ライブラリ名を CMPLIB32.DCL にして
(5-3) OKをクリックする
(6) IDEを再起動してみる
問題なければ起動ができるはず
Windows10で動かすための,そのほかの確認事項は以下の通りです
(1) 現在ログイン中のユーザーにフルアクセス権限に設定するには、
icacls "C:\Program Files\Borland\
Delphi 2.0" /grant %USERNAME%:F /t /c /l /q
(2) C:\Program Filesは、Windows VirtualStoreが管理しているのでそちらも念のため確認が必要です。
を
Windows VirtualStoreを無効にする も参考にしてください
(3) HKEY_CURRENT_USER\Software\Borland\
Delphi \2.0\Library
ComponentLibrary
SearchPath
キーワード
Delphi 2.0 ロゴ画面で止まる Windows10
Stop on the
Delphi 2.0 logo screen
vcl120.bpl(.bplファイル)がフォルダにあるので
Smart Deflagは、えんばかでろのRAD Studioでビルドされています
vclのパッケージバージョンが120は、RAD 2009なので
C++Builder 2009 または Delphi 2009 のどちらかでビルドされています。
webbrowserコントロールのUserAgentの設定方法
設定しない場合は、IE7となるので注意。
オプションには、レジストリを書き換えるオプションもあります。今回は割愛。
Delphi 言語
TWebbrowser
// uses UrlMon;
// const USERAGENT_IE11 = 'Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko';
function SetUserAgent(AUserAgentText : string) : boolean;
begin
Result := (S_OK =
UrlMon.UrlMkSetSessionOption(URLMON_OPTION_USERAGENT,
PChar(AUserAgentText), Length(AUserAgentText), 0)
);
end;
opencvは処理が遅い
存在を忘れていたのでHPにアクセスすると
最新版が opencv-3.1.0
になっていました。
まったく記憶にないのですが、ハードディスクの倉庫には2系列のメモが保存されていて
画像の検出(初級).txt
遅い原因と高速化する対応方法が.txtファイルで詳細に書かれていました。
現在,存在を忘れて使っていない原因はファイルサイズの大きさでしょうね
10MBくらいのライブラリならアプリに組み込みますが400MBはチョットね
ゴミ でしょ。
HDDに自作の画像簡易マッチライブラリがあったのできっとあきれてそっちに走ったのかな。
遅い主要な原因は、ですね、Mat形式以外はいちいちテンポラリファイルが作られているかららしいですよ
version 3系列は試していないので知りませんけどね
(残念ながら 32bit版は配布されていませんでした)
このライブラリを使う必要がある場合は、C++でコードを書くほうが労力が少なくていい。
link
http://opencv.org/
ライブラリが落ちているところ
Delphi XE5 で OpenCV を試す
http://blogs.embarcadero.com/teamj/2014/02/18/4264/
Delphi から利用
呼び出し部分は C++で書いてDLLで連結したほうが無難
» 続きを読む
最小化後に復元するとフォームサイズが変更される
Delphi で生成したアプリで
Windows8.1のみで 時々 発生するようです
git と fossil の比較 git vs fossil-scm
結論をいいますと
* 現段階で,gitからfossilへの移行はしないほうがいいです。
fossilには、ブランチ、タグの削除・抹消機能はありません。
改行コードが絡む場合は、 git を使うほうがいいでしょう。
fossilには、cr-lf 変換機能は ありません。
商用のプログラミング言語には、 LF改行だと
// コメント行
を正常に処理できないものがあり、意図しない動作となります
2015/12
fossil
git
svn
料金
無料
無料
無料
リポジトリ
ファイル1個
フォルダ .git
ファイル多数
フォルダ
ファイル多数
改行
コード変換
なし
あり
あり
ブランチの削除
不可※
可能
可能
空フォルダ
不可
日本語メニュー
なし
あり
あり
わかりやすさ
×
×
△
操作性
×
◎
◎
処理速度
◎
△
○
競合ファイルの処理
GUI
×
◎
◎
可搬性
ポータビリティ
◎
△
×
ライセンス
個人著作物
(2-clause BSD license)
GPL
Apache License
将来性(開発の継続)
△ (?)
◎
◎ (?)
20年後(Windows)の動作
Windowsは下位互換性が非常に優れているため、.netランタイムライブラリを使っていない場合は、将来的に動作で問題を起こすことはまず発生しない。
◎
◎
◎
20年後(Unix系)の動作
〇 (未知 ?)
static build-inの単一ファイルなので問題を起こす要素がない
未知 ?
未知 ?
» 続きを読む
EditorLineEnds.ttr を作成できません。
結論
起動前に1個キャッシュファイルが消えればいいだけでしょ。
bds.bat作って解決。
» 続きを読む
C:\Program Files\Borland\
Delphi 2005SetupFiles\Install\setup.exe
エラー
Borland Delphi 2005 では Microsoft .NET Framework SDK v1.1 がマシンにインストールされていることが必須です。この必須インストールを完了してから再度インストールしてください。
OK
.NET Framework 1.1 からの移行
https://msdn.microsoft.com/ja-jp/library/ff962563%28v=vs.110%29.aspx
Windows 7 と Windows 8 のオペレーティング システムでは、
.NET Framework 1.1はサポートされません 。
インストールできるけど知らないよってことらしい。
インストール前にいれておかないといけないもの
登録情報をユーザーフォルダに保存
ユーザー情報が・・・違うとでて起動できない
C++は認識しているのに、なぜ?。
使用許諾マネージャ
インポート
使用許諾ファイルのインポート中にエラーが発生しました
Borlandはもうないから無理か。。。。
http://support.embarcadero.com/jp/install/product
使用許諾ファイルが正常にインポートできない症状の対応について(その1)
使用許諾ファイルが正常にインポートできない症状の対応について(その2)
あらら、まだborlandで認証できたんですね。
Delphi 起動、そのまま認証を選択
登録しましたと出るが、すぐに認証されていませんとエラーを表示。
embarcaderoにログインすると登録製品に載っているんだけどなぁ。
Windows 2000/XP: C:\Documents and Settings\<ユーザー名>
Windows7から
C:\Users\<ユーザー名>
になっているのが原因かな
だめだこりゃ!!
もう一度 メール認証を選択して
キーをメールで送ってもらうことにしてみた。
登録キーを差し替え
Delphi 2005 起動した!!
Windows7
最新版の
Delphi は、約13万円(124,200)もするので買いません!!
バグ発見ゲームを楽しみたいならいいけどね。
Delphi 2005
fix が必要なメモ
Delphi および C++ Builder の VCL ライブラリのバッファ オーバーフロー
http://support.embarcadero.com/article/44089
PageControlへのWOW64対応
https://okamerin.com/nc/title/444.htm
http://qc.embarcadero.com/wc/qcmain.aspx?d=19859
不要
・IDEのホームページのリンク関係
welcome page in Delphi 2005(Japanese Edition)
http://cc.embarcadero.com/Item/24704
ダウンロードしてもかなり修正が必要
困った!! Windows8 64bitで起動したら
PageControl の タブ が 表示されない!!
なんて こったー!!
google先生お願いします!!
http://qc.embarcadero.com/wc/qcmain.aspx?d=19859
http://codeverge.com/embarcadero.delphi .vcl.using/tpagecontrol-ondrawtab-and-win64/1068914
なるほどそうでしたか。
Delphi 7での情報ですが
Delphi 2005でも表示されないので似たようなものでしょう
Delphi 7-2005のバグのようです。
手順
(1)上記からコード(codeverge.comのコード)をぱくります
(2)VCLFixes.pasとして保存します
2か所修正します
{$IFDEF VER150} //
Delphi 7
{$ENDIF}
の部分を
{$IF defined(VER150) or defined(VER170)} //
Delphi 7 , 2005
{$IFEND}
に書き換えます
(3) プロジェクトに上記のファイルを追加します
(4) 再構築すると対応完了です。
Delphi 2005で構築してWindows8 64bitで無事修正起動できました。
でも、
WMCompareItem WMDeleteItem WMDrawItem WMMeasureItem
が バグっているそうです。
後日調査するとしましょう。
fix一覧表を作る必要がありそうですね。
【4】Embarcadero
Delphi と C++Builder の VCL にバッファオーバーフローの脆弱性
https://www.jpcert.or.jp/wr/2014/wr143601.html#4
http://support.embarcadero.com/article/44015
【要約】
悪意の第三者によって細工された BMP ファイルを
該製品を使って作成されたアプリ
上で、処理すると
任意のコードが実行されり可能性があります
Dephi関連の値段の推移
Dephi2 Developer
68,000
Delphi 2005 Professional
71,400
Delphi Xe Professional
98,700
Delphi Xe7 Professional
129,600
Delphi 10.1 Berlin Professional
184,300
RAD Studio 2007 Professional
120,000
RAD Studio XE7 Professional
228,960
RAD Studio 10.1 Berlin Professional
326,800
マイクロソフト
Microsoft Visual Studio Professional 2013 通常版
54,843
Microsoft Visual Studio Professional 2013 with MSDN 通常版
137,268
Visual Studio Community 2015 フルバージョン
無料
用途によりますが
普通に考えて
マイクロソフトのExpress無料版 を使って
物足りなければ
Microsoft Visual Studio Professional 2013
製品版を購入したほうがよさそう。
機能制限なし、
Visual Studio Community 2015
が無料になって登場!!
Delphi のインフレはすごい。
客が離れる → 値上げ の無限ループ
もう、あれですよね。 終わった!!
» Delphi Professional'">続きを読む
Windowsのサポート期間メモ
サポート期間
OS名
サポート終了日
Windows XP
終了
日本時間 2014 年 4 月 9 日 16:00
(太平洋夏時間 2014 年 4 月 8 日 24:00)
Windows Vista
2017 年 4 月 11 日
Windows 7
2020 年 1 月 14 日
Windows 8
2023 年 1 月 10 日
Windows 10
2025 年 10 月 14 日
詳しくは、
こちら
Windows ライフサイクルのファクト シート
» 続きを読む
3分でプロキシサーバーを作ってみよう
はい。 超 久々の プログラミング クッキングのお時間です
基本材料
IdHTTPProxyServer1
IdServerIOHandlerStack1
IdAntiFreeze1
設定
IdHTTPProxyServer1.IOHandler := IdServerIOHandlerStack1;
これだけです。 あとは、 IdHTTPProxyServer1.Activeにするだけです。
ネットワークの設定
使っているWindows に対応した
アクセスポイントモードの数百円のUSB Wi-fi を用意します
コマンドプロンプトで ( ファイル名を指定して実行 cmd )
ipconfig /all
で IP アドレスを探します
Ethernet adapter
ワイヤレス ネットワーク接続 :
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : GW-USEco300
IP Address . . . . . . . . . . . . : 192.168.
100 .
1
アンドロイドの Wi-fi ポイントをじっとクリックすると設定が表示されるので
プロキシ 手動を選択して
上記のアドレスと 8080をいれると
プロキシ経由でアクセスできます。
※ Indyコンポーネントは 超不安定なので、データ破損には気をつけてくださいね
では、応用編
» 続きを読む
Http Get Winsock
Delphi
執筆:2012.08.07
編集:2012.08.07
こんな時に使えます。
・Indyを使いたくないとき
サイズが大きくなる。
・Indyのライセンスが嫌い
・Indyのバグにつきあいたくない
Indyだと
s := IdHTTP1.Get(URL);
の1行で済みます。
※文字コードが破壊される場合は、
別記事の「Win32 SJISで、Idhttp.Getすると壊れる理由」
を参照のこと
Wininet.dllの
InternetOpenUrl
でも、似たようなことはできますが
今回は割愛します。
簡易の Http 取得関数を作ってみましょう
TTcpClientを使うと受信できないことがあるので
TClientWinSocketを使うのがミソです。
下記のサンプルをuses節に加えて
s := HttpGetContents(Hostname , URI);
の1行で済みます。
ただし、サンプルは、
https通信未対応です。
リダイレクトやエラー処理も入っていません
また、 HTTP/1.1でリクエストすると
Contents取得部の処理が面倒なので
HTTP/1.0でリクエストしています。
» Delphi'">続きを読む
flashのハンドルを取得してみよう。
執筆:2011.10.19
編集:2011.10.19
TWebBrowser.HWNDを取得する方法 (メモ: その2)
flashのハンドルを取得してみよう。
【方法1】 : Tag名からリストアップする
var
H : THandle;
i : Integer;
v_Doccument, v_elems , v_attr : Variant;
s : string;
begin
v_Doccument := WebBrowser1.Document;
if VarIsClear(v_Doccument)
or
('Internet Explorer_Server'
<> GetClassNameText(GetWindowHandleFromIDispatch(v_Doccument)))
then
begin
Exit;
end;
v_elems := v_Doccument.getElementsByTagName('OBJECT');
if Not VarIsClear(v_elems)
and (v_elems.length > 0) then
begin
s := 'count: '+IntToStr(v_elems.length) + sLineBreak;
for i := 0 to v_elems.length -1 do
begin
v_attr := v_elems.Item(i).getAttribute('CLASSID');
if Not VarIsClear(v_attr)
and (VarToStr(v_attr)
= 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000')
then
begin
s := s + v_attr + sLineBreak;
H := GetWindowHandleFromIDispatch(v_elems.Item(i));
s := s + ' HWND: ' + IntToStr(H) + sLineBreak + sLineBreak;
end;
end;
ShowMessage(s);
end;
end;
【方法2】 : 子Windowから探す
flashオブジェクトが htmlの
最上位に貼り付けられている場合の例です。
※iframeなどに入っている場合は、下位階層まで追いかける必要があります。
※単一のflashが htmlに張り付いている場合。
function SearchFlashHandle(p_hwnd : HWND) : HWND;
var
c_hwnd : HWND;
begin
Result := 0;
c_hwnd := GetWindow(p_hwnd, GW_CHILD );
while (c_hwnd > 0) do
begin
// ClassName[MacromediaFlashPlayerActiveX]
if (Pos('MacromediaFlashPlayerActiveX',
GetClassNameText(c_hwnd)) = 1) then
begin
Result := c_hwnd;
break;
end;
c_hwnd := GetWindow(c_hwnd, GW_HWNDNEXT );
end;
end;
使用例 : SetFocusする。
h := GetWindowHandleFromIDispatch(WebBrowser1.Document);
flash_handle := SearchFlashHandle(h);
if (flash_handle > 0) then
Windows.SetFocus(flash_handle);
GetWindowHandleFromIDispatch関数については、
TWebBrowser.HWNDを取得する方法 (メモ: その1)
に書いてあります。
TWebBrowserで、どうしても入力フォーカスを当てたい際に役に立ちます。
flash以外の他のオブジェクトも同様に応用することができます。
さようなら
Delphi
レッツゴー ドットネット
それいけ ドットネット
それいけ C#
TWebBrowser.HWNDを取得する方法 (メモ: その1)
執筆:2011.10.17
編集:2011.10.17
今日は、
C#へレッツゴー
さぁ
Delphi なんか捨てて みんなドットネットへ Go !!
それいけ ドットネット推進派 の 禁断の
Delphi ネタです。
次期Windows8 の 「
Windows Developer Preview 版」が無償公開 されていますが
もう みなさんは、お使いですか?
※OSのアンインストール機能がないそうなので、インス トールは気をつけてください
Visual Studio 11 Expressの同梱版もあり すごいお試し版OSです。
“Win RunTime(WinRT)”と呼ばれる新しいAPIが追加され
新しいデスクトップ“Metro”では、新しい“Metro”対応のアプリケーション(“Metro style apps”)
なんていうものが必要になるそうです。
キット古い開発環境とアプリを市場から強制排除したいのでしょうね。
もう、Visual Studio意外に開発環境の選択の余地がないって感じになってきましたね。
ということで、 ほらほら、 みんなドットネットへ Go !!
では、本題です。
TWebBrowser.HWNDへのアクセスは不正なエラーに なります。
WebBrowser1.Handleでいいようです。
構造
ページを表示するとコンテンツに応じて 上の3つが、階層構造で多様につながる。
iframeなどの要素があると多重構造になるようです。
※ コードを参考にする場合は、自己責任で参考にされてください。
※ 十分なテストが必要です。
※ 将来的に、仕様などの変更で利用できなくなることも考えられます。
【TWebBrowser.HWNDは、無効なプロパティ】
(MSDN 文書番号: 244310):
※要約 子WindowをたどっていくとHandleを取得することができます。
※ TWebBrowser.HWND
Web ブラウザの Window ハンドルへのアクセスを提供します。
※ Delphi では、TWebBrowser.HWNDは使えません。
コード
WebBrowser1.HWND;
実行結果
デバッガ例外通知
プロジェクト は例外クラス EOleException (メッセージ 'エラーを特定できません')を送出しました。
【HTML要素からhandleを取得する方法。】
ハンドルを 直接要求する方法
// [エラー] : E2010 'System.TGUID' と 'Ole2.TGUID' には互換性がありません
const // From Ole2.pas
IID_IOleWindow: TGUID = (
D1:$00000114;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
function GetWindowHandleFromIDispatch(disp: IDispatch) : HWND;
var
h : hwnd;
Res : HRESULT;
oWin : IOleWindow; // Unit ActiveX.pas
begin
// example: GetWindowHandleFromIDispatch(WebBrowser1.Document)
Result := 0;
Res := disp.QueryInterface(IID_IOleWindow, oWin);
if Succeeded(Res) then
begin
Res := OWin.GetWindow(h);
if (SUCCEEDED(Res)) then
Result := h;
end;
end;
使
い
方
// Class : Internet Explorer_Server
h := GetHTMLObjectWindowHandle(WebBrowser1.Document);
if (h > 0) then
Windows.SetFocus(h);
(参考)正 規のhtml要素のfocusの使い方
// HtmlElement から直接呼び出す場合
// HtmlElement.focus();
var
v : Variant;
begin
v_Doccument := WebBrowser1.Document;
if Not VarIsClear(v_Doccument) then
v_Doccument.focus();
var
v_Doccument, v_elems : Variant;
begin
v_Doccument := WebBrowser1.Document;
if VarIsClear(v_Doccument) then exit;
v_elems := v_Doccument.getElementsByName('ここにhtml要素の名前');
if Not VarIsClear(v_elems)
and (v_elems.length > 0) then
v_elems.Item(0).focus();
擬似キー入力を送るコード:Function Key
var
H : THandle;
begin
h := GetWindowHandleFromIDispatch(WebBrowser1.Document);
Windows.PostMessage(H , WM_KEYDOWN, VK_F1 , 0);
擬似キー入力を送るコード:通常文字
var
H : THandle;
begin
h := GetWindowHandleFromIDispatch(WebBrowser1.Document);
Windows.PostMessage(H , WM_CHAR, Byte('a') , 0);
end;
ALT+F4(終了)を呼びたい場合は
WM_SYSKEYDOWN を使います
Windows.PostMessage(TargetHandle ,
WM_SYSKEYDOWN , wParam, lParam);
wParam
lParam
VK_F4 + ALT
VK_F4
1 shl 29
VK_F1
IEのF1(ヘルプ)の呼び出しは、反応しないのでわかりません。
Firefox系の他のブラウザでは反応します。
テキストボックスに文字列をいれるだけなら、
普通にgetElementsByNameやgetElementByIdなどで
要素にアクセスして代入した方が安全に入力できます。
普通にテキストボックスに入力する方法
( 応用例:ログインIDなどの自動入力 )
例
v_elems.Item(0).innerText := 'abc';
.innerText
.innerHTML
コンボボックス
(selectタグのoption要素)
e.options[e.selectedIndex].text
e.options[e.selectedIndex].value
使い方は、基本的にJavaScriptと同じ。
【一番上のShell DocObject View の HWND 取得方法】
GetWindow(WebBrowser1.Handle, GW_CHILD )
※ ClassNameで、確認した方がいい 、 GW_HWNDNEXT
Navigateでフォルダを指定した場合、エクスプローラーが内蔵されるので注意。 SysListView32などが現れる。
function GetWebBrowser_Root_ShellDocObject_Handle(AWebBrowser : TWebBrowser) : hwnd;
// Shell DocObject View
var
h : hwnd;
begin
h := GetWindow(AWebBrowser.Handle, GW_CHILD );
while (h > 0) do
begin
if (Pos('Shell DocObject View', GetClassNameText(h)) = 1) then
begin
Result := h;
Break;
end;
h := GetWindow(h, GW_HWNDNEXT );
end;
end;
function GetWebBrowser_Root_IE_Server_Handle(AWebBrowser : TWebBrowser) : hwnd;
// Internet Explorer_Server
var
h : hwnd;
h_child : hwnd;
begin
h := GetWindow(AWebBrowser.Handle, GW_CHILD );
while (h > 0) do
begin
if (Pos('Shell DocObject View', GetClassNameText(h)) = 1) then
begin
h_child := GetWindow(h, GW_CHILD );
while (h_child > 0) do
begin
if (Pos('Internet Explorer_Server',
GetClassNameText(h_child)) = 1) then
begin
Result := h_child;
break;
end;
h_child := GetWindow(h_child, GW_HWNDNEXT );
end;
if (Result > 0) then
Break;
end;
h := GetWindow(h, GW_HWNDNEXT );
end;
end;
【場所から取得する方法】
・ ChildWindowFromPoint関数を使用します。
ついでに、それいけみんなドットネットなので
C#で、ハンドルにメッセージを送る方法は
知らないので
[System.Runtime.InteropServices.DllImport("user32.dll")]
private extern static System.Boolean PostMessage(
System.IntPtr hWnd,
System.UInt32 Msg,
System.Int32 wParam,
System.Int32 lParam);
で回避することができる。
C#で WebBrowserを使ってみよう(その1)
執筆:2011.10.15
編集:2011.10.16
Delphi で作ると
実行ファイルが大きくなる し、 Tabで WebBrowserコ ントロール内に移動できない ので
さぁ C#だー
はっはっはっ!
って 試験動作させると
瞬時に ずっこけました。
OnNewWindowで、Dispatchが設定したかったのです。
他にもいっぱいあるのですけど
NewWindowで
Delphi 相当の機能が実装されていないのです。
開くURLも取得できないし、Dispatchも設定できないなんて、酷い(ひどい)話です。
.Netには、なんの嫌がらせか知りませんが、本来つけておくべきイベントがたくさんないのです。
なんでもかんでも
新しいWindowで開くで、IEに送るのでは、WebBrowserを内蔵する意味がほとんどないでしょ。
(※IEに送るとセッションCookie?が引き継がれないから問題なんです。)
ということで、
.NetのWebBrowserを拡張して本来あるべきイベントを追加して対処しました。
private void exWebBrowser1_NewWindow3(
object sender,
WebBrowserExtendedNewWindow3EventArgs e)
{
// メモ
// (1)e.pDisp に設定しない。新しいIEとして開く。
// (2)e.pDisp を設定する。指定したWebBrowserで開く。
// ※同じWebBrowserでは、e.pDispは、動作しない。
// (3)同じWebBrowserで開く。キャンセルNavigateを呼ぶ。
// ※POSTなどが失われるので注意。
// MessageBox.Show((string) e.URL);
// open as self WebBrowser
// e.Cancel = true; exWebBrowser1.Navigate((string) e.URL);
// open as new WebBrowser
// e.pDisp = exWebBrowser2.ActiveXInstance;
}
// using System.Runtime.InteropServices;
public event EventHandler<WebBrowserExtendedNewWindow3EventArgs> NewWindow3;
protected void OnNewWindow3( ... 省略
..... 省略
[ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
TypeLibType(TypeLibTypeFlags.FHidden)]
public interface DWebBrowserEvents2
{
[DispId(273)]
void NewWindow3(
[In, Out, MarshalAs(UnmanagedType.IDispatch)] ref object pDisp,
[In, Out] ref bool cancel,
[In] ref object flags,
[In] ref object URLContext,
[In] ref object URL);
}
読者に作る機会を与え、動作原理を理解させるために
あえて、完全なコードは開示していません。
不足分は、参考サイトを見ながら完成させましょう。
参考にした フォーラム が型とか ウソ書いていたので
少し手間だったヨ。
◎よくできました
とりあえず、目的の動作をするようにしたのでので「よし」としよう。
【参考サイト】
webBrowserで別のウインドウで開くときの開く先のURLの取得法
とその中のリンク記事
(VSUG フォーラム → .NET 開発 → Visual C# → webBrowserで別のウインドウで開くときの開く先のURLの取得法)
MSDN Library for Visual Studio 2008
・CreateSink メソッド (使用例)
・他
Indy 10.5.8.0 アップグレード メモ
執筆:2011.8.24
編集:2011.8.25
安定版は?と尋ねるとtrunc使えと返ってくる始末だし。
また、仕様を変更しています。
いい加減にしてほしいですね
TWebBrowserとTIdCookieManagerで
クッキーを双方向コピーできるようにしているので
仕様変更は迷惑なり!!
コード書き換えは、正確に受け渡しテストをしなくてはいけなくなるから大変だ!
Indy 10.5.8.0 from Indy 10.5.7 , 10.5.8
IdCookie.pas
廃止
TIdCookieRFC2109
TIdCookieRFC2965
TIdNetscapeCookie
TIdCookieに変更された
revision 4612 : Updating to cookie draft-23.
IdCookie.pas
TIdCookie.CookieText
読み込み専用に変更されている
ParseServerCookieに置き換えで対応する。
クッキーを挿入したい場合、
新規にURIが必要になるので、自分でdomainとpathを事前にパースする必要がある。
IdCookieManager.pas
CookieCollection.AddCookie :
パラメータが変更されている
IdCookieManager1NewCookie
型を変更する必要がある
TIdCookieRFC2109 → TIdCookie
IdCompilerDefines.incにもう少し定義がほしい
DEFINE 10_5_8
は、ほんと迷惑 やめてほしい。
INDY_10_5_8とかにしてほしい。
バグが多いので下位互換性を保つ意味はないが、
仕様を変更した時点で、
INDY_10_5_OR_ABOVE
INDY_10_5_7_OR_ABOVE
INDY_10_5_8_OR_ABOVE
とかも定義してほしい
私は、自分でバグ修正して使っているので問題はないが
Indyは、仕様変更とバグに振り回されるので
できれば、他のインターネットコンポーネントを利用した方がいいだろう。
» 続きを読む
久々の
Delphi ネタ!!です
バーーーン!!
グリッドインデックス が範囲を超えています.
レコードを最後に移動すると出るんですよ。
うーん。
ペタペタペタしかしていないので、
Delphi 2005のバグなんだろうけど
数十件のレコードしか入っていないし
自分用のアプリなので、OK押せばよく 特に困っていないので、
まぁいいかと 1年ほど放置状態でしたが修正してみました。
lastで 最後に送るとエラーが発生するので
コアの内部インデックスがおかしいのだろうから
とりあえず
接続直後に
ClientDataSet1.First;
はい、これだけで、直りました。
もっと早く修理しておけばよかったかな。
公式サイトの別解 がありましたが、まぁいいでしょう。
そして、この作業中
以前からなんとなく違和感を感じていたIDEの差分表示。
その正体が判明しました。
こ これは、 またしても バグだ。
変更を差分表示すると...
削除が+ 追加が- 記号で表示されるではないですか
↓↓↓こんな感じ
↑↑↑
ほんとひどいIDE品質。
歴代ワーストIDEに入るだけあって最悪づくめ。
別の件では、「不明な内部エラーが起きました」とコンパイルできないこともしばしば。
そういうときは、半分は再起動。それでもだめなときは、コマンドコンパイラでコンパイル。
それでもだめなときは、「不明な内部エラーなので」お手上げ。
これは、直されることなく 次期バージョンへ、そして、開発会社変更と忘れ去られていったのであった。
どっとネットの時代に
いまさら
Delphi なんて ほとんど使わないから、どうでもいいのですけどね!
いま打ち間違いましたよhをoにしてしまって、delpoi でるぽい おーすばらしい名前。
でるぽい でるぽい でるぽい
ポイしましょ。
ついでに
Delphi XE2 ネタ!!
そろそろ
Delphi XE2の発売時期ですが
昔買った値段の2倍以上するような案内を送ってきても絶対買ってあげません。
高いお金払って pascalライブラリのバグに振り回されるのはごめんですよ。
無料のマイクロソフト製の C++, C#を使った方がバグが無くて非常にいいですしネ。
私としては、
Delphi を使っていない人・使おうとする人・使っている人
には、マイクロソフト製の言語をおすすめします。
理由は、
・ヘルプファイル
・書籍
・掲示板
どれをとっても充実しています。
圧倒的なユーザー数なので、わからなかったら掲示板で即解決ってこともありますよ。
Pascal言語の役目は終わりました
さようなら Pascal言語
時代の風は、 どっとねっと
どっと どっと ドッド・ネット
C++ , C# , basic お好きな言語で
どどど どどど ドッド・ネット
それいけ .Net !!
Embarcadero
えんばかからの封筒がきました。
開けると、パンフレットが一枚だけ入っていました。
いまならお得なキャンペーン中だと
値段は、6万・・・・
どこがお得なんだよ。
昔の新規の値段より高いじゃないか!
ユーザー離れが加速しているってことだろう・・・
会社が転々と変わって いまや、単価が2倍に・・・
最初に買ったバージョンからすると6倍だ!
32bitで古い仕様のくせいに まぁ どあつかましいこと。
Delphi 2は確か1万20000円くらいだったような。
Delphi 2005は、キャンペーンとかきて、3万円前後だったような・・・・
Delphi 2005は、バグばっかりでひどい製品つかまされましたが・・・
はっきり言おう。4万円以上はださない。
VidualStudioが無料配布されている時代にバカいっちゃって。
円バカだからしかたがないか・・・
» 続きを読む
販売会社が何度も変わって
どんどん
アップグレード代が跳ね上がって高いので
バージョンアップしていないのですけど
Delphi / C++Builder XE Starter Edition
税別 ¥14,000
うーんどうしよう。
DB、その他いろいろ
機能を削りすぎでしょ。
これでお金取るの? ひどぉーい
最近は ずっと無料版のC#を使っています。
.Net4からのパラレル構文が魅力なので
いまさら
Delphi に戻るのも・・・
買っても使わない気もします。
しばらく様子見します。
.Netに変えて、プログラミング言語のバグに遭遇しないし
快適そのもの。
やっぱり、無料の .Netへレッツゴー
» Delphi C++Builder Starter Edition'">続きを読む
Win32 SJIS(〜
Delphi 2007? )で、Idhttp.Getすると壊れる理由
編集:2010年12月21日
執筆:2010年12月20日
今日のお題は、
?
使用したバージョン: Indy version 10.5.8
IdHttp.Get(URL)が
いつの間にか文字コードが自動変換になりました。
Delphi 2009より前の
Delphi でのIndy文字化け
デフォルトがencASCIIのため 文字が破壊され
? に なってしま います。
※
Delphi 2009以降は、UTF8で呼ばれるので、この問題はないと思います。
英文圏がデフォルトのため、
Win32 SJISベースの
Delphi (〜2007?まで)の場合は、変更が必要です。
IdGlobal.GIdDefaultAnsiEncoding := encOSDefault;
IdGlobal.GIdDefaultAnsiEncoding := encUTF8;
のお好きなほうを、プログラムの最初や随時変更が必要なところで呼びます。
グローバル変数なので、毎回変更がいらない場合は、1回よべば十分です。
TIdhttpに限らず、TIdMailなどで変なときは、試してみる価値はあります。
Delphi 2009以降の最新版は、UTF8ベースなので、こういう変更はいらないと思います。
グローバル変数をいじる方がコードの書き換えが少なくてすみます。
画像などをIdHTTP1.Get(url)で取得していた場合は、コードを修正する必要があります。
» Delphi2007? )で、Idhttp.Getすると壊れる理由'">続きを読む
Delphi DB 「BLOB は変更されています」
アプリケーション起動
- レコード移動
- 特定のレコードを通過すると
ボン
「BLOB は変更されています」
うっ、みたことのないエラー 嫌な予感。
Delphi 2005で作ったソフトでエラーが発生しました。
.Netへ 移行
.Netへ ゴー
それいけ .Net プロジェクト始動中なのに
なんてひどい「しうち」。
Delphi とは、さようなら のはずなのに
また、不本意ながら 仕方なくDelphi を起動。
なんとなくDBの破損だとは、思うのですが、
なにせ paradox形式なので修復ツールがない。
...2分経過 問題の場所がわからない。
27個しかレコードがないのに壊れるのは勘弁してほしい。
やはり破損か?
(1)dbのバックアップ
(2)データベースデスクトップ データ再構築をクリック
壊れた...。
(3)気を取り直して、ソフトでバッチムーブで再構築をクリック
(4)データがいくつか消滅したがまぁいいとしよう。
この際、ついでなので 今後のためにDBも変更。
(5)データ書き出しをクリック
(6)firebirdオプションを定義して再コンパイル
(7)同じフォルダにfirebird embededをコピー
(8)データ取り込みをクリック
(9)動作確認 ok
firebirdへ移行完了。
paradoxよ さようなら。
そして、もう破損しないことを祈りつつ
解決!!
さらば Delphi
さぁ .Netへ レッツゴー
新規アプリケーションは、Delphi では、もう作らないコーナー。
めざせ.Netアプリケーション
利点
・開発環境のバグから大幅に解放される
・ソフト開発に専念できる
・豊富な.Netライブラリを利用できる
・参考書がたくさん
・質問コーナーもたくさん
・熟練ユーザーもたくさん
欠点
・配布アセンブリの暗号化が必要で高価。
チューブの破けた自転車と新幹線くらいの差ですよ
もう時代は .Net
破けたチューブを自分で直せない人は、.Netに乗り換えるべし
XE バージョンアップ
2006ユーザーは、年末まで。
えー、2005以下のユーザーは、値上げして切捨て。
ちょっと ひどくない!!
値段が倍近く違うよ
ということは、来年は、2006以下のユーザーは、切捨て
という図式が当てはまるのかな
値段も上がったし、ますます自分で首絞めてますね。あの会社。
使いもしないのにバージョンアップを受けるためだけに毎年買うのはタダの馬鹿。
円馬鹿だろー の呪文に染まっていませんか?
2年間つかわないのなら、3年目に新規購入した方が全体で安いだろう。
キャンペーン時に買うとしても1年使わないなら見送った方が安い。
毎年、来年は、この機能が実装される予定ですって
同じことを毎年繰り返して
うそばっかりいって、客止めしているし
10年後には、きっと自滅するかもね。
自滅しないにしても、教育・趣味の世界から忘れ去られるだろう
特別アップグレードキャンペーンじゃダメ。
旧バージョンもバージョンアップキャンペーンしてくれない限り
もうDelphi は、買いません。
Visual Studioより高い価格で買う利点はありません。
今後64bit開発が必要になったら、Visual Studio Proを購入するでしょう
Delphi に
ふみとどまっている理由は、
・実行ファイル アセンブリの暗号化ツールが高い点
・C#(.netライブラリ)は、将来見捨てられないのか?
が主な理由です
高機能なフリーの.net4 アセンブリの暗号化ツールがあれば、
まよわず、新規アプリケーションは、
Visual Studio で作成するでしょう。
Lazarus エラー時に強制終了を表示させない方法
執筆:2010.1.11(成人の日)
編集:2010.1.11
編集:2016.04.01
アプリケーションがエラーで強制終了する仕様は
version 1.7 (リビジョン: 51739 日時: 2016年2月28日 16:33:49)
で、改善されました
今日の講義は、lazarus で作ったアプリケーションのエラー時の動作変更です。
今日の材料: lazarus 0.9.29
既定では、エラーが発生すると、強制終了しますか?と尋ねてきます。
間違って、OK以外を選択すると、Haltを呼び出し アプリケーションが消滅します。
データを扱っているアプリケーションの場合、この動作が致命的な場合もあります。
【まとめ】
最新版では、この不具合は修正されています
アプリを Lazarus Version1.8 以降でコンパイルしなします
Lazarus Version1.7 以前の場合
procedure TForm1.FormCreate(Sender: TObject);
begin
with Application do Flags := Flags + [AppNoExceptionMessages];
end;
procedure TForm1.ApplicationProperties1Exception(Sender: TObject; E: Exception);
begin
{ uses節にLCLTypeを追加します }
with Application do
MessageBox(PChar(E.Message),PChar(Title),MB_OK+MB_ICONERROR);
end;
今日のキーワード:
lazarus
Exception
Press OK to ignore and risk data corruption. Press Cancel to kill the program.
Application.Flags
AppNoExceptionMessages
like
Delphi
Delphi 2005付属のDemeanorとフリーなNanDoKuをさわってみる
今日のDelphi の講義は、難読化です
みなさん用意はいいですか
聴講料は無料なので安心してください(^▽^;
【はじめに】
.netで作成した、exeファイルは、簡単に類似ソースコードに戻すことができるそうです。
実際、.net自体に低級言語に戻すildasmツールが付属しています
この非常に狭い地球には、任意の.net高等言語に戻すフリーツールも出回っているようです
これは、普通の開発者にとって脅威です
このことは利用するユーザーには、全く利もなく害もないのですが、
開発側にしてみれば多言語間で簡単に呼び出せるようにした弊害なのでしょう。
そこで、そのようなツールで、ソースコードに戻しても
変数名やクラス名をグチャグチャに変更して
「人が見ても理解し難いソース」
「そのまま使うとコンパイラエラーを起こし、手を加えないと使えないものにしてしまう」
「コードを流用する気力を根こそぎ奪う」
「動作原理を理解し難くして隠蔽する」
「名前短縮によりexeサイズの縮小を期待する」
などいろいろな目的の元で変換を行うのが .netの難読化ツールです
さいわいDelphi 2005に付属しているのでインストールしておきましょう。
(冊子 Quick Start P.5)
【Demeanorの準備】
まず、パスが遠いのでユーザーの環境変数に
フルパスを登録すると便利です
PATHにパスを登録してもいいのですが、あまり長くなるのが好きではないので
ここでは、個別の環境変数を作成することにします。
環境変数 Demeanor を作成し、そこにフルパス
"C:\Program Files\Wise Owl, Inc\Demeanor for .NET, Personal Edition\Demeanor"
を登録しました
【Demeanorの使い方】
%Demeanor% dotnet実行ファイル名
PATHが取っている場合は
Demeanor dotnet実行ファイル名
で 難読化済みexe が作成できます
Demeanorフォルダに変更されたexeができます
出力先は、/out:パス
で変更できます
変換方法を変更するには
既定値
/names:alpha
/names:numeric
/names:Unicode
その他詳しくは、DOSプロンプトを起動して、
Demeanor /?
で確認しましょう
【ildasm】
ildasm
"C:\Program Files\Microsoft.NET\SDK\v1.1\Bin\ildasm.exe"
のショートカットを作って置くと便利です
ildasmにできたファイルを投げ入れると
どの程度exeが書き換えられたか閲覧できます
Delphi でC#のexeを作ったものはかなり変更されたかなという感じを受けます
delphi .netのexeには、あまり変更が加わっていない気がします。
次に
NanDoKuというフリーソフトを使ってみましょう
【NanDoKu】
ということで
うーん、こ、これは・・・
delphi .netのexeにそのまま使うと飛びます
■まず、設定を開き コンパイラのildasm.exeを正しいパスに変更しましょう
■Nandokuデフォルトオプションだと
delphi .netのexeは、飛びます
オプションを変更して飛ばないようにします
変換項目の設定と作ったexeの動作
○
名前空間
×
クラス名
××
メソッド
○
プロパティ
×
クラス変数とイベント
○
メソッド引数
○
ジェネリックの型パラメータ
Nandokuで作ったexeを実行した時
○は、動作
×は、実行時エラー発生
××は、exe作成できず
この表は、NanDoKu 3.1.0
に
空の Delphi .net TFormアプリケーション
を入力としました
変換項目の設定
メソッド
にチェックがあると
---------------------------
難読化失敗
---------------------------
難読化に失敗しました。
原因不明のエラーが発生しました
---------------------------
■exe→Demeanor→Nandoku
とするとNandokuで飛びます
●exe→Nandoku→Demeanor
という手順だと飛ばないようです
(この処理はバッチ処理すると楽です)
ildasmで確認をすると
適度に難読化がかかった感じでいい感じです。
Delphi 2005でVB,C#のコードから作成したexeファイルの場合は、
メソッド名も変更されるので
難読化効果がさらにあるような気がします。
Delphi 2005 C#で作った単純なアプリケーションをDemeanorで変換し、ildasm で表示した様子。
執筆:2008.1.31 おかめりん
Indy Cookie 2007
執筆:2007.01.05
編集:2007.03.19
編集:2007.07.09
編集:2007.07.18
編集:2007.07.21
編集:2007.11.23
編集:2009.10.16
追記:2009.10.16 IndyTiburon.zip(Indy 10.5.7)にて修正されているようです。
IndyTiburon.zipに移行して indy10.zip(10.2.3)は開発がとまったようですので注意が必要です。
このページの内容は古くなっています。
参考にする場合は注意が必要です。
10.0.52は、かなり古いので
cookieのドメインの最初が .で始まっていると処理できずエラーになります。
(IdCookie、IdCookieManager) (10.1.6でも直っていませんでした。:2007.3、2007.7)
(10.2.3でも直っていませんでした。:2007.10)
他にも修正をみつけたので、この文書は
インストール方法と分離しました。(2007.7.21)
最新版のインストール方法は、こちらに書いてあります。
パッチ: クッキーのバグを修正します。
Indy10 Cookie bug fix(2007年3月中旬 時点、version 10.1.6)
Indy10 Cookie bug fix(2007年10月中旬 時点、version dev 10.2.3)
Indy9 Cookie bug fix(2007年7月中旬 時点、version 9.0.5.0(stable),indy9.0.18(stable), DevSnapshot)
【現象】
1.
example.comがexample.comのcookieを渡し、ソフトウェアに保存したとします。
. example.comでのcookieを、example.comで取得できません。
2.
anywordexample.comにソフトウェアが接続するとexample.comのcookieをanywordexample.comに渡します。
example.com.anydomainにソフトウェアが接続するとexample.comのcookieをexample.com.anydomainに渡します。
後者(2.)は、セキュリティ勧告ものレベルなのは容易に想像がつくと思います。
サイトと同名の文字列を含んでる場合に限られますが、
誘導によりクッキーの略奪が可能なので注意が必要です。
(3.)パス付き/で終わらないクッキーを保存した場合、同じ文字が並ぶパスにわたしてしまいます。
firefox2ではわたさないことを確認しました。(違うパスへ保存はできるようです。)
※ IE7では、Indyと同様の現象が起きます。
Netscpeの仕様書を見るとそうなると 最終パス名の部分一致になると書いてありました。
※ Cookieには、きちんとした規格が無いようなことがかいてありました。
firefox2のような動作がいいと個人的に私は思いますのでそういう風に修正を加えます。
/で終わらないクッキーを書いた方が悪いと思いますが、そういうミスはあるものです。
(共有サーバーで問題になります。他人のアカウントにわたすので)
例: path=/tea; http/〜/tea/のものを http/〜/team/ にもわたします。
【対策】
※:適用した場合のコードの安全性はご自分で確認を取ってください。
わたしは、一切責任はもちません。
コードが修正されている可能性も否定できませんので
まず、何もしない状態でセキュリティホールが残っているか確認をとることをお勧めします。
下の再現コードである程度確認できると思います
2007年3月でのdevコードなので、該当行が多少移動しているかもしれません。
関数名も書いているので探しやすいと思います。
(delphi 2005付属の10.0.52は、行数が違いますので関数名で探してください。)
Indy10
\Lib\Protocols\
IdCookie.pas
単純に切り落とすと間違った判定をします。
TIdNetscapeCookie.IsValidCookie
Indy 〜 10.1.16 :
331: function TIdNetscapeCookie.IsValidCookie
begin
//....(省略)
Result := FDomain = RightStr(AServerHost, Length(FDomain));
修正
var ACookieDomain : String;
begin
//....(省略)
// Result := FDomain = RightStr(AServerHost, Length(FDomain));
// bad code : FDomain = RightStr(AServerHost, Length(FDomain));
// FDomain AServerHost
// xxxx.yyyy.com , zxxxx.yyyy.com : is not valid
// xxxx.yyyy.com , xxxx.yyyy.com : is valid
// .xxxx.yyyy.com , xxxx.yyyy.com : is valid
// .xxxx.yyyy.com , yxxxx.yyyy.com : is not valid
if (Copy(FDomain,1 , 1)='.') then
ACookieDomain := FDomain
else
ACookieDomain := '.' + FDomain;
Result := ( ACookieDomain = RightStr('.' + AServerHost, Length(ACookieDomain)) );
Indy 10.2.3 :
- Result := TextEndsWith(AServerHost, FDomain);
+ // bad code : Result := TextEndsWith(AServerHost, FDomain);
+ // TextEndsWith('noexample.com', 'example.com') = true : is not valid
+ if (Copy(FDomain,1 , 1)='.') then
+ Result := TextEndsWith('.' + AServerHost, FDomain)
+ else
+ Result := TextEndsWith('.' + AServerHost, '.' + FDomain);
IdCookieManager.pas
ドメインの比較にPos関数を使ってはいけません。
135: function TIdCookieManager.GenerateCookieList
begin
//....(省略)
if IndyPos(LCookiesByDomain[i], URL.Host) > 0 then
修正
TempCookiesDomain : String;
begin
//....(省略)
// if IndyPos(LCookiesByDomain[i], URL.Host) > 0 then
TempCookiesDomain := LCookiesByDomain[i];
if (Copy(TempCookiesDomain,1 , 1) <> '.') then TempCookiesDomain := '.' + TempCookiesDomain;
if (TempCookiesDomain = RightStr('.' + URL.Host, Length(TempCookiesDomain))) then
注意
Netscapeの仕様書では、/で終わらない場合、最後のパス名は部分一致になっています
IE7もそういう動作をしているようです。
firefox2では、部分一致にはなっていません。
firefox2風に、/で終わるパスと同様の動作にするには以下のようにします。
function TIdCookieManager.GenerateCookieList
if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
-->
// if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
if (RightStr(LCookieList.Cookies[j].Path,1) = '/') then
begin
if Pos(LCookieList.Cookies[j].Path, URL.Path) <> 1 then continue;
end
else
begin
if Pos(LCookieList.Cookies[j].Path + '/', URL.Path) <> 1 then continue;
end;
Firefox2では、Cookieのドメインに . がつくようなのでそうします。
Dev版(Indy 10.2.3)のIdGlobalProtocols.IsHostNameで
最初に . が付いているとFalseを返すようになってしまったので[ . ]が最初についていた場合取り除きます。
.で始まるものを保存できるように修正をしましたので
そのままでは最初の文字が . 付きと .がついていない物と混在してしまいます。
以下のように修正します。
procedure TIdCookieManager.DoAdd
if Length(ACookie.Domain) = 0 then LDomain := AHost
else LDomain := ACookie.Domain;
-->
if Length(ACookie.Domain) = 0 then LDomain := AHost
else LDomain := ACookie.Domain;
while (copy(LDomain, 1 , 1)='.') do LDomain := copy(LDomain, 2 , Length(LDomain));
if (LDomain ='') then exit;
(省略)の部分は、ここでわかりやすくするために
省略しただけで誤解しないようにお願いします
Indy 9
IdCookie.pas
単純に切り落とすと間違った判定をします。
function TIdNetscapeCookie.IsValidCookie
begin
//....(省略)
if IsHostname(AServerHost) then
begin
if IsHostName(FDomain) then
result := FDomain = RightStr(AServerHost,Length(FDomain))
else
result := FDomain = RightStr(DomainName(AServerHost),Length(FDomain));
end
修正
var ACookieDomain : String;
begin
//....(省略)
if IsHostname(AServerHost) then
begin
// if IsHostName(FDomain) then
// result := FDomain = RightStr(AServerHost,Length(FDomain))
// else
// result := FDomain = RightStr(DomainName(AServerHost),Length(FDomain));
if (Copy(FDomain,1 , 1)='.') then
ACookieDomain := FDomain
else
ACookieDomain := '.' + FDomain;
Result := ( ACookieDomain = RightStr('.' + AServerHost, Length(ACookieDomain)) );
end
IdCookieManager.pas
ドメインの比較にPos関数を使ってはいけません。
function TIdCookieManager.GenerateCookieList
begin
//....(省略)
if IndyPos(Uppercase(LCookiesByDomain[i]), Uppercase(URL.Host + URL.path)) > 0 then {FLX}
修正
ACookieDomain : String;
begin
//....(省略)
// if IndyPos(Uppercase(LCookiesByDomain[i]), Uppercase(URL.Host + URL.path)) > 0 then {FLX}
ACookieDomain := LCookiesByDomain[i];
if (Copy(ACookieDomain ,1 , 1) <> '.') then ACookieDomain := '.' + ACookieDomain;
if (ACookieDomain = RightStr('.' + URL.Host, Length(ACookieDomain))) then
注意
Netscapeの仕様書では、/で終わらない場合、最後のパス名は部分一致になっています
IE7もそういう動作をしているようです。
firefox2では、部分一致にはなっていません。
firefox2風に、/で終わるパスと同様の動作にするには以下のようにします。
if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
-->
// if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
if (RightStr(LCookieList.Cookies[j].Path,1) = '/') then
begin
if Pos(LCookieList.Cookies[j].Path, URL.Path) <> 1 then continue;
end
else
begin
if Pos(LCookieList.Cookies[j].Path + '/', URL.Path) <> 1 then continue;
end;
.で始まるものを保存できるように修正をしましたので
そのままでは最初の文字が . 付きと .がついていない物と混在してしまいます。
以下のように修正します。
procedure TIdCookieManager.DoAdd
if Length(ACookie.Domain) = 0 then LDomain := AHost
else LDomain := ACookie.Domain;
-->
if Length(ACookie.Domain) = 0 then LDomain := AHost
else LDomain := ACookie.Domain;
LDomain := Sys.Trim(LDomain);
if ((LDomain <> '')and(IsHostname(LDomain))) then
if (Copy(LDomain,1,1) <> '.') then LDomain := '.' + LDomain;
(省略)の部分は、ここでわかりやすくするために
省略しただけで誤解しないようにお願いします
バグの確認のためのコード DOS版 FORM版
※コピーは、IEのみ動作します
バグの確認のためのコード DOS版
program testCookieManager;
{$APPTYPE CONSOLE}
uses
IdCookieManager,IdURI, IdGlobal;
var TestCount : integer = 0;
function CookieManager_check(Cookie, HostName , AccessURL : string;
Accept : Boolean; mesg : string) : Integer;
var
aURI : TIdURI;
IdCookieManager1 : TIdCookieManager;
s : string;
isError : boolean;
begin
Result := 0;
aURI := TIdURI.Create(AccessURL);
IdCookieManager1 := TIdCookieManager.Create(nil);
try
try
IdCookieManager1.CookieCollection.Clear;
IdCookieManager1.AddCookie(Cookie, HostName);
IdCookieManager1.AddCookie('Set-Cookie: name2=value2; path=/tea/; domain=dummy', 'dummy');
// aURI.URI := AccessURL;
s := IdCookieManager1.GenerateCookieList(aURI,False);
if (Accept) then
isError := (s = '')
else
isError := (s <> '');
if (isError) then
begin
Result := 1;
Inc(TestCount);
Writeln(' _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ' ,TestCount);
Writeln(mesg);
Writeln(' Cookie '+Cookie);
Writeln(' CookieHostName '+HostName);
Writeln(' AccessURL '+AccessURL);
Writeln(' GenerateCookieList('+aURI.URI+') = ' + s);
end;
except
Result := -1;
Writeln('internal error');
end;
finally
aURI.Free;
IdCookieManager1.Free;
end;
end;
function TestCookie() : Integer;
var
r : integer;
begin
Result := 0;
// r := CookieManager_check('Set-Cookie: name1=value1; path=/; domain=localhost'
r := CookieManager_check('Set-Cookie: name1=value1;'
, 'abc.test'
, 'http://testabc.test/index'
, false
, 'bug: send other domain''s cookie');
if (r<>0) then Result := r;
r := CookieManager_check('Set-Cookie: name1=value1;'
, 'deny.abc.abc'
, 'http://nodeny.abc.abc/index'
, false
, 'bug: send other domain''s cookie');
if (r<>0) then Result := r;
r := CookieManager_check('Set-Cookie: name1=value1;'
, 'all.abc'
, 'http://all.abc/index'
, true
, 'bug: can not get own cookie');
if (r<>0) then Result := r;
r := CookieManager_check('Set-Cookie: name1=value1; domain=.all.abc'
, 'all.abc'
, 'http://all.abc/index'
, true
, 'bug: can not get own cookie');
if (r<>0) then Result := r;
r := CookieManager_check('Set-Cookie: name1=value1; path=/;'
, 'denyall.abc'
, 'http://denyall.abc.localhost/index'
, false
, 'bug: send other domain''s cookie');
if (r<>0) then Result := r;
r := CookieManager_check('Set-Cookie: name1=value1; path=/;'
, 'denyall.abc'
, 'http://denyall.bc/index'
, false
, 'bug: send other domain''s cookie');
if (r<>0) then Result := r;
if (Result = 0) then Writeln(' ok : testCookieManager');
end;
begin
Writeln(gsIdProductName + ' ' + gsIdVersion);
Halt(TestCookie());
end.
バグの確認のためのコード FORM版
// RadioGroup1, Button1,Button2
// FormCreate, Button1Click, Button2Click
uses IdCookieManager, IdURI, IdAbout;
procedure TForm1.FormCreate(Sender: TObject);
begin
RadioGroup1.Items.Add('http://c.b.a.fishing/'); // ここがセキュリティホールです
RadioGroup1.Items.Add('http://fishingc.b.a/'); // ここがセキュリティホールです
RadioGroup1.Items.Add('http://a.b.c/');
RadioGroup1.Items.Add('http://c.b.a/');
RadioGroup1.Items.Add('http://c.b.a/tea/');
RadioGroup1.Items.Add('http://c.b.a/team/'); // firefox2では表示されません
RadioGroup1.Items.Add('http://q.a/');
RadioGroup1.ItemIndex := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
aCookieManager : TIdCookieManager;
aURI : TIdURI;
s : string;
begin
aCookieManager := TIdCookieManager.Create(nil);
try
aURI := TIdURI.Create('');
try
aCookieManager.AddCookie('Set-Cookie: name=value(c.b.a); path=/; domain=c.b.a', 'c.b.a');
aCookieManager.AddCookie('Set-Cookie: name2=value(c.b.a/tea/); path=/tea/; domain=c.b.a', 'c.b.a');
aCookieManager.AddCookie('Set-Cookie: name3=value(c.b.a/tea); path=/tea; domain=c.b.a', 'c.b.a');
aURI.URI := RadioGroup1.Items[RadioGroup1.ItemIndex];
s := aCookieManager.GenerateCookieList(aURI, False);
ShowMessage(s);
finally
FreeAndNil(aURI);
end;
finally
FreeAndNil(aCookieManager);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IdAbout.ShowDlg;
end;
ダウンロード
indy_10_src_patches
indy_mytest
ブラウザで確認したい場合 【 .で始まるクッキーの場合】
asp.netだとサンプルを作りにくいのでphpをサーバーに置きます。
---サーバーに保存します----phpのファイルです--------
<?php
// cookie_test.php
$s = '';
if (isset($_COOKIE['name1'])) { $s .= 'name1='.$_COOKIE['name1']."\r\n"; }
if (isset($_COOKIE['name2'])) { $s .= 'name2='.$_COOKIE['name2']."\r\n"; }
setcookie ('name1','value1' ,time()+60*60*24*30, '/', '.example.com');
setcookie ('name2','value2' ,time()+60*60*24*30, '/', 'example.com');
header('Content-type: text/plain');
print $s;
?>
-----------------------------------------------
example.comは、適当に自分のドメインに置き換えてください。
このファイルにIEやFirefoxでアクセスしてください。
2回ほどアクセスすると2つクッキーが表示されると思います。
しかし、Indyでは、パッチを適用しない場合は、1つしか表示できません。
バグの再現コードです。 (上のphpとセットで使用します)
-----------------------------------------------
example code
-----------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
Memo1.Text := IdHTTP1.Get(Edit1.Text);
Memo2.Clear;
for i := 0 to IdCookieManager1.CookieCollection.Count-1 do
Memo2.Lines.Add(IdCookieManager1.CookieCollection.Items[i].CookieText);
end;
----------------------------------------------
サーバを経由しないで単体で確認したい場合は、上の DOS版を利用します
おまけ:
C:\WINDOWS\SYSTEM32\DRIVERS\etc\hosts
に、 127.0.0.数字 ホスト名[ドメイン名]
みたいに追加して、apache等のサーバーを起動すると
容易にローカルでデバッグできると思います。
-----------------------
ssl通信のはじめにエラー
最新版は、どうも一緒に配布してあるdllだと古くてエラーになるようです。
ソースコードを見ると以下のようにありました。
自分でコンパイル済みのdll最新版を入れるようにだと・・・
Indy OpenSSL now uses the standard OpenSSL libraries
for pre-compiled win32 dlls, see:
http://www.openssl.org/related/binaries.html
recommended v0.9.8a or later
バグ報告してあげようと思ったのですが、バグ報告ページに接続できないので、あきらめました。
(また海外のメーリングリストは、ウイルス・スパムメールの嵐に遭うので関わる気はありません。)
ポカ。。。(((∂。∂)ン
あれ? 私は誰 いまなにしていました?
あれれ・・・
追記: 2007年7月でも修正されていなかったので、newsグループに報告しました。 追記: Snapshotをみても反応が無かったので、QualityCentralに登録しました。 openされたようです。 追記:2007.10 RightStrがTextEndsWithに変更されていることを確認しました。
関数名が変わっただけで欠陥は直っていないようです。
Indyのバージョンの確認方法
(新規フォームにボタンを貼って、コードを置き換えてください)
uses IdAbout;
procedure TForm1.Button1Click(Sender: TObject);
begin
IdAbout.ShowDlg
end;
Indy10のクッキー欠陥 (version 〜10.1.6)
(version 10.1.6)
Indy10のクッキーの欠陥を
もう一つ発見しましたので
掲載しました。
Indy10を使ってブラウザとして利用されている方は注意が必要です。
Indyの最新版のインストールの仕方[Delphi 2005]
に掲載しています
追記:2009.10.16 IndyTiburon.zip(Indy 10.5.7)にて修正されているようです。 IndyTiburon.zipに移行して indy10.zip(10.2.3)は開発がとまったようですので注意が必要です。
追記:2017.04.07 Indy 10.6.2は、未修正が1個ありました。
起動したプログラムが終了するまで待機するには
執筆:2007.01.22
編集:2007.01.22
起動したプログラムが終了するまで待機するには
System.Diagnostics.Process
Start(command)
Start(command, コマンド ライン引数)
WaitForExit()
WaitForExit(最大指定したミリ秒間待機)
[VB.NET]
Dim p as System.Diagnostics.Process
p = System.Diagnostics.Process.Start("notepad.exe")
p.WaitForExit()
[C#][C++]
System.Diagnostics.Process p;
p = System.Diagnostics.Process.Start("notepad.exe");
p.WaitForExit();
[Delphi .NET]
uses System.Diagnostics
// ..
var p : System.Diagnostics.Process;
begin
p := System.Diagnostics.Process.Start('notepad.exe');
p.WaitForExit(); // 終了するまで待機します
end;
WshShellオブジェクト
[Delphi 32]
uses comobj;
procedure TForm1.Button1Click(Sender: TObject);
var WshShell , oExec : Variant;
begin
try
WshShell := CreateOleObject('WScript.Shell');
oExec := WshShell.Exec('notepad.exe');
// [Status] WshRunning : 0 , WshFinished : 1
while oExec.Status = 0 do Sleep(100);
except
WshShell := Unassigned;
end;
end;
[VBScript]
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("notepad.exe")
Do While oExec.Status = 0
WScript.Sleep 100
Loop
' msgbox "OK?"
参考
起動したプログラムの終了を待たない関数は
ShellExec関数(Win32API)
などがあります。
バージョン管理 win編 Subversion(Quick Start)
執筆:2007.01.10
忘れっぽいので、覚え書きです。
※ Windowsで使う用途で記述していますが、Linux系なら標準で利用できるようです。
※ インストール後、試用20分間程度のまとめです。
インストールした経緯:
StarTeamだと比較的最新のDelphi (BDS)以外管理できないし
Winのソフトなどをcvsでバージョン管理しようとおもっていたのですが、
cvsサイトにいっても、うまくファイルを揃えることができませんでした。
そして偶然、Subversionという類似品を発見し、インストールしました。
下記の3つをそろえると、とても操作性がいいです。very good!
の3つをダウンロードします。
インストール直後の要点
環境変数の設定
インストーラーだと自動設定されていると思います。
手動の場合は。
マイコンピューター:プロパティから設定しましょう。
SET APR_ICONV_PATH="C:\Program Files\Subversion\iconv"
tortoisesvnのヘルプを見ながらテストしてみます。
日本語パックをインストールしてからのほうがいいと思います。
基本的に、tortoisesvnのヘルプを読むだけで操作できるようです。
データが消えると困るので
テストは、フラッシュメディアでやってみました。
同一PCで、管理と両方使う場合
1.
リポジトリの root フォルダとして SVN という空のフォルダ (例: D:\SVN\) を作成します。
2.
D:
cd D:\SVN
svnadmin create --fs-type bdb MyNewRepository
クライアント用途の場合は、ここからはじめます。
ここから下は、
使い方を誤ると、悲惨なことになりますので
消えても痛手を受けないような
フラッシュメディアなどのディスクでテストすることをお勧めします。
よーく 付属の説明書を読んでからにしましょう。
3.
フラッシュメディアなどに
適当?にフォルダを作成します
MyProject\trunk
MyProject\branches
MyProject\tags
5.2.1. リポジトリレイアウトを参照のこと
4.
MyProjectフォルダを右クリックして、
インポート をクリックします。
file:///D:/svn/MyNewRepository/MyProject
リポジトリブラウザでみてみましょう。
しっかりできていますね?
5.
適当な作業フォルダで
フォルダを右クリックして、
SVNチェックアウト
をクリックします。
作業フォルダにファイルがでてきましたか?
(.svnフォルダが隠し属性で作られています。)
あとは、
付属の説明書をみながら、
楽しく、試用します。
そして、保存する構造を決定して運用します。
[tT]humbs.db */[tT]humbs.db
*.[tT][mM][pP] */*.[tT][mM][pP]
は共通の除外ファイルに設定していた方がいいでしょう?
Linux系にアクセスする場合は、大文字小文字を区別するので注意しましょう。
リポジトリのコピーの仕方。(バックアップ)
svnadmin hotcopy path/to/repository path/to/backup --clean-logs
詳しくは、説明書を参照。
【Tios】
・
誤登録などのデータの完全削除
tortoisesvnでは、できないそうです。
(B.4.3. svndumpfilter の使用)
svndumpfilter を利用します。
svnadmin dump
svnadmin load
を使います
:後述
【ここがいまいち】
・
変更差分を表示するで、EUCだと文字化けする
(ブラウザみたいに表示する文字コード変更がない)
SJISとutf8でテストした限りは大丈夫っぽかった。
・
一度登録すると、削除しても変更履歴として残り 閲覧可能。
保護する面では、ある意味そうあるべきですが、
指定したリビジョンの完全削除くらいほしいところ
・
無視リストにファイルを入れて更新した後、
無視リストから削除をしても コミットできない。
(バグかもしれない)
ほかの更新と合わせると適用される。
変更単位は、リビジョン毎(コミット単位)
従って、不要なリビジョンを削除した時に
更新チェック時の問題が発生します。
ファイル単位でやって欲しい気が・・・
リポジトリブラウザの
右クリックメニューに
ここを 圧縮して保存が欲しい!!
自分で作ってもいいが・・・
機能要望にだそうヨ!!
【最後に】
古いバージョンも同時に、修正したりしたかったので
いいツールが無料で見つかってよかったです。
自動バックアップは、.vbsに処理を書くからいいとして
いままで、古いプロジェクトをlzhかzipに圧縮してたので、
いままでどうり、
ソースとかを zip,lzh,gzのどれかで、自動保存もしてくれると非常にありがたいのですが・・・
イベントが登録できるようなので
やり方は、おぉおぃ探すことにしましょう。
【削除と再構築編】
完全に消したいデータが、でてきた場合には避けられない。
手順
完全削除には、リポジトリの作り直しが必要?
パイプ | でつなげるのも可。
リダイレクト ><
(詳しくはヘルプ MSDOSを参照)
?作業がおわるまで、ロックする?。
svnadmin dump D:/svn/oldrepo
上記のでは、infile-dumpfileには、repos-dumpfileを指定します。
注意:後述の説明をみましょう。
svndumpfilter exclude --drop-empty-revs "/削除するパス" < infile-dumpfile
svnadmin create --fs-type bdb D:/svn/newrepo1
svnadmin load D:/svn/newrepo1 < outfile-dumpfile
D:/svn/oldrepoフォルダの名称変更または、削除します。
次にnewrepo1の名称を変更します
newrepo1をoldrepoに名称変更
rename D:/svn/newrepo1 D:/svn/oldrepo
構築後の問題
--drop-empty-revs を指定すると ・リビジョン番号の番号詰めが行われます。
・バグツールと連携している場合、番号が照合しなくなる可能性があります。
一般公開している場合は、--drop-empty-revs は指定しない方が無難でしょう。
作業フォルダの更新でエラーの場合は、
作業フォルダ内の
必要なファイルを別の所に移動して、チェックアウトからやり直し。
予期しないデータの破損をするおそれが高いので
・バックアップを忘れない。保存しておく。
・説明書をよく読み理解しておく
・