WSFファイルをコールするには?

解決


DODO  2006-07-16 17:12:36  No: 22635

こんにちは。はじめまして。
DELPHIをはじめようとしているものです。DELPHIではVBでのCALL関数のように他のEXEを実行したり、または直接WSFファイルを呼び出して実行する事は可能でしょうか?

トライアル版で試そうとホームページから登録したのに、メールにライセンスキーが送られてこないんですが、どうしてでしょうか?これもご存知の方がいらっしゃればご教授をお願いいたします。宜しくお願いします。


DODO  2006-07-16 20:05:46  No: 22636

追加補足ですが、トライアル版が入手できたので、掲示板から参考に
以下のようにソースを書いたのですが、'C:\test.exe'が起動されてきません。
コンパイルエラーは出ていないのですが、原因が思い当たりますでしょうか?
どうぞご教授をお願いいたします。

procedure TForm1.Button1Click(Sender: TObject);
   var
  hoge:string;
  ret: Boolean;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin

  Application.Initialize;
  CreateProcess(nil,PChar('C:\test.exe'),nil,nil,False,0,nil,nil,StartupInfo,ProcessInfo);

  Application.Run;

end;

end.


DODO  2006-07-16 20:26:00  No: 22637

自己レスばかりですみません。
下記でテストしたところ通りました!!
有難う御座います。
ただ、実際にやりたい事としては、Formを起動しないでEXEのみを実行したいのですが、可能でしょうか?VBではスタートアップ等の設定でしたが、DELPHIでは調べたのですが、分かりませんでした。皆様どうぞ宜しくお願いいたします。

procedure TForm1.Button2Click(Sender: TObject);

var
  ret: Boolean;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  // 表示状態を設定
  with StartupInfo do begin
    // この構造体のサイズを指定
    cb := SizeOf(TStartupInfo);
    // ウィンドウの位置を指定
    dwX := 0;
    dwY := 0;
    // ウィンドウのサイズを指定
    dwXSize := 640;
    dwYSize := 480;
    // ウィンドウの表示状態を指定
    wShowWindow := SW_SHOWNORMAL;
    // 有効な設定項目を指定
    dwFlags := STARTF_USESHOWWINDOW
      or STARTF_USESIZE or STARTF_USEPOSITION;
    // それ以外の項目を初期化
    lpReserved := nil;
    lpDesktop  := nil;
    lpTitle    := nil;
    cbReserved2 := 0;
    lpReserved2 := nil;
  end;
  // 実行
  ret := CreateProcess(
    nil,                        // 実行ファイル名
    'C:\test.exe',              // コマンドライン
    nil,                        // プロセスのセキュリティ属性
    nil,                        // スレッドのセキュリティ属性
    False,                      // 親プロセスからハンドルを継承するか
    CREATE_DEFAULT_ERROR_MODE,  // 優先順位とプロセスの制作制御
    nil,                        // 環境変数ブロックへのポインタ
    nil,                        // カレントディレクトリ
    StartupInfo,                // ウィンドウの属性
    ProcessInfo                 // 新しいプロセスの情報を受け取る構造体
  );
  // エラーチェック
  if not ret then
    ShowMessage('実行できません (' + IntToStr(GetLastError) + ')');

end;

end.


漂流者  2006-07-17 00:46:16  No: 22638

TForm1がメインのフォームなら

Application.ShowMainForm := False;
コレをフォームのユニットではなくプロジェクトのユニット内に書く

program Project1;

中略...
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);

  Application.ShowMainForm := False; //こんな感じ
  Application.Run;
end.

P.S
VBからDelphiに移るならwww.wwlnk.com/boheme/を見た方がいい(少々古いものもあるが


DODO  2006-07-17 06:06:40  No: 22639

漂流者さんご回答有難う御座います。
ただ、試したもののうまくいきませんでした。プロセスが有効ではありません。と
でてしまいます。
プロジェクトのユニットへ記入もしているつもりなのですが、、、
ソースを添付させていただきました。。何かわかりますでしょうか??

<Project2ソース>
program Project2;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.ShowMainForm := False;
  Application.Run;
end.

<Unit1ソース>
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);

var
  ret: Boolean;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  // 表示状態を設定
  with StartupInfo do begin
    // この構造体のサイズを指定
    cb := SizeOf(TStartupInfo);
    // ウィンドウの位置を指定
    dwX := 0;
    dwY := 0;
    // ウィンドウのサイズを指定
    dwXSize := 640;
    dwYSize := 480;
    // ウィンドウの表示状態を指定
    wShowWindow := SW_SHOWNORMAL;
    // 有効な設定項目を指定
    dwFlags := STARTF_USESHOWWINDOW
      or STARTF_USESIZE or STARTF_USEPOSITION;
    // それ以外の項目を初期化
    lpReserved := nil;
    lpDesktop  := nil;
    lpTitle    := nil;
    cbReserved2 := 0;
    lpReserved2 := nil;
  end;
  // 実行
  ret := CreateProcess(
    nil,                        // 実行ファイル名
    'C:\windows\system32\wscript.exe c:\t.wsf',              // コマンドライン
    nil,                        // プロセスのセキュリティ属性
    nil,                        // スレッドのセキュリティ属性
    False,                      // 親プロセスからハンドルを継承するか
    CREATE_DEFAULT_ERROR_MODE,  // 優先順位とプロセスの制作制御
    nil,                        // 環境変数ブロックへのポインタ
    nil,                        // カレントディレクトリ
    StartupInfo,                // ウィンドウの属性
    ProcessInfo                 // 新しいプロセスの情報を受け取る構造体
  );
  // エラーチェック
  if not ret then
    ShowMessage('実行できません (' + IntToStr(GetLastError) + ')');

end;

end.


かみづ  2006-07-17 10:04:07  No: 22640

wsfを関連付け実行するだけならこれでいけると思います。

program Project1;

uses
  Windows,
  ShellAPI;

{$R *.res}

begin
  ShellExecute(0, nil, 'c:\t.wsf', nil, nil, SW_SHOW);
end.


漂流者  2006-07-18 01:16:15  No: 22641

すまん、言い忘れたことがあるので追記
Application.ShowMainForm := False; をプロジェクトのソースに入れて

TForm1(メインのフォーム)のOnCreateにButton2Clickの
実行するコードを移せば起動時に実行されるはず。
(最後にSelf.Closeを入れておけば、勝手にプログラムの方は終了する)

>>プロセスが有効ではありません
Delphi6では出なかったがな...

もっとも、かみづさんの方がはるかに効率はいい

でも、実行するだけならショートカットでもいいのでは?


DODO  2006-07-18 06:50:14  No: 22642

皆々様有難う御座いました。。
おかげさまで、無事実行可能なモジュールが完成しました。。
今回はVBSのソースをユーザに見せたくなかった(セキュリティ)ので、
EXEからの実行とし、本体はリンク先を含め見せない事を考えておりました。
VBもDelphiも難しいですね。。これから勉強していきます。。


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

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






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