ScriptControl利用のEXEをWin7で実行すると「EOleSysError」が発生する

解決


maco  2013-03-26 20:52:39  No: 44104

件名の通り、ScriptControlを組み込んだEXEを、
Win7で実行すると起動時にEOleSysErrorが発生します。(WinXPでは発生しません)

ScriptControlとは、VBScript/JScriptをDelphi環境に組み込む機能です。(詳細、以下URL参照)
http://delfusa.blog65.fc2.com/blog-entry-33.html

EXEアイコンを右クリックし、管理者として実行 とすれば、
このエラーが発生しなくなることは確認しています。

EXE利用者の手をわずらわせることなく、このエラーを回避する方法をご存知でしたら、
アドバイスいただけないでしょうか?


DEKO  2013-03-26 21:11:20  No: 44105

こんにちは。

> EXEアイコンを右クリックし、管理者として実行とすれば、
> このエラーが発生しなくなることは確認しています。

であれば、要求実行レベル属性の level に requireAdministrator を記述した
アプリケーションマニフェストを埋め込むか、

[Windows Vista 以降の OS で Delphi (Mr.XRAY)]
http://mrxray.on.coocan.jp/Delphi/Others/WindowsVista.htm

[アプリケーションマニフェスト]
http://ht-deko.minim.ne.jp/tech077.html

[アプリケーションマニフェストが含まれていないアプリケーションにアプリケーションマニフェストを埋め込んでみる]
http://ht-deko.minim.ne.jp/ft1303.html#130320_03

# 都度、昇格ダイアログ (UAC プロンプト) は出ます。

或いはショートカットのプロパティの [互換性] タブで
"管理者としてこのプログラムを実行する" にチェックを入れるように指示するかですね。

# 両方やっておくといいかもです。


maco  2013-03-26 22:46:23  No: 44106

DEKOさん
返信ありがとうございます。開発環境を示していませんんでした。
Delphi7 Enterprise です。実行環境は、WinXP、7が混在しています。

> [アプリケーションマニフェスト]
http://ht-deko.minim.ne.jp/tech077.html

uses
  XPMAN
を追記してみましたが、エラー発生は変わりません。(EXE表示に若干の変化あり)
マニフェストファイルの組み込みの方は試していません。

一度、
  「EXEアイコンを右クリック > 管理者として実行」
とすれば次回以降のこの操作は不要となるため、
当面は、エラー発生時に管理者実行を促すメッセージを表示することで対応しつつ、上記URLを読み解いてみます。


maco  2013-03-26 23:01:43  No: 44107

> # 都度、昇格ダイアログ (UAC プロンプト) は出ます。

とあるので、どの方法でも、
EXE実行時に「ユーザー アカウント制御」の画面が出るということですね?

これを出さないようにするには、Windowsの設定を変えるしかなさそうですね。(例:以下URL)
http://www.atmarkit.co.jp/fwin2k/win2ktips/859disuac/disuac.html


Mr.XRAY  2013-03-26 23:53:25  No: 44108

>EXE実行時に「ユーザー アカウント制御」の画面が出るということですね?

そういうことです.
どれも,UAC を有効にしてコンピュータを運用することを前提にしています.

参考までに,XPman というのは,デザイン上 (テーマ表示) の違いです.
http://mrxray.on.coocan.jp/Others/004.htm

アプリケーションマニフェストは,
デザインとユーザー アカウント制御ダイアログの表示もします.


DEKO  2013-03-27 00:01:54  No: 44109

>uses
>  XPMAN
>を追記してみましたが、エラー発生は変わりません。(EXE表示に若干の変化あり)

記事をよく読んでください。
Delphi 7 〜 2006 のマニフェスト (XPMAN) は Visita 以降の UAC に対応していません。

[XPMan で Vista 以降のアプリケーションマニフェストに対応するには? (Delphi 7 〜 2006)] の
項目を参考に、自前で requireAdministrator を追加しなくてはなりません。

> これを出さないようにするには、Windowsの設定を変えるしかなさそうですね。(例:以下URL)
http://www.atmarkit.co.jp/fwin2k/win2ktips/859disuac/disuac.html

