2014年05月24日

権限昇格用アイコンあれこれ

とりあえずメモ
TestShieldIcon.png
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <ComObj.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    ::CoInitialize(NULL);
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    ::CoUninitialize();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonLargeClick(TObject *Sender)
{
    HICON phico = NULL;
    HRESULT hr = ::LoadIconMetric( NULL, MAKEINTRESOURCE(IDI_SHIELD), LIM_LARGE, &phico );
    OleCheck(hr);
    Image1->Picture->Icon->Handle = phico;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSmallClick(TObject *Sender)
{
    HICON phico = NULL;
    HRESULT hr = ::LoadIconMetric( NULL, MAKEINTRESOURCE(IDI_SHIELD), LIM_SMALL, &phico );
    OleCheck(hr);
    Image2->Picture->Icon->Handle = phico;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ShieldIcon1Click(TObject *Sender)
{
    ShowMessage(L"test");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonAddMenuItemClick(TObject *Sender)
{
    HICON phico = NULL;
    TIcon *icon = NULL;
    try {
        HRESULT hr = ::LoadIconMetric( NULL, MAKEINTRESOURCE(IDI_SHIELD), LIM_SMALL, &phico );
        OleCheck(hr);

        icon = new TIcon();
        icon->Handle = phico;
        ImageList1->AddIcon(icon);
        ShieldIcon1->ImageIndex = ImageList1->Count-1;
    }
    __finally {
        delete icon;
    }
}
//---------------------------------------------------------------------------
ちなみに、LoadIconMetric()APIはXPで使用不可
使用すると起動エラー
XPでエラーにしないようにLoadLibrary()にし、バージョンチェックは必要かもしれない
posted by sanahi at 00:41| 滋賀 ☀| Comment(0) | TrackBack(0) | C++Builder | このブログの読者になる | 更新情報をチェックする

2014年05月20日

wiro2 0.1.1.0.release

wiro2 0.1.1.0.release

vector(投稿時点では申請中)
http://www.vector.co.jp/soft/win95/util/se326598.html

vector(作者用HPスペース)
http://hp.vector.co.jp/authors/VA015517/wiro2/

設定ファイルをUNICODE化したので、既存の設定ファイルは
メモ帳等でUNICODEに変換保存してください。

既存の設定ファイル名は以下
wiro2_[userid].ini
wiro2_[userid].key

とりあえず更新してから、設定フォルダまで移動(AppData保存の場合は、Shift+F8してwiro2へ)して
*.ini,*.keyをメモ帳でUNICODEに変換して、
wiro2再起動すれば良いかと。

他、UAC管理下フォルダへのアクセス周りを強化したつもりですが、中途半端です。。。


Ver 0.1.1.0.release

・設定ファイルをUNICODE化
既存の設定ファイルを使用する場合はメモ帳等でUNICODEに変更保存してください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
・拡張プレフィックスパスに対応した(つもり)
ただし、削除(ゴミ箱移動)は未対応

・PCA(Program Compatibility Assistant )の介入を阻止

・Shift+F8〜F11に割当追加

・「管理者権限昇格モード」[Ctrl+F12]追加(Vista以降)
「管理者権限昇格モード」時は「ログの背景が黄色」に変わります。
「管理者権限昇格モード」時はファイルオペレーション等で都度、管理者権限昇格が行われます。
ファイルオペレーションは以下の単純処理に制限されます。
コピー
移動
削除
(現状では属性変更ができません)
その他エディタ等も管理者権限昇格してから起動するようになります。

「ちょっとProgram Filesのファイルを変更したい」等でやってみてください。
完全ではないので、
上手くいかない場合はwiro2自体を管理者権限で再起動してください。

・その他ファイルオペレーションアルゴリズムを大幅変更

・更新URLの変更忘れ

・FTPディレクトリ移動時にFTPサーバに "LOGIN FAILED" が出る場合があるバグFIX




以下は技術的なこと
UAC管理下であろうとファイラーはコピーやらできないとマズいだろう
という事で実装に挑んだのですが。。。

当初、UAC管理下フォルダにかかわらずVista以降の全てのファイルオペレーションをIFileOperationに切り替えようとしていました
IFileOperationを使うと必要に応じて勝手に管理者権限昇格UIが出るから楽です
進捗もIFileOperationProgressSinkで「比較的」楽に実装できます
色々試したのですが、IFileOperationはバッチ処理用途に向いてる気がします

wiro2の様な1ファイルずつコピーして衝突したらファイル名を「任意に」変更等の様な事が難しいようです

wiro2では、
1.IFileOperation::CopyItem
2.IFileOperation::CopyItem
3.IFileOperation::CopyItem
4.IFileOperation::PerformOperations
ではなく、
1.IFileOperation::CopyItem -> IFileOperation::PerformOperations
2.既にファイルが存在する -> ファイル名任意変更 or 上書き or なにもしないをユーザーに選択
3.IFileOperation::CopyItem -> IFileOperation::PerformOperations
4.IFileOperation::CopyItem -> IFileOperation::PerformOperations
とする必要があります

権限昇格がない場合はうまくいくのですが、途中に権限昇格があると
1.IFileOperation::CopyItem -> IFileOperation::PerformOperations
2.権限昇格
3.IFileOperation::CopyItem -> IFileOperation::PerformOperations -> 致命的なエラー(0x8000FFFF)
となってしまいまともに動作しません(Win8)

仕方がないので、
COM Elevation MonikerでIFileOperationを生成して上記処理をさせています
最初に管理者権限昇格させておくと問題ないようです
これが「管理者権限昇格モード」です
(「管理者権限昇格モード」がOFFの場合は今まで通りの::CopyFile()等のAPIで処理しています)

ただし、この方法だと、IFileOperationProgressSinkが使えないので、
進捗が別窓に出すしかなくなってしまっています
また、ファイルのプロパティ周り(属性、タイムスタンプ等)の変更のやりかたがイマイチわかりません

と、「管理者権限昇格モード」は現状では中途半端な実装となっています
単純コピーとか削除くらいにしか使えないかも。

エクスプローラみたいに必要に応じて権限昇格?させたいのですがなかなか難しいですね。。。

そもそもエクスプローラは権限昇格というより「シールドアイコン付き続行ボタン」だけで権限昇格UIがでなかったようなきがする
どうすればアレができるのかなぁ。。。_no
posted by sanahi at 01:36| 滋賀 | Comment(0) | TrackBack(0) | wiro2 | このブログの読者になる | 更新情報をチェックする

2014年05月11日

wiro2 0.1.0.0.release

とりあえずですが、公開です。
vector(投稿時点では申請中)
http://www.vector.co.jp/soft/win95/util/se326598.html

vector(作者用HPスペース)
http://hp.vector.co.jp/authors/VA015517/wiro2/
今時ディスク容量5MBとか。。。

起動時に権限昇格していないと、UAC環境下フォルダ(C:\Program Filesxxxtか)
でのファイルオペレーションがエラーになります
これは、今後何とかしたいと思います
(IFileOperationあたりで。。。。)
posted by sanahi at 23:20| 滋賀 ☁| Comment(0) | TrackBack(0) | wiro2 | このブログの読者になる | 更新情報をチェックする

Remarks
記事中にソースコードが含まれる場合、ソースコードの再利用、改変、「オレのものにする」等は自由ですが、
ソースコードを利用して起こった問題は一切責任を負いません。(自己責任での利用となります。)
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。