C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■7311  Re[7]: Imageクラスの継承
□投稿者/ Hongliang -(2007/09/03(Mon) 18:55:57)
>
    No7306 (IIJIMAS さん) に返信

    > > てことで、結局 ExBitmap : IDisposable みたいな実装が妥当な形になります。
    > > // これはこれで色々問題があるようですが……まあ自分で使う分には。
    > >
    > > 以上、取り敢えず実装的な面から。オブジェクト指向的意味論からも否定できそうですが。
    >
    > ぜひ、教えてください。

    上で挙がっている ExBitmap の実装の問題点は、Dispose の呼び出しが必須なのにそれを強制できない点です。
    Dispose の呼び出しを行わなかった場合、それまで ExBitmap.SetPixel で設定していた値が破棄されますが、このデバッグはなかなか骨ではないでしょうか。
    ExBitmap.GetBitmap の呼び出しをもって UnlockBits を行い、以後 SetPixel/GetPixel の呼び出しは例外を投げるようにすべきでしょう(UnlockBits 直後にもう一度 LockBits する手もあるかもしれません)。
    更に、Dispose の呼び出しを行わなかった場合(上記の修正を加えた場合は、Dispose または GetBitmap の呼び出しを行わなかった場合)、Bitmap オブジェクトがロックされたままになります。コンストラクタに Bitmap オブジェクトを渡した場合、深刻な問題です。必ずクローンを持つようにすればいいんですが、それではこのクラスの意義が薄れるでしょう。
    これを解決するのはなかなか大変ですが、GCHandle でメンバの Bitmap/BitmapData を GC から保護し、ファイナライザから呼ばれる Dispose(false) でも UnlockBits することになるかな。十分な解決にはなりませんけど。
    考え出すと切りがなさそうです。でも、private なヘルパクラスなら、Dispose が必ず実行される前提の実装もありだと思っています。

    オブジェクト指向的には……色々考えてたはずですが吹っ飛んでしまいました。
    車輪の再発明さえ否定しないならアリかなー。結局、Bitmap クラスと同じなのだし。
    当初は Bitmap からの派生を考えていたので、理屈も考えられましたが。

    // ま、現実問題としては Image はコンストラクタ非公開、Bitmap は sealed でどうしようもないわけですが。
    // 更にはロックにはアンロックが必要と言う要求から、結局 Bitmap.LockBits/UnlockBits と同じ形にせざるを得ないとか。



    No7307 (ps8rX さん) に返信
    No7302 が回答になっていると思いますが、まだ釈然としない点がありますか?
    結局、LockBits/UnlockBits のタイミングが任意に指定できないなら意味がないわけで、そしてそれは既に Bitmap クラスが実装しているそのものです。
    確かに BitmapData を直接扱うのは面倒ですから、LockBits から UnlockBits までの面倒を見てくれるクラスはあったら便利でしょうけれども。

    // 上記の通り、そもそも派生クラス作れませんしね。
記事No.7288 のレス /過去ログ18より / 関連記事表示
削除チェック/

■69513  エラーが出て返信できません
□投稿者/ WebSurfer -(2014/01/04(Sat) 14:24:01)

    分類:[ご意見・ご要望] 

    No69511 (Techs さん) に返信しようとしましたが「ERROR-タイトルは半角60字以内!」という
    エラー出て返信できません。

    たぶん、タイトルの頭に "Re[1]: " という文字列が追加されることによって半角60字以内の
    制限を越えるためと思いますが、返信する場合は文字数を減らすなどの対応はできないよう
    です。

    対応方法があれば教えてください。ユーザー側で対応不可なら管理者の方で対応いただけな
    いでしょうか。
親記事 /過去ログ118より / 関連記事表示
削除チェック/

