0

私はMSSQLの前提条件を備えたプロジェクトを持っています。これまで、SQL はハードコードされたインスタンス名でインストールしていました。ここで、インストール プロセス中にユーザーがこの名前をカスタマイズして機能を作成したいと考えています。

これは私がやったことです:

ユーザーからSQLインスタンスの名前を取得するための編集コントロールを備えた新しいダイアログウィンドウを作成しました。ユーザーが「次へ」ボタンをクリックすると、インストール プロセスが開始されます (インターネットから SQL インストールをダウンロードし、サイレント インストールを開始します)。ユーザーにフィードバックを提供したいので、「SQL をインストールしています」などのテキスト コントロールを更新する必要があります。アクションから UI を更新する方法を見つけようとしましたが、成功しませんでした。

これが私の解決策です:

空の Text プロパティを持つ Text コントロールを配置しました。サブスクリプション タブ (このテキスト コントロール) で、イベント ActionData と Attribute Text を選択しました。私の行動では、次のようなテキストを送信しようとしました:

hRecActionData = MsiCreateRecord(1);
 if( hRecActionData = NULL )then
   MessageBox( "Failed to create record.", SEVERE);
 endif;

 nRes = MsiRecordSetString( hRecActionData, 1,"Instaling SQL..." );
 if( nRes != ERROR_SUCCESS )then
  MessageBox( "SetString failed", SEVERE );
 endif;

 nRes = MsiProcessMessage( hMSI, INSTALLMESSAGE_ACTIONDATA, hRecActionData );
 if( nRes != ERROR_SUCCESS )then
  MessageBox( "ProcessMessage failed", SEVERE );
 endif;

コードはエラーなしで実行されましたが、テキストは更新されませんでした。

私の方法は良いですか、それともシナリオで他のアプローチを使用する必要がありますか? コードが機能しないのはなぜですか?

4

1 に答える 1

1

ハンドルが正しいと仮定すると、問題はおそらく、デフォルトの UI ハンドラーが ActionText というダイアログ内のコントロールを見つけられないことです。そのデータを表示するためのコントロールが必要であり、それが使用されます。あなたのレコードがフォーマットに適合するかどうかは私には明らかではありません:

http://msdn.microsoft.com/en-us/library/aa371614(v=vs.85).aspx

一部の古い OS バージョンでは、コード呼び出しが DoAction イベントからのものである場合、コントロール イベントからの MsiProcessMessage の呼び出しをサポートしていません。

それ以外に、他の情報を提供しないのであれば、実際にはコードは必要ないと思います。[次へ] ボタンに ActionText イベントを設定して、そのテキストをダイアログの ActionText コントロールに送信するだけです。

いずれにせよ、EventMapping テーブルに関連する内部配線がたくさんあります。また、ActionText に応答するためにダイアログでコントロールが必要なため、イベントにサブスクライブするコントロールを処理するように InstallShield に指示する方法が正確にはわかりません。およびデータ メッセージ。

于 2014-06-05T15:48:23.613 に答える