アンインストーラをMFCのダイアログベースで作っています。
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\
CurrentVersion\\Uninstall\\xxx
のDisplayNameとUninstallStringを登録して「アプリケーションの
追加と削除」から正しくアンインストールプログラムが呼ばれる
かを試しました。
一応呼ばれましたが、レジストリ等の削除は行わず、その画面を
閉じただけで、「アプリケーションの追加と削除」の一覧から削除されます。
「アプリケーションの追加と削除」を起動し直すと、また表示されます。
他のプログラムのアンインストールでは、キャンセルボタンを押しても
一覧から削除されることはありません。
一旦、一覧から削除されないようにするにはどうすればいいでしょうか?
VC++6.0・WinXpを使っています。
よろしくお願い致します。
調べて書いているわけではなくてもしかしたらと言うレベルの話なんですが、
「アプリケーションの追加と削除」が呼び出したアンインストールプログラムの
終了ステータスを見ていると言う事はありませんか?
kayoppeさんが作成したアンインストールプログラムの終了ステータスが
キャンセル時も正常終了時も同じなら「アプリケーションの追加と削除」からは
どういう終わり方をしたのかわからないと思います。
どういう返却値なら良いのかと言うのは調べてみないとわからないと思いますが、
調べる糸口にはなると思いますので、一度調べてみてはいかがでしょう。
できました。
今までは、こんな感じでやっていました。
RegSetValueEx(hChildKey, UninstallString, 0, REG_SZ, (CONST BYTE*)m_szFile,
sizeof(m_szFile)+1);
最後の+1をとったらできました。
問題は+1は意味がなかったと思いますが、あっても問題はないと思います。
結局原因は不明ですが、とりあえずできました。
ありがとうございました。
解決してしまっていますが、
sizeof(m_szFile)+1
はまずいと思いますよ。
これだと確保したメモリを超えてしまいます。
HELPをよく読んでみましょう。
REG_SZ・・・の時は、'\0'まで含めての長さを設定します
とあります。
従って正解は、
_tcslen(m_szFile)+1
だとおもいますよ。
まあ、通常C言語やC++言語で文字列用のバッファを確保する場合は、'\0'文字まで
含めた形で行うはずなので上記なら確保したメモリを超えてしまう事はないと思います。
大抵の場合、Unicode は使わないので
strlen( m_szFile ) + 1
でよいかと思われます。
Unicode を意識するなら、RegSerValueEx はバイト単位ですが _tcslen は文字数を返す
ので、
( _tcslen( m_szFile ) + 1 ) * sizeof( TCHAR )
とすべきです。
より簡単な方法としては、StringCbLength とゆーのもあります。
とても勉強になりました。
一応Unicodeを意識しているので、
( _tcslen( m_szFile ) + 1 ) * sizeof( TCHAR )を使おうと思います。
勉強不足でした。
ありがとうございます。