■88813  エクスプローラ クイックアクセス ピン留め C#
□投稿者/ Ante -(2018/10/01(Mon) 20:51:44)

    分類:[C#] 

    2018/10/01(Mon) 20:52:00 編集(投稿者)

    いつもお世話になります。

    ご存知でしたら教えてください。

    C#を利用して(標準ユーザーによるコマンド発行でも良い)、エクスプローラのクイックアクセスへ以下のフォルダをピン留めしたいです。
    ・ピクチャ
    ・ビデオ
    ・ミュージック

    ■OS
    Windows10

    ■言語
    C#

    ■IDE
    VisualStudio2017

    よろしくお願いします。
親記事 /過去ログ153より / 関連記事表示
削除チェック/

■88815  Re[1]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ 魔界の仮面弁士 -(2018/10/02(Tue) 03:10:25)
    No88813 (Ante さん) に返信
    > C#を利用して(標準ユーザーによるコマンド発行でも良い)、エクスプローラのクイックアクセスへ以下のフォルダをピン留めしたいです。
    > ・ピクチャ
    > ・ビデオ
    > ・ミュージック

    using System;
    using System.Runtime.InteropServices;

    class Program
    {
      static void Main(string[] args)
      {
        void Release(ref dynamic arg)
        {
          if (arg != null && Marshal.IsComObject(arg)) Marshal.IsComObject(arg);
          arg = null;
        };

        var csidlList = new[] { 13, 14, 39, /* 53, 54, 55, */ };
        var verbName = "pintohome";
        dynamic shell = Activator.CreateInstance(Type.GetTypeFromCLSID(
          new Guid("13709620-C279-11CE-A49E-444553540000")));
        foreach (object csidl in csidlList)
        {
          var folder = shell.NameSpace(csidl);
          var item = folder.Self;
          item.InvokeVerb(verbName);
          Release(item);
          Release(folder);
        }
        Release(shell);
      }
    }
記事No.88813 のレス /過去ログ153より / 関連記事表示
削除チェック/

■88817  Re[2]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ Ante -(2018/10/02(Tue) 16:56:21)
    2018/10/02(Tue) 16:57:21 編集(投稿者)

    魔界の仮面弁士 さん

    いつもご回答ありがとうございます。

    var csidlList = new[] { 13, 14, 39, /* 53, 54, 55, */ };
    で定義しているものが、下記に一致しているように思えますが
    ・ピクチャ
    ・ビデオ
    ・ミュージック

    ちなみに、コメントアウトされている、53, 54, 55
    については、それぞれのパブリックなのですね。

    以下の3つについて、
    ・ダウンロード
    ・デスクトップ
    ・ドキュメント

    上記定数のように指定できそうですが、
    定数値の一覧等が掲載されたサイトがあれば教示いただけたら嬉しいです。。。

    直近困っているので、なければ、直接値を教えていただけると幸いです。
記事No.88813 のレス /過去ログ153より / 関連記事表示
削除チェック/

■88819  Re[3]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ Ante -(2018/10/02(Tue) 19:21:23)
    1から700まで確認し、以下は見つけました!
    ・デスクトップ
    ・ドキュメント

    ■対応定数値
    デスクトップ
    →16
    ドキュメント
    →5
    ピクチャ
    →39
    ビデオ
    →14
    ミュージック
    →13


    ダウンロードだけ見つからないです…。。。
記事No.88813 のレス /過去ログ153より / 関連記事表示
削除チェック/

■88821  Re[3]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ 魔界の仮面弁士 -(2018/10/03(Wed) 00:33:46)
    2018/10/03(Wed) 00:47:41 編集(投稿者)

    No88817 (Ante さん) に返信
    > var csidlList = new[] { 13, 14, 39, /* 53, 54, 55, */ };
    > で定義しているものが、下記に一致しているように思えますが

    一つ上の回答と被りますが、これらの値については『CSIDL 値』で検索してみてください。

    VS2017 と共に Windows SDK もインストールしている場合には、
     C:\Program Files (x86)\Windows Kits\10\Include\バージョン
    の下位フォルダにある、ShlObj_core.h もしくは ShlObj.h の
    どちらかを見ることで、CSIDL の定数値を確認できるかと思います。


    > 定数値の一覧等が掲載されたサイトがあれば教示いただけたら嬉しいです。。。
    幾つかの CSIDL 値は、Shell32 の ShellSpecialFolderConstants 列挙型として定義されています。

    参照設定に Microsoft Shell Controls And Automation を加えていれば、
     デスクトップ フォルダーなら Shell32.ShellSpecialFolderConstants.ssfDESKTOP // 0
     デスクトップ ディレクトリは Shell32.ShellSpecialFolderConstants.ssfDESKTOPDIRECTORY // 16
     パブリック デスクトップなら Shell32.ShellSpecialFolderConstants.ssfCOMMONDESKTOPDIR // 25
    という具合に。
    http://msdn.microsoft.com/en-us/library/bb774096.aspx

    しかしこの ShellSpecialFolderConstants にはバグがありまして、
    ssfPROGRAMFILESx86 という列挙値の数値が
    本来は 42 で無ければならないのにも関わらず、
    誤って 48 (Windows 管理ツール を意味する)と誤定義されていたりします。

    ちなみに Windows SDK 上での定義はこんな感じ。

    #define CSIDL_PROGRAM_FILESX86 0x002a
    #define CSIDL_ADMINTOOLS 0x0030


    > 以下の3つについて、
    > ・ダウンロード
    > ・デスクトップ
    > ・ドキュメント
    デスクトップ や ドキュメント など、Windows XP 以前からあるものは
    CSIDL が使えますが、ダウンロードのように Vista 以降で追加されたものは
    KNOWNFOLDERID として定義されています。
    https://docs.microsoft.com/ja-jp/windows/desktop/shell/knownfolderid


    var targets = new object[]
    {
      // 17, // PC
      // "shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", // PC
      // "shell:thisdevicefolder", // このデバイス

      // 0, // デスクトップ(仮想フォルダー)
      // "shell:::{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}" // デスクトップ(仮想フォルダー)
      "shell:desktop", // デスクトップ(ディレクトリ)
      // 16, // デスクトップ(ディレクトリ)
      //// 25, // パブリック デスクトップ(ディレクトリ)
      //// "shell:common desktop", // パブリック デスクトップ(ディレクトリ)

      "shell:documentslibrary", // ドキュメント(ライブラリ)
      // 5, // ドキュメント
      // "shell:::{A8CDFF1C-4878-43be-B5FD-F8091C1C60D0}", // ドキュメント
      // "shell:::{D3162B92-9365-467A-956B-92703ACA08AF}", // ドキュメント
      "shell:personal", // ドキュメント
      // "shell:local documents", // ローカル ドキュメント
      // "shell:common documents", // パブリック ドキュメント

      // "shell:::{374DE290-123F-4565-9164-39C4925E467B}", // ダウンロード
      // "shell:::{088E3905-0323-4B02-9826-5D99428E115F}", // ダウンロード
      "shell:downloads", // ダウンロード
      // "shell:local downloads", // ローカル ダウンロード
      "shell:commondownloads", // パブリック ダウンロード

      // "shell:::{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}", // 3D オブジェクト
      "shell:3d objects", // 3D オブジェクト

      // "shell:libraries", // ライブラリ
      // "shell:userslibrariesfolder", // ライブラリ
      // "shell:quick launch", // Quick Launch
      //// "shell:user pinned", // ジャンプリスト 固定メニュー
      // "shell:public", // パブリック

      "shell:musiclibrary", // ミュージック(ライブラリ)
      // 13, // ミュージック
      // "shell:::{1CF1260C-4DD0-4EBB-811F-33C572699FDE}", // ミュージック
      // "shell:::{3DFDF296-DBEC-4FB4-81D1-6A3438BCF4DE}", // ミュージック
      "shell:my music", // ミュージック
      // "shell:local music", // ローカル ミュージック
      // 53, // パブリック ミュージック
      "shell:commonmusic", // パブリック ミュージック
      // "shell:samplemusic", // サンプル ミュージック

      "shell:videoslibrary", // ビデオ(ライブラリ)
      // 14, // ビデオ
      // "shell:::{A0953C92-50DC-43BF-BE83-3742FED03C9C}", // ビデオ
      // "shell:::{F86FA3AB-70D2-4FC7-9C99-FCBF05467F3A}", // ビデオ
      "shell:my video", // ビデオ
      // 55, // パブリック ビデオ
      "shell:commonvideo", // パブリック ビデオ
      // "shell:samplevideos", // サンプル ビデオ

      "shell:pictureslibrary", // ピクチャ(ライブラリ)
      // 39, // ピクチャ
      // "shell:::{3ADD1653-EB32-4CB0-BBD7-DFA0ABB5ACCA}", // ピクチャ
      // "shell:::{24AD3AD4-A569-4530-98E1-AB02F9417AA8}", // ピクチャ
      "shell:my pictures", // ピクチャ
      // "shell:local pictures", // ローカル ピクチャ
      // 54, // パブリック ピクチャ
      "shell:commonpictures", // パブリック ピクチャ
      // "shell:samplepictures", // パブリック\サンプル ピクチャ

      "shell:accountpictures", // アカウントの画像
      //// "shell:publicaccountpictures", // パブリック アカウントの画像

      "shell:camerarolllibrary", // カメラロール(ライブラリ)
      // "shell:::{3ADD1653-EB32-4CB0-BBD7-DFA0ABB5ACCA}\\camera roll", // ピクチャ\カメラ ロール
      // "shell:::{24AD3AD4-A569-4530-98E1-AB02F9417AA8}\\camera roll", // ピクチャ\カメラ ロール
      "shell:camera roll", // ピクチャ\カメラ ロール

      "shell:savedpictureslibrary", // 保存済みの写真(ライブラリ)
      "shell:savedpictures", // ピクチャ\保存済みの写真

      // "shell:::{018D5C66-4533-4307-9B53-224DE2ED1FE6}", // OneDrive
      "shell:onedrive", // OneDrive
      "shell:onedrivepictures", // OneDrive の画像
      "shell:onedrivedocuments", // OneDrive のドキュメント
      // "shell:onedrivecameraroll", // OneDrive の画像\カメラ ロール
      // "shell:onedrivemusic", // OneDrive のミュージック
    };

    dynamic shell = Activator.CreateInstance(Type.GetTypeFromCLSID(
      new Guid("13709620-C279-11CE-A49E-444553540000")));

    var verbName = "pintohome";

    foreach (var vDir in targets)
    {
      var folder = shell.NameSpace(vDir);
      if (folder != null)
      {
       var item = folder.Self;
       item?.InvokeVerb(verbName);
       Release(item);
      }
      Release(folder);
    }
    Release(shell);


    https://docs.microsoft.com/en-us/windows/desktop/shell/shell-namespace
    http://www10.plala.or.jp/palm84/archives/wsh/Windows_CreateShellCommandsShortCut.vbs.txt
記事No.88813 のレス /過去ログ153より / 関連記事表示
削除チェック/

■88820  Re[4]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ とっちゃん -(2018/10/02(Tue) 21:34:19)
    No88819 (Ante さん) に返信
    公式ページでは値は記載されていないみたいですね。

    ということで、「正式な」値のリストですが、
    Windows SDKの、shlobj.h というファイルに定義されています。

    Windows SDK をインストールしていない場合は、
    「C++によるデスクトップ開発」のワークロードをインストールするか
    「個別のコンポーネント」の「SDK、ライブラリ、およびフレームワーク」から
    Windows 10 SDK でサポート対象としたいバージョン以上向けの3種(UWP用、デスクトップC++用、無印)を入れておくことをお勧めします。

    今だと、基本的には15063以上をインストールしておけばよいと思いますが、C# から参照するだけであれば
    一番大きな数値のものを選んでインストールしておけばいいと思います(それが一番新しい定義なので)。

    SDKは、COM/Native API を呼び出す際に正式な定義を検索するなどでも利用します。
    今後も Native APIを使うつもりがあるのであればインストールしておくと、よいと思いますよ。

    C# の文法がわかっていれば、C/C++のヘッダーは読めると思います。


    おまけ。

    今回は直接関係ないですが、Vista 以降は、CSIDLではなく、KNOWNFOLDERID というGUIDで再定義されています。
    一応正式には今後はこちらを使ってくれということになっています(もちろんCSIDLも当分は使える)。

    ちょっと見るのは大変ですが、KNOWNFOLDERID は以下のURLに定義があります。
    https://docs.microsoft.com/en-us/windows/desktop/shell/knownfolderid

    ただし、ドキュメントのほうが更新が遅い場合があるので、最新については
    WindowsSDKの Knownfolders.h を参照する必要があります。

    特に Windows 10 では、バージョンが上がるごとにこれらの値も増えており、こちらを使わないと
    取り出せないなどが実際に出てきています。
記事No.88813 のレス /過去ログ153より / 関連記事表示
削除チェック/

■88827  Re[5]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ Ante -(2018/10/03(Wed) 15:07:44)
    とっちゃんさん、魔界の仮面弁士さん

    なるほど。非公開なのですね。。。

    OSの変更に依存するのはこの際仕方ないと割り切ってます。。。
    共有いただいたサンプルで組み込んでいきます。

    ありがとうございます。
記事No.88813 のレス / END /過去ログ153より / 関連記事表示
削除チェック/

■88834  Re[6]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ とっちゃん -(2018/10/03(Wed) 18:14:44)
    No88827 (Ante さん) に返信
    > とっちゃんさん、魔界の仮面弁士さん
    >
    > なるほど。非公開なのですね。。。
    >
    非公開ではありません。
    公開されていますが、情報の重複を避けるため、値を記載するのではなく、正確な定義はSDKを参照しろ!という形になっています。

    OSの側から言わせれば、OSの機能を使うのにその情報を定義、公開しているSDKを持っていないなんてありえないことなので
    そういう割り切りなんだと思います。
記事No.88813 のレス / END /過去ログ153より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -