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

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

C# と VB.NET の入門サイト

Re[10]: InstallShieldでダイアログが隠れる


(過去ログ 134 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■79225 / inTopicNo.1)  InstallShieldでダイアログが隠れる
  
□投稿者/ Nemo (1回)-(2016/03/17(Thu) 14:19:11)

分類:[インストーラ全般] 

Install Shield2011でインストーラを作っています。
表示は出来ているのですが、ダイアログが他ウィンドウの裏に出てきてしまい困っています。
恐れ入りますが、手前に表示する設定方法をご教授ください。

基本のMSIプロジェクトに対して
インストール時に表示するダイアログで、使用許諾を表示するように変更。
ダイアログで設定できる使用許諾画面はrtfしか設定できないようなので、
InstallScriptで作成し、カスタムアクションとシーケンスに挿入。

ここでSdWelcomやSdLicense2といったSdダイアログ関数を呼んでいますが、
この表示が裏に出てしまっています。

どうかよろしくお願いします。
引用返信 編集キー/
■79230 / inTopicNo.2)  Re[1]: InstallShieldでダイアログが隠れる
□投稿者/ ito (23回)-(2016/03/17(Thu) 15:44:46)
No79225 (Nemo さん) に返信
おそらく参考URLの話と同じと思われます。
無理ではないが、かなり難しいとだけ答えておきます。
(何せOSの仕様ですから...)

参考URL
アプリケーション起動時に画面が最前面に表示されない。
https://social.technet.microsoft.com/Forums/windows/ja-JP/81c6b01d-693f-408b-a9db-1edb48102b36?forum=w7itprogeneralja


引用返信 編集キー/
■79238 / inTopicNo.3)  Re[1]: InstallShieldでダイアログが隠れる
□投稿者/ とっちゃん (337回)-(2016/03/17(Thu) 17:45:11)
No79225 (Nemo さん) に返信
> Install Shield2011でインストーラを作っています。
> 表示は出来ているのですが、ダイアログが他ウィンドウの裏に出てきてしまい困っています。
> 恐れ入りますが、手前に表示する設定方法をご教授ください。
>
> 基本のMSIプロジェクトに対して
> インストール時に表示するダイアログで、使用許諾を表示するように変更。
> ダイアログで設定できる使用許諾画面はrtfしか設定できないようなので、
> InstallScriptで作成し、カスタムアクションとシーケンスに挿入。
>
> ここでSdWelcomやSdLicense2といったSdダイアログ関数を呼んでいますが、
> この表示が裏に出てしまっています。
>
テキストファイルを、ワードパッド(Windows 3.0以上のバージョンならどのバージョンのデスクトップにもある)で
rtf形式で保存すれば、基本のMSIでも表示できますが
それではだめなのでしょうか?

まぁ、基本のMSIにすれば、前に出てくるという保証があるわけでもないので
それでうまくいくとは限りませんが、InstallScriptを経由しない分余計なことをしないから
後ろに隠れてしまう可能性は減るような気がします。

引用返信 編集キー/
■79245 / inTopicNo.4)  Re[2]: InstallShieldでダイアログが隠れる
□投稿者/ Nemo (2回)-(2016/03/18(Fri) 10:10:02)
No79230 (ito さん) に返信
> ■No79225 (Nemo さん) に返信
> おそらく参考URLの話と同じと思われます。
> 無理ではないが、かなり難しいとだけ答えておきます。
> (何せOSの仕様ですから...)
>
> 参考URL
> アプリケーション起動時に画面が最前面に表示されない。
> https://social.technet.microsoft.com/Forums/windows/ja-JP/81c6b01d-693f-408b-a9db-1edb48102b36?forum=w7itprogeneralja
>
>
itoさん
カスタムアクションは別のプロセスで動くという記述をどこかで見たので、ダイアログを表に出そうと思ったら
OSの仕様まで考慮して組まないといけないってことですね・・
ありがとうございました。
引用返信 編集キー/
■79246 / inTopicNo.5)  Re[2]: InstallShieldでダイアログが隠れる
□投稿者/ Nemo (3回)-(2016/03/18(Fri) 10:22:18)
No79238 (とっちゃん さん) に返信
> ■No79225 (Nemo さん) に返信
>>Install Shield2011でインストーラを作っています。
>>表示は出来ているのですが、ダイアログが他ウィンドウの裏に出てきてしまい困っています。
>>恐れ入りますが、手前に表示する設定方法をご教授ください。
>>
>>基本のMSIプロジェクトに対して
>>インストール時に表示するダイアログで、使用許諾を表示するように変更。
>>ダイアログで設定できる使用許諾画面はrtfしか設定できないようなので、
>>InstallScriptで作成し、カスタムアクションとシーケンスに挿入。
>>
>>ここでSdWelcomやSdLicense2といったSdダイアログ関数を呼んでいますが、
>>この表示が裏に出てしまっています。
>>
> テキストファイルを、ワードパッド(Windows 3.0以上のバージョンならどのバージョンのデスクトップにもある)で
> rtf形式で保存すれば、基本のMSIでも表示できますが
> それではだめなのでしょうか?
>
> まぁ、基本のMSIにすれば、前に出てくるという保証があるわけでもないので
> それでうまくいくとは限りませんが、InstallScriptを経由しない分余計なことをしないから
> 後ろに隠れてしまう可能性は減るような気がします。
>
とっちゃんさん
今回はrtf形式に変換した方が早いかなぁ・・っていう気がしてきてました。