そうなんですけど、UAC を無効にするのは最終手段です。
むやみやたらに UAC をオフにすべきではありません。


maco  2013-03-27 00:07:48  No: 44110

Mr.XRAYさんの発言
> アプリケーションマニフェストは,
> デザインとユーザー アカウント制御ダイアログの表示もします.

DEKOさんの発言
> Delphi 7 〜 2006 のマニフェスト (XPMAN) は Visita 以降の UAC に対応していません。

提示いただいたURLの内容の確認が不足していました。
すみません。

> むやみやたらに UAC をオフにすべきではありません。

そうですよね。

今回は、.dprファイルに以下の記述を行い、対応します。

try

except
  on EOleSysError do
    MessageDlg('EXEアイコンを 右クリック > 管理者として実行 ください。'#13#10,mtInformation,[mbOk],0);
end;

ありがとうございました。


おかぽん  2013-03-27 00:17:41  No: 44111

> ScriptControlとは、VBScript/JScriptをDelphi環境に組み込む機能です。(詳細、以下URL参照)
http://delfusa.blog65.fc2.com/blog-entry-33.html
解決していますけど、上記からダウンロードしたサンプルコードも、
Microsoft Script Control 1.0を取り込みして確認(Delphi5ですけど)したものでも
EOleSysErrorは発生しませんでした。
別のとこに問題があるような気がします。

たぶんレジストリにプログラムのパスが書き込まれるような状況になっているので、
管理者権限での実行が必要になっているのだと思います。
フルパスが書き込まれるために、フォルダを変えて実行しても、EOleSysErrorになる予感。


Mr.XRAY  2013-03-27 00:33:50  No: 44112

>別のとこに問題があるような気がします。

おかぽんさんの推察通り,おそらく,そのページを参考にして,
VBScript を使用したプログラムを作成したのではないかと思いますね.
どこかに,管理者権限を必要とするコードがあるのではないかと思います.

VBScript を悪者にしてはいけないと思い,レスを援護させていただきます.


maco  2013-03-27 00:47:42  No: 44113

おかぽんさん&Mr.XRAYさん

おそらくですが、
VBScriptとDelphiの中継にタイプライブラリ利用するためではないかと推測します。

上記サンプルは、引数&戻り値のみでデータをやり取りします。
ですが、このやり方のみではスクリプトの使い勝手が悪いので、タイプライブラリを利用しています。

以下、参考にしたサイト。(DelFusaの以下の記事にリンクあり)
http://delfusa.blog65.fc2.com/blog-entry-34.html

Malcolm Groves (すでに閉鎖)
http://www.malcolmgroves.com/stories/2004/09/23/scriptingYourDelphiApplications.html
  ↓
  ↓上記URLのWEB魚拓なら閲覧可能、(サンプルプログラムはDL不可)
  ↓
http://web.archive.org/web/20100407091636/http://www.malcolmgroves.com/stories/2004/09/23/scriptingYourDelphiApplications.html


Mr.XRAY  2013-03-27 01:25:53  No: 44114

>VBScriptとDelphiの中継にタイプライブラリ利用するためではないかと推測します。

Delphi で VBScript を利用するには,タイプライブラリの取り込みが必要です.
つまり,Fusa さんのサンプルも,どちらもタイプライブラリの取り込みをしています.

具体的なコードが分かりませんので (私はエスパーではありません)
詳細は不明ですが,

http://web.archive.org/web/20100407091636/http://www.malcolmgroves.com/stories/2004/09/23/scriptingYourDelphiApplications.html

のコードを参考にしたというのであれば,
外部の VB スクリプト内の値を操作していますね.

>上記サンプルは、引数&戻り値のみでデータをやり取りします。

どちらもほとんど同じことをやっています.
VB スクリプトに限らず,読み出しだけではなく,ファイル書き込み等の操作には
管理者権限が必要な場合があります.
これは,対象のファイルの所有者と権限(セキュリティ関係)にもよります.
そのためだと思います.

例えば以下のサンプルでは
http://mrxray.on.coocan.jp/Delphi/plSamples/950_VBScript.htm#05

Button1 クリック  --> 管理者権限が必要
Button2 クリック  --> 特に管理者権限を必要としない


au  2013-03-27 01:55:50  No: 44115

んーと、自分のアプリかなんかをスクリプトから操作するために自前のタイプライブラリを用意してるんでしょうか?

であれば、これの登録が必要になるので最初の1回だけ管理者権限が必要になるんじゃないでしょうか?

そうなると、インストーラでタイプライブラリの登録処理をするようにしておけば、使う時には問題無く実行できるようになると思います。
それか、まあ最初の1回は管理者権限で実行して貰うしかないですね。


Mr.XRAY  2013-03-27 02:05:35  No: 44116

>これは,対象のファイルの所有者と権限(セキュリティ関係)にもよります.

スミマセン.追記です.
ファイルの置き場所 (フォルダの場所) にもよります.


DEKO  2013-03-27 02:11:19  No: 44117

>> 別のとこに問題があるような気がします。
> VBScript を悪者にしてはいけないと思い,レスを援護させていただきます.
ですね。

元々のお題からすると、

・[管理者として実行] しないと動作しない = requireAdministrator の記述が必要

で間違ってはいないのですが、

・そもそも asInvoker で動くようにすべき。

これが一番です。

# Delphi 7 〜 2006 で作ったアプリを Windows Vista / 7 / 8 で動作させるのであれば、
# asInvoker なアプリケーションマニフェストを埋め込んでおいて損はないと思います。


maco  2013-03-27 03:02:43  No: 44118

Mr.XRAYさん、auさん、DEKOさん
返信ありがとうございます。

Mr.XRAYさんの発言
> 例えば以下のサンプルでは
http://mrxray.on.coocan.jp/Delphi/plSamples/950_VBScript.htm#05

> Button1 クリック  --> 管理者権限が必要
> Button2 クリック  --> 特に管理者権限を必要としない

私のWin7環境では、上記のサンプルは、管理者で実行 を指定しなくても、
どちらのボタンも動作しました。

auさんの発言
> 自分のアプリかなんかをスクリプトから操作するために自前のタイプライブラリを用意してるんでしょうか?

そうです。説明不足ですみません。

タイプライブラリでプロパティやメソッドを追加したものを、
以下のようにAddObjectしています。

FAutoObject := TAutoObject.Create;
ScriptControl.AddObject('aoIF', FAutoObject, False);

これをすると、「管理者で実行」が必要になるようです。

> インストーラでタイプライブラリの登録処理をするようにしておけば、使う時には問題無く実行できるようになると思います。
> それか、まあ最初の1回は管理者権限で実行して貰うしかないですね。

EXEはコピー配布しており、インストーラを用意していません。
そのため、今回は「管理者で実行」してもらうことで対応しました。

DEKOさんの発言
> ・そもそも asInvoker で動くようにすべき。

ScriptControl.AddObjectを使いたいのです。スクリプト機能のみでは、機能不足なので。


Mr.XRAY  2013-03-29 09:35:29  No: 44119

質問された方が,以下のアーカイブを参考にされたということですが,
サンプルがダウンロードできません.

http://web.archive.org/web/20100407091636/http://www.malcolmgroves.com/stories/2004/09/23/scriptingYourDelphiApplications.html

質問された方の発言が断片的で理解に苦しみました.そこで,
この記事を元にサンプルを作成して確認してみました.

[951_ActiveX オーメーションオブジェクトと VBScript]
http://mrxray.on.coocan.jp/Delphi/plSamples/951_ActiveX_VBScript.htm

なお,このサンプルでは,管理者権限は必要ないようです.
質問された方とはアルゴリズムが違うのか,まったく別の部分でそうなっているのかは不明です.

>> Button1 クリック  --> 管理者権限が必要
>> Button2 クリック  --> 特に管理者権限を必要としない

>私のWin7環境では、上記のサンプルは、管理者で実行 を指定しなくても、
>どちらのボタンも動作しました。

エラーが発生しないで動作するということと,期待通りの動作をする,
ということとは別の問題です.
同じように,コンパイルの時にエラーが発生しなくても,EXE 実行時に
エラーが発生したり,エラーが発生しなくても,正常に動作しないこともありますからね.


maco  2013-03-29 19:21:06  No: 44120

Mr.XRAYさん
サンプルありがとうございます。
また私の情報提供不足のため余計なお時間を取らせてしまい本当に申し訳ありません。

作成いただいたサンプルに対し、
  ①サンプルEXEをWin7上で実行
  ②サンプルソースをWin7 Delphi2010でコンパイル、EXEをWin7上で実行
  ③サンプルソースをWinXP Delphi7でコンパイル、EXEをWin7上で実行
と試しました。

①は、正しく動作しました。
    (EXE起動時にEOleSysErrorが発生することなくフォームが表示される。スクリプト処理も正常に動作する)

②も、①と同様。正しく動作します。

③は、EXE起動時にEOleSysErrorが発生しました。やはり管理者権限で実行をすると正しく動作します。

さらに原因を調べました。
前回、以下の発言をしましたがこれは間違いでした。すみません。

> FAutoObject := TAutoObject.Create;
> ScriptControl.AddObject('aoIF', FAutoObject, False);
> これをすると、「管理者で実行」が必要になるようです。

AddObject有/無 と EOleSysErrorと関係ありません。
コメントアウトのみでチェックできる内容を、憶測おみで発言してしまいすみません。

現時点、私の環境(WinXP Pro SP3、Delphi7 Ent)では、
uses
  uAutoObject; 
としたEXEは、Win7での実行時にEOleSysErrorが発生しました。

しかし以前同じ環境で作成したEXEはWin7でEOleSysErrorは発生しません。(フォルダ構成&アクセス設定も同じ)
今回のチェックのため、同じソースで作成したEXEはEOleSysErrorが発生します。

引き続き原因を調査します。しばらくお待ちください。


Mr.XRAY  2013-03-29 20:49:03  No: 44121

>としたEXEは、Win7での実行時にEOleSysErrorが発生しました。

どんなエラーですか.だいたい想像はつきますが.

[コンパイルのエラーメッセージ等のコピー方法 ( エラー報告用 )]
http://mrxray.on.coocan.jp/Delphi/Others/RunError.htm#03

Ole というのがあるのは,ActiveX 関係です.
ActiveX は OLE ともいいます.今は ActiveX というのが一般的です.
これは,Windows のバージョンによって,仕様が少し違う場合があります.
基本的には,実行環境と同じ環境で,ActiveX オブジェクトを作成する方が無難です.

それと,○囲み数字は,「機種依存文字」というものです.
インターネット上では(メールもインターネット経由です),使わない方が
無難です.ごくまれですが,機種依存文字を使ったと思われる発言があり,
発言内容が読めなくなるものがありました.
ネット上で,メールのマナーとか掲示板のマナー等で検索して調べることができます.


Mr.XRAY  2013-03-29 21:04:07  No: 44122

>基本的には,実行環境と同じ環境で,ActiveX オブジェクトを作成する方が無難です.

ActiveX オブジェクトの生成コードは,Delphi のバージョンによっても
違う場合があります.特に,非Unicode 版と Unicode 版で異なる可能性があります.

したがって,
非Unicdoe 版で作成した ActiveX を Unicode 版のDelphiで使用する
Unicdoe 版で作成した ActiveX を 非Unicode 版のDelphiで使用する

で違うことも考えられます.
正確には,やってみないと確実なことは言えませんが.そう考えていた方が無難です.


maco  2013-03-29 22:46:16  No: 44123

Mr.XRAYさん
いろいろとアドバイスありがとうございます。
もうすこし原因を調べてみます。

参考までに、エラーメッセージは以下となります。
---------------------------------------------------------------------
  EOleSysError がモジュール Project1.exe の 00059EB1 で発生しました。
  OLE レジストリへのアクセス エラーです。.
---------------------------------------------------------------------
uses
  uAutoObject; 
としたフォームを

  Application.CreateForm(TForm1, Form1);
でフォーム生成中にエラー発生しています。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加