- PR -

Win32リソースについて

投稿者投稿内容
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-11-17 15:59
駄目でした、簡単にできそうだと思ったのですが甘かったです。

まずマニュフェストファイルの追加は問題なくできたのですがアイコンの追加・書き換えができません。

とくにエラーが出るわけではなく、普通に正常終了するのですが確認してみると追加されていないという状態です。

下記がコードになります
コード:
public static bool InjectIcon(string AssemblyPath, string ManifestPath, uint ResourceName) 
		{
			byte[] manifestByteArray = null;
			bool result = false;
			FileStream manifestStream = null;
			BinaryReader manifestReader = null;
			IntPtr updatePointer = IntPtr.Zero;
			
			try 
			{
				// Read in the manifest as an array of byest to be injected to the 
				manifestStream = new FileStream(ManifestPath, FileMode.Open, FileAccess.Read);
				manifestReader = new BinaryReader(manifestStream);
				manifestByteArray = manifestReader.ReadBytes( (int)manifestStream.Length );
				// Begin the injection process
				updatePointer = (IntPtr)BeginUpdateResource(AssemblyPath, false);
			
				if (updatePointer == IntPtr.Zero) 
				{
					// Throws an exception with a specific failure HRESULT value if no pointer is returned
					Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
				}

				// The second argument, 24 (RT_MANIFEST), specifies that the resource is a manifest.  Details are at
				// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/introductiontoresources/resourcereference/resourcetypes.asp
				if (UpdateResource(updatePointer, 3, ResourceName, 0, manifestByteArray, (uint)manifestByteArray.Length) != 1) 
				{
					// Throws an exception with a specific failure HRESULT value if the resulting update does not return 1
					Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
				} 
			}
			catch // (Exception ex) 
			{
				// Manage exception here
				result = true;
			}
			finally 
			{
				if (updatePointer != IntPtr.Zero) 
				{
					// Finalize the update
					EndUpdateResource(updatePointer, result);
				}
				if (manifestReader != null) 
				{
					manifestReader.Close();
				}
				if (manifestStream != null) 
				{
					manifestStream.Close();
				}
			}

			return !result;
		}