使用許諾の文章ファイルを用意するのは別の部隊なので、開発側で加工したくないという思いがあったので
仕組み悩んでました。
特約店ごとに使用許諾を変更できるように将来的にインストーラの中に組み込むのではなく、
exe外にあるtxtを参照表示するようにして差し替え可能にしてほしいとか言われていて・・
InstallScriptで何とかするしかないのかなぁと考えてました。



引用返信 編集キー/
■79247 / inTopicNo.6)  Re[3]: InstallShieldでダイアログが隠れる
□投稿者/ ito (24回)-(2016/03/18(Fri) 11:21:45)
No79245 (Nemo さん) に返信
> ■No79230 (ito さん) に返信
>>■No79225 (Nemo さん) に返信
> itoさん
> カスタムアクションは別のプロセスで動くという記述をどこかで見たので、ダイアログを表に出そうと思ったら
> OSの仕様まで考慮して組まないといけないってことですね・・
> ありがとうございました。
もし、APIを使えるのでしたら、以下APIをキーワードにすると幾つかの解が見つかると思います。
ただし、それでも完全ではないのですが...
AttachThreadInput
SetForegroundWindow

引用返信 編集キー/
■79259 / inTopicNo.7)  Re[3]: InstallShieldでダイアログが隠れる
□投稿者/ とっちゃん (338回)-(2016/03/18(Fri) 17:55:17)
No79245 (Nemo さん) に返信
> カスタムアクションは別のプロセスで動くという記述をどこかで見たので

ここだけ。カスタムアクションは、別プロセスで動きます。リファレンスにも出てます。
せっかく反応するので、もうちょっと細かく書いておきます。

インストーラは
1.最初に起動したプロセス(UI表示を担当。InstallUISequece が動くプロセス)
2.1から起動するCA(カスタムアクション)を動かすプロセス(以下CAプロセス)
3.インストール開始(ExecuteAction) で起動する InstallExecuteSequende が動くプロセス(設定により、管理者権限か1と同じ権限で動作する)
4.3から呼ばれて実際にインストールのコピー処理などを行うサービスプロセス(一度起動したらずっと起動しっぱなし)
5.3から呼ばれる1と同じ権限で動作するCAプロセス
6.3から呼ばれる、3と同じ権限で動作するCAプロセス
があります。

これら以外に exe 形式のCAがあり、こちらは、そのEXEの独立プロセスとして動作します。
(3,5,6のいずれかの権限と同じ権限で呼ばれたタイミングで起動する)

CAをデバッグするときはこの権限や起動パターンを正しく把握していないとデバッガをアタッチできなかったりするので注意が必要です。

さらにおまけ。。。
1のプロセスは、msiexec ではなく、自分で MsiInstallProduct API などを使って
自プロセス内の動作として実行することもできます(ただし、2〜6を肩代わりすることはできない)。

また、1のプロセスは呼び出し元のプロセスの実行権限(昇格済みなら昇格済みの権限)で動作します。
また、実行権限が異なるプロセスの場合、そのUIにアクセスできないなどもあるのでそのあたりも注意が必要になる場合もあります。

引用返信 編集キー/
■79260 / inTopicNo.8)  Re[3]: InstallShieldでダイアログが隠れる
□投稿者/ とっちゃん (339回)-(2016/03/18(Fri) 18:06:29)
No79246 (Nemo さん) に返信
> 今回はrtf形式に変換した方が早いかなぁ・・っていう気がしてきてました。
>
> 使用許諾の文章ファイルを用意するのは別の部隊なので、開発側で加工したくないという思いがあったので
> 仕組み悩んでました。
> 特約店ごとに使用許諾を変更できるように将来的にインストーラの中に組み込むのではなく、
> exe外にあるtxtを参照表示するようにして差し替え可能にしてほしいとか言われていて・・

