http://shopap.lenovo.com/jp/products/tablets/thinkpad2/
センサー名 | カテゴリ | 説明 |
Broadcom GNSS Geolocation Sensor | Location | GNSS (GPS) |
簡易デバイス方向センサー | Orientation | |
HID センサー コレクション: Custom | Motion | |
HID センサー コレクション: Accelerometer | Motion | 加速度センサー |
HID センサー コレクション: Gyrometer | Motion | ジャイロセンサー |
HID センサー コレクション: Compass | Orientation | コンパスセンサー |
HID センサー コレクション: Inclinometer | Orientation | 傾きセンサー |
HID センサー コレクション: Orientation | Orientation | 方向センサー |
HID センサー コレクション: Ambient Light | Light | 環境光センサー |
Delphi XE3 のセンサー機能を使って取得した生ログは次の通り。
|
利用可能なすべてのセンサーを列挙するコードは次の通り。
|
VCL でも FMX でもコードは同じ。これだけセンサーが揃っていればかなり遊べると思う。
できました。人柱バージョンの概略はこちらからどうぞ。
今の所人柱機能に文句を言ってくるヒトが居ない (使われてないのかもしれませんが) ので、折をみてジャンクボックスに移動します。
本バージョンはメンテナンスビルドです。UAC / WOW64 環境下で正常動作しない可能性があるのを潰してみたつもりです。様々な環境で試した訳ではないので、何とも微妙な表現になっている事をご容赦ください。
元ネタは以下。
iso-2022-jp で半角カナや機種依存文字が使えないのは認識していたけれど、CP932 (Shift_JIS) から Unicode へはちゃんと変換されるのだし、ANSI Delphi ではうまく行くのならどうにかすればどうにかなるハズだと思った。iso-2022-jp も Shift_JIS も 同じ JIS X 0208 を文字集合としているのだしね。
free-ml では半角数字を詰めてくれちゃうのでテキストエディタにコピーして加工したりしてたら思いのほか誤字脱字を量産してしまった。動くのは動くのでサンプルとしてはいいのだろうけれど、気持ち悪いので最終的なコードを書き直してみた。
|
このコードは、
という事を行っている。やっている処理の割にはスッキリとした記述になったと思う (やろうと思えばもっと短くできるけど)。ここで使われている TIso2022jpEncoding は iso-2022-jp <-> Shift_JIS <-> Unicode (UTF-16LE) するためのエンコーディングクラス。思いっきり totonica 氏作の CP51932Encoding のパクリである (w
山本隆さんの "全角チルダ/波ダッシュ問題に対応したTEncodingクラス" とマージしてみても面白いと思う。
余談だけれども、上に書いたように Delphi 標準の正規表現はバージョンによって挙動が異なるので、それぞれのバージョンで正規表現を試した方がいい (特に XE)。SkRegExp ならば問題があっても入れ替えればバージョンを揃えて挙動を一致させる事ができるため、僕自身は SkRegExp を使うことが多い。
PerlRegExp Trainer には XE / XE2 / XE3 でコンパイルした 3 つのバイナリが含まれている。左が PerlRegExp Trainer (XE バイナリ) で、右が SKRegExp Trainer。
元ネタはらいなタンさんの以下のツイート。
正直知らんかった (w 丁度いい機会なので、Delphi VCL Tips にまとめてみた。
幾つか手持ちのものでテストしてみたけれど、客観的にみて、体感できる程の効果が得られた気はしなかった。オーナードローしてるとか、FireMonkey アプリとかの方がネイティブモードのメリットを享受しやすいのではないかと思う...理屈的に。
何が 「丁度いい機会」 なのかと言うと、BDE 関連の質問が続いたから。"BDE Administrator" や "Database Desktop" には、コレを参考にして requireAdministrator な外部マニフェストを置けばいいと思うの。内部マニフェストにするのは利用規約的にどうかと思うし。
ただ、これをやったからといってアプリケーション側の BDE の問題がすべて解決するかと言えばそうではないのでご注意。
関連して更新。
変更点は以下の通り。
アプリケーションマニフェスト絡みの軽微な変更です。
XN Resource Editor を使えば、内部マニフェストを持たないアプリケーションにアプリケーションマニフェストを埋め込む事ができます ([リソース | リソースを追加 | XP Theme Manifest])。
アプリケーションマニフェスト の件を簡単に試すためのコンポーネント。64bit / FireMonkey (Windows) にも対応しています。
パッケージが用意されているのは Delphi 2009 ~ XE3...Unicode 版 Delphi ですね。 Delphi 6 ~ XE3 です。これ以外の Delphi ではパッケージを自前で作るか、ユニットを既存のパッケージに追加してインストールする事になります。
インストール手順に一部トリッキーな箇所がありますので、readme.txt はちゃんと読んでください。
インストールすると TVistaManifest / TVistaAdminManifest / TNativeManifest / TNativeAdminManifest が追加されます。TXPManifest / XPMan と同じ理屈なので、インストールせず VistaMan / VistaAdminMan / NativeMan / NativeAdminMan として使うこともできます。
コンポーネント | ユニット | レベル | 説明 |
TXPManifest | XPMan | asInvoker (2007 以降の場合) | Delphi 標準添付。FMX では使えない。 |
TVistaManifest | VistaMan | asInvoker | 2007 以降では XPMan と同じ効果になる。 |
TVistaAdminManifest | VistaAdminMan | requireAdministrator | 管理者権限への昇格プロンプトを出す。 |
TNativeManifest | NativeMan | asInvoker | TVistaManifest の効果に加え、ネイティブモードで動作。 |
TNativeAdminManifest | NativeAdminMan | requireAdministrator | TVistaAdminManifest の効果に加え、ネイティブモードで動作。 |
コードが皆無のコンポーネントなのに、アイコンとパッケージ作成に手間を取られてしまいました。Delphi 2007 以前のパッケージがないのはそのためです (飽きましたw)。「パッケージ作ったよー」 という方がいらっしゃいましたらご連絡下さい...てか、作って下さいお願いします。
現在アップされているものは twitter でツイートした時のものよりも新しく、小アイコン (16x16) の視認性が向上しています。
上記コンポーネントを使う (または uses 節に追加する) 場合には、"ランタイムテーマを有効にする" をオフにしなくてはなりません。
XPMan、VistaMan と来て、何故 SevenMan じゃないのかと思うかもしれませんが、そうなると次は "エイトマン" ですよ?どっかから訴えられたらどうしてくれるんですか!
リリースされました。正規表現のメタ文字をエスケープする EscapeRegExChar() クラスメソッドが追加されています。
使い方と存在理由は "文字列を正規表現形式にエスケープする - 正規表現の活用 (主に Delphi 2009 以降)" に書いてありますのでご一読下さい。
従来からあった EncodeEscape() は、例えば () {} 等をエスケープしてくれませんが、これは元々そういった用途のために作られたものではないからだそうです。今回新しく追加された EscapeRegExChar() は Delphi XE 以降の TPerlRegEx.EscapeRegExChars() と互換性があります。
アプリケーションマニフェストはリソースとして実行ファイルに埋め込まれます (内部マニフェスト)。このリソースは下の画像のような構造になっています。
リソーススクリプトファイルで書くと以下のようになります。
|
RT_MANIFEST (24) がリソースタイプ "XP Theme Manifest" で、CREATEPROCESS_MANIFEST_RESOURCE_ID (1) が "1" に対応しています。リソースの種類と ID は固有でなくてはならず、重複するとコンパイラが "Duplicate Resource" というエラーを出すか、ワーニングにして重複リソースを自動で取り除いてくれます。
...さて、Delphi 2007 ~ XE で "ランタイムライブラリを有効にする" にチェックを入れて、XPMan を使ったらどうなるでしょうか?
環境によっては "Duplicate Resource" になりません。これは言語の種類が異なるため、言語リソースとして複数登録されるからです。しかしながら、この状態だと意図しないリソースが使われてしまう事があり、誤動作の原因となってしまいます。個人的にはアプリケーションマニフェストは "ニュートラル言語" で統一すべき (言語別に持つ必要はない) だと思うのですが。
Manifest Ex ではどうやっているのでしょう?すべて ID が 1 のマニフェストリソースを 4 つ用意しているのでしょうか?そのようにすると、言語を変更しない限りパッケージ内で "Duplicate Resource" になってしまいますし、言語を安易に設定してしまうと逆に "Duplicate Resource" にならずに困ったことになります (適当でない言語にすべきではない)。では、ID を変更しているのでしょうか?ですが、ID が 1 でないマニフェストリソースはアプリケーションマニフェストと解釈されません。
Manifest Ex の Source フォルダにある Install_Resource と Replace_Resource がミソです。初期状態で Source フォルダにある 4 つの *.res は Install_Resource 内の *.res と同じもので、ID が 2 / 3 / 4 / 5 と振られています (ID = 1 は XPMan)。これにより、"Duplicate Resource" にならずにパッケージをインストールできます。
"インストール後に Replace_Resource の中身を Source にコピーしろ" とReadme.txt にある事でお解かりかとは思いますが、Replace_Resource 内の *.res はすべて ID が 1 となっています。これにより、T~Man を重複して貼りつけた場合には "Duplicate Resource" になるようにしてあるのです。
逆に言えば、コピーの手順を忘れてしまっている場合、ID が 1 でない無効なアプリケーションマニフェストが埋め込まれてしまい、期待した動作となりません。
アプリケーションマニフェストを埋め込んでも思ったようなような動作にならない場合には、XN Resource Editor 等のリソースエディタで実行形式ファイル (*.exe) を実際に確認してみる事をオススメします。
アプリケーションマニフェスト を簡単に追加するためのコンポーネント。64bit / FireMonkey (Windows) にも対応しています。
今回の変更は、インストール用リソースの ID 変更です。
Value | ID | Component |
1 | CREATEPROCESS_MANIFEST_RESOURCE_ID | TXPManifest |
2 | ISOLATIONAWARE_MANIFEST_RESOURCE_ID | - |
3 | ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID | - |
20 | N/A | TVistaManifest |
21 | N/A | TVistaAdminManifest |
22 | N/A | TNativeManifest |
23 | N/A | TNativeAdminManifest |
winuser.h を眺めてみたら ID=16 まで予約されているようなので、ID=2~5 を ID=20~23 へ変更しました。もちろん、実行時用リソースの ID はすべて 1 (CREATEPROCESS_MANIFEST_RESOURCE_ID) になります。理屈上、必須の修正ではありません。
Manifest Ex に関連して更新。
rev.31~32 の変更点は以下の通り。
最初のは...
こういう事です...絶対に忘れちゃうと思ったので。イチイチ資料を漁るのは面倒ですからね。
そういえば、いつからかは不明なのですが、オリジナルの XN Resource Editor 3.0.0.1 が DL できなくなっているようです。Internet Archive で探せばまだ DL できますけれど...。
例としてバイナリエディタ Stiring にアプリケーションマニフェストを埋め込んでみます。
できました。問題なさそうなのでジャンクボックスへ移動しました。
個人的には使わない機能ですが、あればあったで便利だと思ったので追加しておきました。元ネタは "Interbase、DBgridの数値に位取り表示をするには (Embarcadero Discussion Forum)" です。
自動的にクリップボードに入る訳ではないので、全選択 (〔Ctrl〕+A) してコピー (〔Ctrl〕+C) してからフォームデザイナで 〔Ctrl〕+V (貼り付け) してください。
余談ですが、選択 / 挿入 / 更新 / 削除クエリボタンで生成される SQL のパラメータは WHERE 句のパラメータ (キー項目) が ":_(アンダーバー)+項目名" で、それ以外が ":項目名" となっています。これは Delphi でコードを書くときに誤りを見つけやすくするためです。また、TIBUpdateSQL の仕様でパラメータを生成すると、(仕様上仕方ないですけど) パラメータの命名規則に一貫性がなく都度コードを書き換える必要が出てきます。
何を言ってるか解らないのであれば、実際にボタンを押して SQL を生成してみてください。そして WHERE 句のパラメータが TIBUpdateSQL と同じ仕様だった場合の事を考えてみましょう。
SQL 文 | IBConsole | TIBUpdateSQL |
SELECT (RefreshSQL) |
:_項目名 | :項目名 |
UPDATE (ModifySQL) |
:_項目名 | :OLD_項目名 |
DELETE (DeleteSQL) |
:_項目名 | :OLD_項目名 |
そのままでは WHERE 句のコードの共用 (コピペを含む) ができない事が解ると思います。本当にちょっとした事なのですが、これだけの事で随分と効率が違うものです。「全部 ":項目名" で統一すればもっと効率がいい」?...確かにそうかもしれませんが、WHERE 句 (キー項目) はアンダーバー付きとしておく事で、ロジックのミスを見つけやすくできるのですよ。
「パラメータなんぞ使わずに変数をそのまま + で連結すりゃいいじゃん。何言ってるかわかんねぇ!」...オーケーブラザー、SQL インジェクションに気を付けて達者で暮らすんだぞ。
元ネタは "[delphi-users:3063] FillRectとRectangleの差"
ペン色=前景色、ブラシ色=背景色 という思い込みがあるとなかなか理解しにくいと思います。
上段がソリッドブラシ (Brush.Style = bsSolid) で下段がハッチブラシ、左列が透過で、右列が不透過の例です。画像内の左側が FillRect()、右側が Rectangle() です。
ここには 3 つの色が存在しています。ペンの色 (赤)、ブラシの色 (青)、そして背景色 (緑) です。VCL では背景色はブラシ色で設定され、背景モードには
が設定されます。つまり、ハッチブラシを使った場合、背景色と背景モードを変更しないと、
という現象になります。繰り返しになりますが、VCL ではブラシ色を変更すると、背景色がブラシ色に設定され、背景モードも変更されます。よって、背景色及び背景モードを変更したい場合には "描画コマンドの前" かつ "ブラシ変更の後" に行う必要があります。
背景色または背景モードが影響を及ぼすのは、
"ペンの背景色" というと違和感があるかもしれませんが、ハッチブラシと同じようなものです。破線の隙間の色は背景色または背景モードの影響を受けます。
では以下のコードを実行するとどのように表示されるでしょうか?
|
少し下にスクロールすると答えの画像があります。どのように描画されるのかを、まずは想像してみてください。フォームの色はデフォルトの clBtnFace です。
想像通りでしたか?
これでも随分端折った話をしています。TCanvas のメソッドは Windows GDI をラッピングしていますので、詳細については MSDN の記述と、(Vcl.)Graphics.pas の実装を確認してみてください。
おっと、コレを書くのを忘れていました。
つまりは、ペン色もブラシ色も前景色なのです。そして、ラスターオペレーションにおいては "前景モード" というのがあります。
|
フォームの色は clBlue (青) を指定してあります。
VCL において前景モードは Pen.Mode に割り当てられています。API だと SetROP2 / GetROP2 です。実行した結果は以下の通りです。
予想通りでしたか?前景モードがペン色に対してだけ効果があるのであれば、下の長方形の内側の色はブラシ色で塗りつぶされているので黄色になるハズですが、そうはなっていません。前景モードの効果はペンまたはブラシの色に作用します。また、画像の通りフォントの色には作用しません。
Pen.Mode はブラシの色にも作用します。この仕様なのであれば、Brush.Mode というのに SetBkMode / GetBkMode を割り当ててくれてもよかった気はしますが、そうなると SetBkColor / GetBkColor はどうするんだ?という話になっちゃいますからね。
Rectangle での描画を FillRect に変えると以下のようになります。
予想通りでしたか?FillRect は背景モード (SetBkMode) だけでなく前景モード (SetROP2) も効きません。
この辺の詳細は "Windows API バイブル 1 (ISBN-4881350382)" とか Windows 3.1 時代の本に記述があるのですが、引越しのドサクサで手元には "Windows API バイブル 2 (ISBN-4881351060)" しか残っていません...まぁ、あったとしてもモノクロ印刷なので直感的には理解できないかもしれませんが。
VCL の TCanvas / GDI においては 前景色 (Font.Color / Pen.Color / Brush.Color)、前景モード (Pen.Mode / SetROP2)、背景色 (SetBkColor)、背景モード (SetBkMode) によって描画色が決定されます。
折角なので関連ネタを。
前景モードは現在画面に表示されている色と、描画しようとしている色をどういう風に混ぜ合わせるか?という指定を行います。RGB ですから、"光の三原色" ですね。混ぜれば混ぜるほど明るくなります。混ぜれば混ぜるほど (理論的には) 黒に近づく "色の三原色" とは反対です。
要は RGB 値をビット演算するという事ですね。ですので、混ぜ合わせるパターンは 16 個あります。詳細は Wikipedia の 論理演算の項を参考にしてみてください。
Pen.Mode の初期値は pmCopy です。これは画面の色に対して、描画しようとしている色...つまり前景色で上書きします。既に描画されている色には左右されないという事になります。
pmCopy に対応する SetROP2 に指定できるモードの定数は R2_COPYPEN です。"PEN" とか名前に入れるから混乱するのですよ、まったく。ちなみに、pmCopy 等の TPenMode と R2_COPYPEN 等の定数には値に互換性がありませんので注意してください (キャストしちゃダメですよ)。
TPenMode | fnDrawMode | TForegroundMode | ビット演算 | 論理結合子 | |||
定数 | 値 | 定数 | 値 | 定数 | 値 | ||
pmBlack | 0 | R2_BLACK | 1 | fgmBlack | 1 | False (黒) | 偽 / 矛盾 |
pmWhite | 1 | R2_WHITE | 16 | fgmWhite | 16 | True (白) | 真 / 恒真 / トートロジー |
pmNop | 2 | R2_NOP | 11 | fgmNop | 11 | 画面色(変更されない) | 命題 [画面色] ⇔ pmCopy |
pmNot | 3 | R2_NOT | 6 | fgmNot | 6 | not 画面色 | 否定 [画面色] ⇔ pmNotCopy |
pmCopy | 4 | R2_COPYPEN | 13 | fgmCopy | 13 | 前景色 | 命題 [前景色] ⇔ pmNop |
pmNotCopy | 5 | R2_NOTCOPYPEN | 4 | fgmNotCopy | 4 | not 前景色 | 否定 [前景色] ⇔ pmNot |
pmMergePenNot | 6 | R2_MERGEPENNOT | 14 | fgmMergeFCNot | 14 | (not 画面色)or 前景色 | 含意 ⇔ pmMergeNotPen |
pmMaskPenNot | 7 | R2_MASKPENNOT | 5 | fgmMaskFCNot | 5 | (not 画面色) and 前景色 | 逆非含意 ⇔ pmMaskNotPen |
pmMergeNotPen | 8 | R2_MERGENOTPEN | 12 | fgmMergeNotFC | 12 | 画面色 or (not 前景色) | 逆含意 ⇔ pmMergePenNot |
pmMaskNotPen | 9 | R2_MASKNOTPEN | 3 | fgmMaskNotFC | 3 | 画面色 and (not 前景色) | 非含意 ⇔ pmMaskPenNot |
pmMerge | 10 | R2_MERGEPEN | 15 | fgmMerge | 15 | 前景色 or 画像色 | 論理和 |
pmNotMerge | 11 | R2_NOTMERGEPEN | 2 | fgmNotMerge | 2 | not (画面色 or 前景色) | 否定論理和 |
pmMask | 12 | R2_MASKPEN | 9 | fgmMask | 9 | 画面色 and 前景色 | 論理積 |
pmNotMask | 13 | R2_NOTMASKPEN | 8 | fgmNotMask | 8 | not (画面色 and 前景色) | 否定論理積 |
pmXor | 14 | R2_XORPEN | 7 | fgmXor | 7 | 画面色 xor 前景色 | 排他的論理和 |
pmNotXor | 15 | R2_NOTXORPEN | 10 | fgmNotXor | 10 | not (画面色 xor 前景色) | 否定排他的論理和 / 同値 |
論理結合子の列に ⇔ がないものは、画面の色と前景色が逆でもビット演算した色は同じになります (オペランドを入れ替えても得られる値は同じ)。⇔ が書いてあるものは、画面の色と前景色が逆だと色が異なります (オペランドを入れ替えると結果が異なる)。逆にした時に同じ色を得るための定数が右側に書かれています。
例えば、画面が青で前景色が赤の場合、pmCopy だと得られる色は赤です。逆に画面が赤で前景色が青の場合に得られる色を赤にしたいのであれば、pmNop を使うという事になります。
真理値表に 左上から右下へ対角線を引いて、値が線対称になっていればオペランドを入れ替えても結果は同じになります。非対称のものはオペランドを入れ替えると結果が異なります...この場合、対角線を軸に裏返すとオペランドを逆にした時に同じ値を得る真理値表を得ることができます。
...対角線を軸に裏返せば P と Q が入れ替わるので、よくよく考えてみれば当たり前のことなのですが。
TForegroundMode とあるのはですね、
[VCL.CanvasHelper.pas] |
|
こんな TCanvas 用クラスヘルパ用の定数なのです。このクラスヘルパを使うと、TCanvas に
が追加されます。TForegroundMode は SetROP2 用の定数と互換性がありますのでキャストしても大丈夫ですし、TPenMode と相互変換するための関数も用意されています。
|
このような使い方ができます。
今日は みんな大好きビット演算! のお話でした。
一応書いておきます。
演算子ってのは聞いたことがあると思います。+ - * / OR AND ...これらは演算子です。"オペレータ" と呼ばれます...で、演算対象となるもの... A OR B であれば A や B の事ですが、これは被演算子です。"オペランド" と呼ばれます。
not 演算は not A のようにオペランドは一つしかありません。not は 単項演算子 です。さっきの OR 演算には オペランドが 2 つあります。OR は 二項演算子 です。C 言語などにはオペランドを 3 つ取る 三項演算子 があります (A ? B : C)。Delphi には似たような動作をする Math.IfThen() / StrUtils.IfThen() または Indy の IdGlobal.iif() がありますが、これらは関数であり演算子ではありません。
「"(not 画面色)or 前景色" なんてオペランド入れ替えられないじゃん!」 と思った方はスルドイです。ここで言っているオペランドは 論理演算のオペランド で、P を画面の色 (なオペランド)、Q を前景色 (なオペランド) として考えて頂ければ話は通ると思います。論理結合子の 16 個すべてが二項演算子として存在するものと思ってみてください。
XE 以降だとプロジェクトマネージャに "ビルドグループ" 管理機能がついています。
赤丸のボタンを押すと "ビルドグループ" が表示され、その名の通りビルドするグループを管理できます。
ビルドグループペイン内にある [ビルドグループを新規作成] ボタンを押下しグループ名を入力すると、ビルドするグループをまとめられます。コンボボックスでグループを選び、
一括ビルドボタンを押すと、すべてのビルドが開始されます。XE では "プロジェクトの有効 / 無効" と "構成" が管理できます。XE2 以降だと加えて "プラットフォーム" も管理できるのでさらに便利です。画像の例だと一括ビルドで 23 の実行バイナリ (すべてリリースビルド) が一気に生成されます。
複数のサブプロジェクト (或いはパッケージ、或いは DLL) が共通で利用しているクラスや関数にバグが見つかったり仕様変更があった際に一括ビルドできるので、"このモジュールだけビルドし忘れてた" 的なミスを減らす事ができます。
XE 以前であればむしろこっちが先に欲しかった機能なのですが、
ドロップダウンして構成を選択するとプロジェクトグループ内のプロジェクトの構成 (デバッグ/リリース) がすべて一度に切り替えられます。独自に作成した構成 (オプションセット) があれば、そちらにも切り替えられます...リモートデバッグ構成とかですね。
同様にプラットフォームも切り替えられます。これら 2 つのドロップダウンリストはカレントプロジェクトの構成 / プラットフォームを切り替えるものではありません。プロジェクトグループ内のすべての構成 / プラットフォームを一発で切り替えてくれます (プロジェクトグループ内に 1 プロジェクトしかないのであれば、カレントプロジェクトと同義ですが)。
すべてのプロジェクトの 64bit 版だけをビルドしたい場合とかに便利です。知ってるヒトには何を今更かもしれませんが、最近よく使うので紹介してみました。
XE3 は Windows 8 対応 (デスクトップ) アプリケーションを作れます。ここに嘘はありません。本当です。
Windows 8 のデスクトップアプリケーションを作るためのガイドラインは以下にあります。
現在では、Windows ストアにデスクトップ用のアプリケーションを登録できるようになっています (ストアで〔Win〕+Q して検索するとデスクトップアプリも出てきます)。しかしこれがまたハードルが高い。
この時点で個人は無理です。(日本で言う所の) フリーウェアを登録する事のメリットはありません。デスクトップアプリは ModernUI 用アプリと違い、ストアから DL する方式ではないからです...つまり、単なる広告にしかなりません。
個人的にはデスクトップアプリを Windows 8 ストアに載せる必要性があるとは思えませんが、それでもやってみたいという方がいらっしゃるかもしれません。結論から言えば Delphi XE3 で "Windows 8 ストア用デスクトップアプリを作るのは事実上無理" です。
理由は "Windows 8 デスクトップ アプリ認定要件" の中に書いてあります。
3.1 (.NET の話) / 3.5 (特殊な事やらないとできないんじゃ?) はいいとして、/NXCOMPAT (3.3) /DYNAMICBASE (3.4)は PE ヘッダのオプションフラグ ({$SetPEOptFlags}) を設定する事によって回避できます。
|
このように定義して、
|
*.dpr にコンパイラ指令を加えれば OK です。古い Delphi は {$SetPEOptFlags} に対応していませんので、外部ツール (EDITBIN.exe 等) を使ってフラグを書き換える必要があります。アプリケーションマニフェストも適切に記述しなくてはなりません。
「ただし /SafeSEH (3.2)...テメーはダメだ!」 回避のしようがありません。詳細は "/SAFESEH (安全な例外ハンドラがあるイメージ)" をお読みください。/SafeSEH は PE ヘッダのオプションフラグではなく、機構なのです。ちなみに C++Builder は対応しています。
コンパイラのサポートなしに SEH 対応させるとなると、それが可能になったとしても既存のアプリケーションのコードを大幅に書き換えなくてはならなくなるでしょう。/SafeSEH の件は 32bit アプリケーション限定の話ですので、64bit とはコードが別になってしまいますし、OS X (FMX) とかには関係のない話です。逆に言えば、64bit 専用アプリであれば Windows ストアに登録できるかもしれません。
「/SafeSEH どうにかしてよー」 の QC は QC#106781 です。
|
理屈的には /SafeSEH 以外の問題は現行の Delphi でも対応できると思いますので、Windows ストアへ 32bit デスクトップアプリを登録したい方は Vote してください。個人的には Windows ストアへデスクトップアプリを登録する必要性 / 必然性を感じていませんが、できないよりはできた方がいいのは当たり前の事なので Vote しておきました。
元ネタは
でした。
"Windows アプリ認定キット (Windows App Certification Kit)" は Windows SDK に含まれています。Windows SDK は以下から DL できます。
インストールが完了すると、スタートメニューに ACK が登録されます。
このツールに食わせるのはインストーラでなくてはなりません...つまり、最終的なインストールイメージを先に作成する必要があります。EXE 単体をテストする事はできません。ちなみにこのツールの実行にはアフォのように長い時間が掛かります。コーヒー飲んで待ってるとかいうレベルじゃありませんし、途中でアカウント切り替えとかも行われます。
ここまで書いて思ったのですが、「EXE が自動更新 / 追加ダウンロード機構を備えていれば、最初のアプリ (ローダ) さえ通してしまえば何でもアリなんじゃね?」という気がしないでもないですが...ここのトコはどうなってるのでしょうね?それと、理屈からいって作成したアプリ (EXE) が通ったとしても、サードパーティの DLL 等を使っていればそちらが引っ掛かる可能性もありますよね。
さらにハードルが上がったような。
...さて。gdgd 書いていたのは、Delphi XE3 で作ったシンプルなバイナリを Install Aware 2012 でインストールパッケージ化し、それを ACK に食わせていたからです。
|
フォームには何も貼っておらず、初期状態です。
ちょっと失敗しちゃいました。ユーザー切り替えの際に放っておかないと、マルチユーザー セッションのテストに不合格になります。ログイン画面になってもそのまましばらく放置しなければならないようです。
全体の結果は以下にあります。「やっぱダメじゃん!」 と早急な結論を出す前にちゃんと中身を確認してみてください。
警告またはエラーになった箇所は以下の通り。
アレ?これって /SafeSEH 対応してなくても Windows ストア通過するんじゃ?試したのは 32bit バイナリなんですけど?予想外 (?) でしたが、少なくとも素の XE3 バイナリには問題らしい問題はないようですね。多分、XE2 でも似たような結果になると思います。
Windows ストアは "64bit 版も用意されている事が望ましい" とされているようですので、基本的に XE2 以降を使った開発となりそうです。
二度目のトライ。WM_QUERYENDSESSION / WM_ENDSESSION のコードを以下のように書いて、
|
アプリケーションマニフェストも書き換えてみました。
|
コレでダメなら何なのだろう?前回のエラーメッセージのパスはアプリケーション (の EXE) のものだったし...お、レポートが生成されたようです。
一応合格しました。全体の結果は以下にあります。
"システムの再起動マネージャーのメッセージに従う" のトコと "マルチユーザー セッションのテスト" のトコは、インストーラ絡みのようですね。サイレントインストールできないタイプのインストーラだと警告を消せないかもしれません...何故なら、ログオフした後の別セッションでインストーラが起動しても、入力項目がある限りインストールはそこから先に進まないからです。
アプリケーションマニフェストのワーニングが意味不明ですが、警告で済んでいるのでなんとかなるかもしれません。というか、これって半分はインストーラの作り方 (設定方法) にコツがあるんじゃないでしょうかね?
ACK の動きやレポート結果にも疑問が残りますし、結局のトコロ Windows ストアにデスクトップアプリを登録できるかどうかは出たとこ勝負 なんじゃないでしょうか?
BACK | 古いのを読む | 新しいのを読む |