3

Inno Setup スクリプトでは、GetExceptionMessage は空のメッセージを返します (コロン ":" 記号のみが含まれます)。Inno Setup の最新バージョン (5.4.2) が使用されます。

try
  Log('Create IISNamespace');
  // Create IIS namespace object
  if Length(virtualDirectoryName) > 0 then
  begin
    IIS := CreateOleObject('IISNamespace');
    Log('Get IIsWebService');
    WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');
    Log('Get IIsWebServer');
    WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
    Log('Get IIsWebVirtualDir');
    WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');
    Log('Delete IIsWebVirtualDir');
    WebRoot.Delete('IIsWebVirtualDir', virtualDirectoryName);
    WebRoot.SetInfo();
  end;
except
  MsgBox(ExpandConstant('{cm:IISException,'+ GetExceptionMessage +'}'),
    mbInformation, mb_Ok);
  Log('Uninstall IIS 6 exception: ' + GetExceptionMessage);
end;

IIsWebVirtualDir の削除中に例外が発生します。例外タイプまたは実際の例外メッセージを取得する方法はありますか?

ありがとう、デニス。

4

1 に答える 1

0

GetExceptionMessageまたはShowExceptionMessageが壊れているかどうかを確認するために、次の例を書きました。Inno setup 5.4.2 Unicode バージョンと Ansi バージョンの両方を使用しました。

[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\test

[Code]
function InitializeSetup(): Boolean;
var
 I: Integer;
begin
 try
  I := I div 0; // Raise an exception 
 except
      MsgBox(GetExceptionMessage,
      mbError, MB_OK);

      ShowExceptionMessage;
 end;
 result := false;
end;

同梱の CodeAutomation.iss も実行したところ、期待どおりに動作しました。これは、壊れている可能性があるという Alex K. のコメントに反しています。

ルーチンが機能することがわかったので、コードを取得して次のセットアップ テスト スクリプトを作成し、実行しました。ISSNamespace がインストールされていないため、見つからないという例外が発生しました。

[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\test
[CustomMessages]
IISException =ISS Exception " %1 " occured.

[Code]

const
  IISServerName = 'localhost';
  IISServerNumber = '1';
  IISURL = 'http://127.0.0.1';

function InitializeSetup(): Boolean;
var
  IIS, WebSite, WebServer, WebRoot, VDir: Variant;
  virtualDirectoryName : String;
begin
virtualDirectoryName := 'test';
try
  Log('Create IISNamespace');
  // Create IIS namespace object
  if Length(virtualDirectoryName) > 0 then
  begin
    IIS := CreateOleObject('IISNamespace');
    Log('Get IIsWebService');
    WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');
    Log('Get IIsWebServer');
    WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
    Log('Get IIsWebVirtualDir');
    WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');
    Log('Delete IIsWebVirtualDir');
    WebRoot.Delete('IIsWebVirtualDir', virtualDirectoryName);
    WebRoot.SetInfo();
  end;
except
 MsgBox(ExpandConstant('{cm:IISException,'+ GetExceptionMessage +'}'),
    mbInformation, mb_Ok);
  Log('Uninstall IIS 6 exception: ' + GetExceptionMessage);
end;
end;

しかし、このスクリプトの作成中に致命的な欠陥があり、それが問題になる可能性があります。

セクションを確認[CustomMesssages]して、メッセージに %1 が含まれていることを確認してください。それ以外の場合、何も返されません。

于 2011-05-14T15:13:35.270 に答える