こっち反応し損ねてた。。。
rtf で表示するところは、ScrollableText というコントロールが使われるのですが
こいつが、埋め込みのrtfしか表示してくれないんですよね。

なので、動的に切り替えるという仕組みが取れません。

やろうと思ったら、必要数分だけあらかじめrtfとして埋め込んでおいて
実行時に選ぶとかその程度。。。

> InstallScriptで何とかするしかないのかなぁと考えてました。

なので、使用許諾を外部テキストにしてそれを実行時に表示させる
という仕組みがMust(必須案件)なら、基本のmsiでは実現が困難なので

1.ボタンで外部ファイルを ShellExecute する(こちらは、基本のmsi+CAで実現可能)
2.独自UI(InstallScriptを含む)で、インストーラUIを構築してその中で表示する
3.単純添付するだけで、UIとして表示しない(使用許諾を盾にして法的措置に出れない場合があるのでお勧めできない)

という格好になると思います。

InstallShield を持っているのであれば、2の実現はInstallScript(以下IS) が一番ローコストだと思います。
ISだとダメだーという場合は、ISから、UIDLLを起動してそっちに全部任せるという力技もあります。

今は、ロゴとかもないので、msi じゃないとーという状況は減りつつあるんじゃないかな?
と思います。

引用返信 編集キー/
■79333 / inTopicNo.9)  Re[4]: InstallShieldでダイアログが隠れる
□投稿者/ Nemo (4回)-(2016/03/22(Tue) 11:38:02)
itoさん、とっちゃんさん
更なる回答ありがとうございます。

試してダメだったことの中間報告だけですが
InstallScriptで組んだUI表示スクリプトの最初に以下の処理を入れてみました。
hDialog = GetWindowHandle(HWND_INSTALL);
bReturn = SetForegroundWindow(hDialog);

とっちゃんさんの説明にあったとおりで、
カスタムアクションはインストーラのハンドルではないってことですね。

引用返信 編集キー/
■79334 / inTopicNo.10)  Re[5]: InstallShieldでダイアログが隠れる
□投稿者/ とっちゃん (340回)-(2016/03/22(Tue) 13:59:51)
No79333 (Nemo さん) に返信
> itoさん、とっちゃんさん
> 更なる回答ありがとうございます。
>
> 試してダメだったことの中間報告だけですが
> InstallScriptで組んだUI表示スクリプトの最初に以下の処理を入れてみました。
> hDialog = GetWindowHandle(HWND_INSTALL);
> bReturn = SetForegroundWindow(hDialog);
>
> とっちゃんさんの説明にあったとおりで、
> カスタムアクションはインストーラのハンドルではないってことですね。
>
んと。。。MSIの標準UIを使う場合は。。。です。
ISを使っている場合は、MSI形式なのか、IS形式(非MSI形式)なのかでも変わります。
どっちにしても、独自UIという点は変わらないと思いますが。。。


で、本題。

hDialog が対象のウィンドウハンドルを持ってくるのだとして。。。
SetForegroundWindow の前に GetLastActivePopup API を呼び出して
その戻り値を対象とすると変わることもあります。

ですが、それ以前の基本的な問題として、 SetForegroundWindow を行うプロセスが
アクティブプロセスじゃないと アクティブウィンドウ とすることができません。
詳細は、SetForegroundWindow のリファレンスにあるので一度目を通しておくと
よいかもしれません。
ということで、リファレンスへのリンクを貼っておきます。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633539.aspx

あと、アクティブウィンドウであっても、前に出てこない
あるいは前に出てきてフォーカスがあるのにアクティブウィンドウじゃない
という場合もあります。

同じプログラムを同じように起動してもそういう状況になる場合があるので
一概にプログラムの起動時にどうにかして。。。といって解決できるものではない
という点は付け加えておきます。

引用返信 編集キー/
■79343 / inTopicNo.11)  Re[6]: InstallShieldでダイアログが隠れる
□投稿者/ Nemo (5回)-(2016/03/23(Wed) 11:13:37)
とっちゃんさん
何度もありがとうございます。理解が追いついてなくてすみません。
整理もかねて具体的に書きます。

・InstallShield2011
・基本のMSIプロジェクト

以下のようなInstallScriptを組んでます。

====
#include "ifx.h"

export prototype OriginalUI(HWND);

function OriginalUI(hMSI)
STRING szTitle, szMsg;
begin
Disable(BACKGROUND);

szTitle = "";
szMsg = "";
nResult = SdWelcome( szTitle, szMsg);

以下略
===

