- PR -

カスタムコントロールから、デザイン時にプロジェクトのパスを取得する方法

投稿者投稿内容
hikawa
会議室デビュー日: 2008/12/05
投稿数: 1
投稿日時: 2008-12-05 02:59
基本方針を否定することになりますが、無理にファイルにせずに、レジストリを使えばよいのでは?

念のために、説明します。(ご存知でしたらごめんなさい)
・「レジストリ」は、Windows において、O/S や各アプリの初期設定情報を登録しておく仕組みである。
  ex)
   [HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Main]
   "Disable Script Debugger"="yes"
   "Show_ChannelBand"="No"
   "Local Page"="C:\\\\WINDOWS\\\\system32\\\\blank.htm"
   "Show_ToolBar"="yes"
  ・Word/Excel などのオプション設定項目も、ここに記録されている。
・「レジストリ」は、Windows O/Sとしての機能であり、個別のマシンのフォルダ構造などには影響されない。
・標準添付の regedit.exe により、表示編集が可能。
・プログラムから、簡単に読み書きできる。
  ・.NET以前であれば、WriteProfileString()など。
  ・.NET以降であれば、Microsoft.Win32.Registry クラス。

ということで、お勧めは、
・別立てのデザインツール(?)で、プロパティ情報をレジストリに登録する。
・自作コントロールで、起動時にレジストリからプロパティ情報を得て、初期設定。
・デザインツールで設定した情報は、regedit により xxx.reg に出力。
・他のメンバーに、コントロールを配布する際に、作成した xxx.reg を登録してもらい、共通の初期設定を行う。

で、解決するのでは?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-12-05 07:06
レジストリに、「ファイルの場所」を記述するとか
デザイン時は、レジストリやテンポラリを見に行くとか
おとぼけ父ちゃん
会議室デビュー日: 2008/11/25
投稿数: 9
投稿日時: 2008-12-05 13:30
Shinichi Aoyagiさん、なちゃさんありがとうございます。
私の説明が下手なため皆さんにご迷惑をお掛けしました。

私がやりたい目的は、Shinichi Aoyagiさん、なちゃさんに書いていただいた通りです。

これからアドバイスいただいた内容を試してみたいと思います。
本当にありがとうございました。
おとぼけ父ちゃん
会議室デビュー日: 2008/11/25
投稿数: 9
投稿日時: 2008-12-06 01:30
皆さんのおかげて、IDEが1つしか起動されてない場合にプロジェクトのパスを取得することができました。

EnvDTE80.DTE2 devenv = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");

System.Array projs = (System.Array)devenv.ActiveSolutionProjects;
EnvDTE.Project proj = (EnvDTE.Project)projs.GetValue(0);

MessageBox.Show(proj.FullName);

しかし、IDEが複数起動されているとGetActiveObject()ではどのIDEが取得されるのか不特定になります。
(最初に起動したIDEが取れている感じです。)

次のサイトに"IDE の特定のインスタンスへのアタッチ"と求めている内容があるのですがうまくいかず、また悩んでいます。
http://msdn.microsoft.com/ja-jp/library/ms228755(VS.80).aspx

この内容では、IDEインスタンスの指定に2つ方法があり
1つ目は、ソリューションのパスを指定する方法
2つ目は、プロセス ID を指定する方法

1つ目は今回の目的としては不適切なので、プロセスIDを指定する方法を試しています。
プロセスIDは、次の方法で取得しました。
System.Diagnostics.Process cps = System.Diagnostics.Process.GetCurrentProcess();
プロセスID= cps.Id
EnvDTE80.DTE2 devenv = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE!xxxx"); // xxxxにプロセスIDをセット

"クラス文字列が無効です"の例外が発生してしまいます。

何度も申し訳ありませんが、教えていただけないでしょうか
よろしくお願いいたします。



おとぼけ父ちゃん
会議室デビュー日: 2008/11/25
投稿数: 9
投稿日時: 2008-12-06 17:33
ようやく解決しました。

色々と試した結果、GetActiveObject()では特定のIDEに接続することはできないようです。
海外のサイトを含めて検索したところ、複数起動されているIDEからプロセスIDを指定することでIDEを取得するソースファイルが乗っているサイトがありました。
http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/3120db69-a89c-4545-874f-2d61c9317c8a/

このソースを見ると、RunningObjectTable より該当するプロセスと返しているようです。

プロセスIDは、System.Diagnostics.Process.GetCurrentProcess() でカスタムコントロールを使用しているIDEのプロセスが取得できるので、これですべて問題解決です。

沢山の皆さんに回答をいただき本当にありがとうございました。
今後ともよろしくお願いいたします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-12-06 18:11
引用:

このソースを見ると、RunningObjectTable より該当するプロセスと返しているようです。



ROT とはまた懐かしい (^^;

でも、そんなにメンドくさいことしないとダメなのかなぁ?
もっと簡単に IDE に接続できてもよさそうな気もするけど…
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2008-12-08 12:25
そのカスタムコントロールはVisual Studioが入っていない環境で動かないのでは?
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-12-10 08:47
引用:

todoさんの書き込み (2008-12-08 12:25) より:
そのカスタムコントロールはVisual Studioが入っていない環境で動かないのでは?



しかも、VSのバージョンの違いによって例外が発生すると思います。

EnvDTE80.DTE2 << VS2005
EnvDTE90.DTE2 << VS2008のはず

スキルアップ/キャリアアップ(JOB@IT)