教えていただいたThe Code Projectの方法を模擬って(99.9%コピーして)ます。変えた部分はRT_ICON(3)ぐらいです(汗。もぅ綺麗すぎて変えるとこない、変数名程度?prz


自分でいろいろとやってみたのですが、どうやらRT_ICON・RT_CURSORだとできないようです。RT_ICON(3)の部分をRT_MENUやRT_BITMAPにすると追加できました(もちろんアイコンファイルなので見ることできませんが…)

また、VS.netで初期アイコンIDを32512から101に変更してから書き換えをやってみましたがVS.netで開いて確認してみると1px×?pxのたてにながーいアイコンに変更されていました、いやそんなアイコン望んでないんですが…ちなみにエクスプローラーで表示すると変更前のアイコンが依然として表示されています。

いったい何が悪いのでしょうか…orz
バイナリを取得してそれを渡してるのに…orz

どなたか原因ご存知のお方がいらっしゃいましたらご教示お願いいたします。
_________________
seed of weed
自作したソフトの公開および刹那が難しい・めんどくさい・覚えられないと思った特殊なC#Tipsを公開しています。
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-11-17 16:07
あ、ちなみにファイルサイズは増えましたorz

サイズ増やすだけって…
_________________
seed of weed
自作したソフトの公開および刹那が難しい・めんどくさい・覚えられないと思った特殊なC#Tipsを公開しています。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-11-17 17:40
こんにちは。

引用:

笊頭刹那さんの書き込み (2005-11-17 15:59) より:

自分でいろいろとやってみたのですが、どうやらRT_ICON・RT_CURSORだとできないようです



ちょっと今は調べられないですけれども、乗り掛かった船ですから…

RT_GROUP_ICON・RT_GROUP_CURSOR
について調べてみてはいかがでしょうか?

あと、こちらの記事も参考になるのではないでしょうか?
Icons in Win32

#記事のリンク追加

[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2005-11-17 18:05 ]
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-11-17 18:05
それについて調べてみましたが、pinvoke.netにもVB6.0のころのAPIビュワーにもGoogle先生に問いただしても値が取得できなくて、あきらめましたorz

いろいろなところ見てるとDelphiでもVCでも何も問題なくいっているみたいで…

C#で完全にポインタとかsizeofとか使えたらこういうとき楽だな〜…とかちょっと無理なkと考えてしまったりorz
_________________
seed of weed
自作したソフトの公開および刹那が難しい・めんどくさい・覚えられないと思った特殊なC#Tipsを公開しています。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-11-17 18:52
こんばんは。

引用:

笊頭刹那さんの書き込み (2005-11-17 18:05) より:
それについて調べてみましたが、pinvoke.netにもVB6.0のころのAPIビュワーにもGoogle先生に問いただしても値が取得できなくて、あきらめましたorz

いろいろなところ見てるとDelphiでもVCでも何も問題なくいっているみたいで…

C#で完全にポインタとかsizeofとか使えたらこういうとき楽だな〜…とかちょっと無理なkと考えてしまったりorz



あらら、あきらめちゃったんですか(~_~;)

RT_GROUPICONリソースを追加するためにGRPICONDIR構造体を用意して…
なんて考えていたんですが…

よく考えたら、.NETでバイナリデータ/バイナリファイルを扱うのって、
ものすごく面倒だったんでしたね。
私もC#の実装を考えただけで、ウンザリしましたが。

#私はC++使いなので、C++で実装していいのなら、全然苦にならないんですけれどもね(*^_^*)
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-11-17 19:07
いえRT_GROUP_ICONについてあきらめたんです(笑。
っというか、あきらめたというより、見つからないってのが本音です、いまもまだ調べてますから(汗。

Cが分からないといろいろつらいですorz自分が質問してること、ほとんどCとかの方が向いてるよなって最近気づきましたorz

とりあえず猫いってきます、その部分のDLLを作れるようになるだけならそんな時間かからないかな?と甘い考えと一緒に…。

そのまえに
「GRPICONDIR構造体を用意して… 」
の部分詳しく教えていただけないでしょうか、RT_GROUP_ICONがいったい何なのか、UpdateResourceに渡すデータはいったい何なのか、ヘルプ見てもよく分からない現状ですorzわかれば自分なりになんとかできるかもしれないので、細かいデータが欲しいです。

というかRT_GROUP_ICONの値ってなんなんだろう?
_________________
seed of weed
自作したソフトの公開および刹那が難しい・めんどくさい・覚えられないと思った特殊なC#Tipsを公開しています。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-11-17 19:31
こんばんは。

あ、まだ頑張るんですね。じゃ、私ももうすこし付き合いますね。

引用:

笊頭刹那さんの書き込み (2005-11-17 19:07) より:
いえRT_GROUP_ICONについてあきらめたんです(笑。
っというか、あきらめたというより、見つからないってのが本音です、いまもまだ調べてますから(汗。

Cが分からないといろいろつらいですorz自分が質問してること、ほとんどCとかの方が向いてるよなって最近気づきましたorz

とりあえず猫いってきます、その部分のDLLを作れるようになるだけならそんな時間かからないかな?と甘い考えと一緒に…。

そのまえに
「GRPICONDIR構造体を用意して… 」
の部分詳しく教えていただけないでしょうか、RT_GROUP_ICONがいったい何なのか、UpdateResourceに渡すデータはいったい何なのか、ヘルプ見てもよく分からない現状ですorzわかれば自分なりになんとかできるかもしれないので、細かいデータが欲しいです。

というかRT_GROUP_ICONの値ってなんなんだろう?



ずばり、RT_GROUP_ICONの値は14です。
#私は、C#とVC++を併用しているので、こういうのはすぐに確認できます。

えっと、
GRPICONDIR構造体とかRT_GROUP_ICONの内容については、さきほども提示しましたが、
引用:

あと、こちらの記事も参考になるのではないでしょうか?
Icons in Win32


"DLL and EXE Files"という項目をみるとよいと思います。
ずばり、笊頭刹那さんの(多分)したい事の詳細が書かれてますから。

#英語は大丈夫ですか?
#私は…あまり得意じゃないですけれど、技術文書なんで、なんとなくは分かります(*^_^*)
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-11-17 19:52
14で追加できました、が、内容が追加されていない(汗。
いちおう確認すると101と項目は出るのですが中身が無い状況、いろいろ試して見ます。

ずばり、RT_GROUP_ICONの値は14です。
#私は、C#とVC++を併用しているので、こういうのはすぐに確認できます。
これが、速攻でわかったのは頭に入っていたから、じゃないですよねいくらなんでも(汗。どうやって調べたのかよろしければ教えていただけませんか?VC++も持っているので(というかVS.netなので)こういうのを自分で調べられると非常に楽なので。

英語は得意じゃないですが技術文章はコードが書かれているからなんとなく(笑。プログラム言語は万国共通ですからね(笑。
# というかオーストラリアにいるんだから英語ぜんぜん大丈夫ですっていえなきゃ駄目だよな…orz

まだサラ読みしかしていませんが、こういう細かい資料が欲しかったんです、ありがとうございます、ほんとこういう繊細資料って埋もれてて見つけずらい…。

いろいろありがとうございました、できたorヘ(x_x;)ヘ おてあげ。。。 の状態になったらまたレスします。

_________________
seed of weed
自作したソフトの公開および刹那が難しい・めんどくさい・覚えられないと思った特殊なC#Tipsを公開しています。

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