カスタムアクションとシーケンスにてユーザインターフェースの画面で
InstallWelcomeを削除し、代わりに新しいInstallScriptのカスタムアクションを追加してOriginalUIを呼び出しています。

このSdWelcome表示されるようこそダイアログが手前に出てくれず裏に表示されてしまっています。

SdWelcomeを呼ぶ前にどのような処理を加えたら良いかをご教授いただけたら幸いです。
引用返信 編集キー/
■79347 / inTopicNo.12)  Re[7]: InstallShieldでダイアログが隠れる
□投稿者/ とっちゃん (341回)-(2016/03/23(Wed) 13:48:43)
No79343 (Nemo さん) に返信
> カスタムアクションとシーケンスにてユーザインターフェースの画面で
> InstallWelcomeを削除し、代わりに新しいInstallScriptのカスタムアクションを追加してOriginalUIを呼び出しています。
>
> このSdWelcome表示されるようこそダイアログが手前に出てくれず裏に表示されてしまっています。
>
一応確認。

InstallWelcome なら問題はないのでしょうか?
もしそうだとしたら、InsatllWelcome のソースを見ることはできませんか?
それが可能なら(昔は、InstallSciprt のソースがついていた)、そのソースを参考にダイアログの内容だけ修正すれば
いいと思います。
InstallWelcomeは、MSIの標準UIでそれを差し替える形でSdWelcomeとしているのだとすると、ちょっと望み薄かもしれません。
今の InstallScript がどういう形で基本MSI上で独自UIを実現できているのかわからないので
何とも言えないところはありますが、カスタムアクションとして作られた中でUIを出しているのだとすると
プロセスが異なるので、アクティブなUIとするのはほぼほぼ絶望的と思ったほうがよいと思います。


すごく当たり前すぎる話なのですが、アクティブなウィンドウはアクティブなプロセスでのみ用意可能となっています。
OriginalUI() という InstallScript のコードを実行するプロセスが、アクティブなプロセスであれば
問題はありませんが、そうではない場合はアクティブなプロセスから呼び出すような仕組みにならない限り対処できません。

これは、OSの仕様に関するもので、そのプログラムがどういう形で作られているかによらずそういう制限事項があります。

基本のMSIや、MSIの標準カスタムUI(EmbeddedUI/ExternalUI)の仕組みではこれを担保するため
UIを表示するプロセスをユーザーが起動したときのプロセスになるようにしています。

なのでこの形を逸脱する場合は、アクティブにすることはできないと思ったほうがいいです。
ただし、フロントに持ってくることはできるかもしれません。

ウィンドウを前面に持ってくる BringWindowToTop() というAPIがあります。
SdWelcome を表示したら、そのウィンドウハンドルを使ってこのAPIを呼び出すようにできれば
もしかしたら最悪でも手前には持ってくることができるかもしれません。

が、アクティブになるには、自分自身がアクティブプロセスの必要があるため
あまり望みは高くないと思ったほうがいいです。


> SdWelcomeを呼ぶ前にどのような処理を加えたら良いかをご教授いただけたら幸いです。

部分的にInstallScript でUIを賄うのではなく、UIは全部InstallScriptで処理し
実際のインストールだけMSIで行うような形でプロジェクトを作れるのなら
それがいいと思います(昔のInstallScript-MSI形式あるいは、InstallScript形式)。

現行系のInsatllShieldは持っていないので具体的なところはよくわからないので
そもそも今回行おうとしているようなことをサポートできる構成があるのか?
というところもありますが。

引用返信 編集キー/
■79366 / inTopicNo.13)  Re[8]: InstallShieldでダイアログが隠れる
□投稿者/ Nemo (6回)-(2016/03/25(Fri) 15:09:48)
とっちゃんさん

ありがとうございます。

>InsatllWelcome のソースを見ることはできませんか?
残念ながらなさそうです・・・

全部InstallScript形式で作ると面倒かと思ったので基本のMSIに部分的にInstallScript入れ込む形をとろうとしてましたが、
逆に遠回りになっているように思えてきたので、InstallScript形式で作ろうかと思いました。

>ウィンドウを前面に持ってくる BringWindowToTop() というAPIがあります。
>SdWelcome を表示したら、そのウィンドウハンドルを使ってこのAPIを呼び出すようにできれば
>もしかしたら最悪でも手前には持ってくることができるかもしれません。
SdWelcomeを呼んだ時点でユーザの応答を待ってしまうので、呼ぶ前に設定変えるしかなさそうです。

関係ない情報かもしれませんが、インストールするプログラムを動かすために.NET Frameworkが必要なので
前提条件に入れて、再配布可能ファイルのチェックボックスをオンにしています。
これが無ければようこそウィンドウが表に出ていました。

