こんにちは。はじめまして。
DELPHIをはじめようとしているものです。DELPHIではVBでのCALL関数のように他のEXEを実行したり、または直接WSFファイルを呼び出して実行する事は可能でしょうか?
トライアル版で試そうとホームページから登録したのに、メールにライセンスキーが送られてこないんですが、どうしてでしょうか?これもご存知の方がいらっしゃればご教授をお願いいたします。宜しくお願いします。
追加補足ですが、トライアル版が入手できたので、掲示板から参考に
以下のようにソースを書いたのですが、'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.
自己レスばかりですみません。
下記でテストしたところ通りました!!
有難う御座います。
ただ、実際にやりたい事としては、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.
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/を見た方がいい(少々古いものもあるが)
漂流者さんご回答有難う御座います。
ただ、試したもののうまくいきませんでした。プロセスが有効ではありません。と
でてしまいます。
プロジェクトのユニットへ記入もしているつもりなのですが、、、
ソースを添付させていただきました。。何かわかりますでしょうか??
<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.
wsfを関連付け実行するだけならこれでいけると思います。
program Project1;
uses
Windows,
ShellAPI;
{$R *.res}
begin
ShellExecute(0, nil, 'c:\t.wsf', nil, nil, SW_SHOW);
end.
すまん、言い忘れたことがあるので追記
Application.ShowMainForm := False; をプロジェクトのソースに入れて
TForm1(メインのフォーム)のOnCreateにButton2Clickの
実行するコードを移せば起動時に実行されるはず。
(最後にSelf.Closeを入れておけば、勝手にプログラムの方は終了する)
>>プロセスが有効ではありません
Delphi6では出なかったがな...
もっとも、かみづさんの方がはるかに効率はいい
でも、実行するだけならショートカットでもいいのでは?
皆々様有難う御座いました。。
おかげさまで、無事実行可能なモジュールが完成しました。。
今回はVBSのソースをユーザに見せたくなかった(セキュリティ)ので、
EXEからの実行とし、本体はリンク先を含め見せない事を考えておりました。
VBもDelphiも難しいですね。。これから勉強していきます。。
ツイート | ![]() |