引用返信 編集キー/
■79368 / inTopicNo.14)  Re[9]: InstallShieldでダイアログが隠れる
□投稿者/ とっちゃん (344回)-(2016/03/25(Fri) 17:15:25)
No79366 (Nemo さん) に返信
> >InsatllWelcome のソースを見ることはできませんか?
> 残念ながらなさそうです・・・
>
あ、InstallWelcome は、もしかして、基本のMSIのダイアログ画面ですか?
だとすると、InstallScriptとは無関係なので見れても意味がないです。


> 全部InstallScript形式で作ると面倒かと思ったので基本のMSIに部分的にInstallScript入れ込む形をとろうとしてましたが、
> 逆に遠回りになっているように思えてきたので、InstallScript形式で作ろうかと思いました。
>
このあたりは、現在のInstallScriptの構造がわからないので何とも言えませんが
全部作ってしまうほうが単一化できていいかもしれません。

詳しいところはわからないですけど。。。


> >ウィンドウを前面に持ってくる BringWindowToTop() というAPIがあります。
> >SdWelcome を表示したら、そのウィンドウハンドルを使ってこのAPIを呼び出すようにできれば
> >もしかしたら最悪でも手前には持ってくることができるかもしれません。
> SdWelcomeを呼んだ時点でユーザの応答を待ってしまうので、呼ぶ前に設定変えるしかなさそうです。
>
SdWelcome のソースは見れますか?
もし、私が使っていたころと同じ仕組みなら、Ex だったかな?同じような名前の別の奴があります。
そっちだと、ウィンドウが出ている状態でも呼び出されるルーチンがあるので
そっちでなら、BringWindowToTop() が呼べるかもしれません。

OnShow みたいなイベントがあればそれでもいいと思いますけど...


> 関係ない情報かもしれませんが、インストールするプログラムを動かすために.NET Frameworkが必要なので
> 前提条件に入れて、再配布可能ファイルのチェックボックスをオンにしています。
> これが無ければようこそウィンドウが表に出ていました。
>
あ、だとすると、InstallShield のブートストラッパーの動作仕様(限りなくバグのように見えますが仕様です)かもしれませんね。

となると、回避策としては

1.InstallScript を駆使して何とか頑張る(今の延長)
2.Click Once のブートストラッパーを使う(Visual Studioが必要。ブートストラッパーの仕様が変わるので問題があるかもしれない)
3.自前のブートストラッパーを作る(完全独自になるので、一朝一夕 というようなものではない)
4.WiX のブートストラッパーを使う(使ったことがないとなるとかなり難易度が高いので難しいかもしれない)

というあたりですかねぇ。。。
2 は、VS が必要(ライセンス的に問題なければ、Community でもOKですがExpressでは実現不可の可能性が高いです)になります。

http://blogs.wankuma.com/tocchann/archive/2011/12/16/230167.aspx

にあるような感じでプロジェクトに組み込んでしまうこともできますが、
これをプログラムコードでも出力できるのでそっちと組み合わせたほうがいいかもしれません。

3, 4 は元々その手のものを持っているのなら、移行先として選択することも出いますが、
そうじゃない場合は、短期間でできるようなものではないのであまり現実的な選択肢ではありません。
社内の別の部署などで持っているとかそういうのがあれば、そっちも選択の余地があるという感じです。

引用返信 編集キー/
■79389 / inTopicNo.15)  Re[10]: InstallShieldでダイアログが隠れる
□投稿者/ Nemo (7回)-(2016/03/28(Mon) 15:37:18)
とっちゃんさん

>SdWelcome のソースは見れますか?
>もし、私が使っていたころと同じ仕組みなら、Ex だったかな?同じような名前の別の奴があります。
>そっちだと、ウィンドウが出ている状態でも呼び出されるルーチンがあるので
>そっちでなら、BringWindowToTop() が呼べるかもしれません。
見つけました。
直接SdWelcomeをいじったら他のプロジェクトにも影響出てしまうので、同じ内容の関数作って
SetWindowPos()で表にダイアログが出るように出来ました。

すごく勉強になりました。
ありがとうございました。

余談ですが、
InstallShieldでの開発これまでもやってきていましたが、
調べごとがあって検索するとこのサイトに限らず、ほとんどとっちゃんさんの回答や解説が見つかるので
お名前すごく記憶にありました。
かなり昔の記事が多いので現役でこういうQ&A見てないかな・・とダメもとでここに書き込んでみて
本人から回答いただけたのがすごく嬉しく思ってます。
改めてありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -