ホーム
Top.Mail.Ru Yandeks.Metrika
フォーラム: "WinAPI";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

ダウン

WinExecのneponyatka 似ている枝を探す


Besa   (2001-09-11 11:11) [0]

良い一日! ここNeponyatkaはこれです:下の例ではWinExecは正常に動作します
WinExec( "arj ac:\ temp \ Db.arj c:\ temp \ Db.txt"、SW_SHOW)
しかし、私が変数を渡そうとすると(下記参照)
1変数
WinExec( "arj ac:\ temp \ Db" + ORG + ".arj c:\ temp \ Db" + "ORG" + ".txt"、SW_SHOW)
2変数
WinExec(Str1、SW_SHOW)
ノックエラー:
[エラー] Unit1.pas(88)互換性のない型: "String"と "PChar"
そしてDeleteFileはうまく働きます
コード例:

var DUBL、ORG、Str1:ストリング。
i、y:整数。
F:System.Text;

始まる
Query1.Active:= True。
Query1.First;
ORG:= Query1.FieldByName( "pr_org")。AsString;
Str1:= "arj ac:\ temp \ Db" + ORG + ".arj c:\ temp \ Db" + ORG + ".txt";

WinExec( "arj ac:\ temp \ Db" + ORG + ".arj c:\ temp \ Db" + "ORG" + ".txt"、SW_SHOW)<32の場合
その後
始まる

終わり
ほかに
deletefile( "c:\ temp \ Db" + ORG + "。txt")の場合
その後
ShowMessage(DELETE! ")
ほかに
ShowMessage( "NOT DELETE!");
教えてください、pls、私は何が悪いのですか



Digitman   (2001-09-11 11:29) [1]

WinExec(PChar(Str1)、SW_SHOW)

そして、あなたの意見では、stringとPCharの間に違いはありません。 深く間違えた!



Юрий Зотов   (2001-09-11 11:32) [2]

その点では、PCharが必要な場所に文字列パラメータを渡します。 定数の場合は、コンパイラがすべての処理を行い、変数の場合は、明示的な型変換を使用します。

WinExec(PChar( "arj ac:\ temp \ Db" + ORG + ".arj c:\ temp \ Db" + "ORG" + ".txt")、SW_SHOW);

WinExec(PChar(Str1)、SW_SHOW);



Besa   (2001-09-11 11:43) [3]

>すべて
ありがとうございました!
あなたは気を散らす無知を許します... :)



Besa   (2001-09-11 19:09) [4]

>すべて
また無知な気になる
WinExecは終了コード> 31を返してから実行します...
質問:
(外部プログラムの完了を待つという意味で)これはプログラム作業と呼ばれますか? すなわち この例では、アーカイブする前に削除することは可能ですか?
2)外部プログラムからエラーレベルを取得する方法
(3)知りたい - このサブジェクトによって返されるすべての完了コード
0システムのメモリまたはリソースが不足しています。
ERROR_BAD_FORMAT .EXEファイルが無効です(Win32以外の.EXE、または.EXEイメージ内のエラー)。
ERROR_FILE_NOT_FOUND指定されたファイルが見つかりませんでした。
ERROR_PATH_NOT_FOUND指定されたパスが見つかりませんでした。
事前のおかげで



Юрий Зотов   (2001-09-11 22:40) [5]

1 いいえ、待っていません。 それは始まったばかりです - そしてそれはそれです、そして次に何が起こるか - 誰もが知りません。

2 そのプロセスのハンドルを取得し、それが完了するのを待ち、GetExitCodeProcessを呼び出します。

3 ヘルプに他のコードはありません。 私はそれがすべてだと思います。

CreateProcess関数を使用する必要があるように見えます。これにより、すべてを1つのボトルにまとめることが簡単になります。 これは、外部プログラムを開始し、その完了を待って戻りコードを取得し、最後にイベントハンドラを呼び出す例です。

ユニットUnit1。

インタフェース

使用されます
SysUtils、クラス、コントロール、フォーム、StdCtrls。

type
TForm1 =クラス(TForm)
Button1:TButton。
Procedure Button1Click(送信者:TObject);
プライベート
プロシージャThreadFinished(送信者:TObject)。
終わり

VAR
Form1:TForm1;

実装

使用されます
Unit2;

{$ R * .DFM}

procedure TForm1.Button1Click(送信者:TObject);
始まる
// 2番目のスレッドを作成して設定します。 それは外部プログラムを起動します。
//完了するまで待って、ハンドラを呼び出してリターンコードを返します。
TMyThread.Create(False)を使って
始まる
CommandLine:= "Notepad.exe AutoExec.bat"; //あなたを代用します
WorkingDirectory:= "C:\"; //あなたを代用します
OnTerminate:= ThreadFinished
終わり
終わり

procedure TForm1.ThreadFinished(送信者:TObject);
始まる
//外部プログラムは終了しました。 2番目のスレッドはもう必要ありません。
TMyThread(Sender)とは
始まる
キャプション:= IntToStr(ExitCode);
無料
終わり
終わり

終わり。

=========================================

ユニットUnit2。

インタフェース

使用されます
ウィンドウズ、クラス

type
TMyThread = class(TThread)
プライベート
FCommandLine:文字列。
FWorkingDirectory:文字列。
FExitCode:DWORD。
保護された
実行する 上書きします。
公共
property CommandLine:文字列読み取りFCommandLine書き込みFCommandLine。
property WorkingDirectory:文字列読み取りFWorkingDirectory書き込みFWorkingDirectory;
property ExitCode:DWORDはFExitCodeを読み取ります。
終わり

実装

手順TMyThread.Execute;
VAR
SI:TStartupInfo;
PI:TProcessInformation。
始まる
// SI構造を準備する
ZeroMemory(@SI、SizeOf(SI));
SI.cb:= SizeOf(SI)。
//外部プログラムを実行しようとしています
CreateProcess(nil、PChar(FCommandLine)、nil、nil、False、0、nil、PChar(FWorkingDirectory)、SI、PI)の場合
始まる
CloseHandle(PI.hThread); //不要なシステムリソースを解放します。
//毎秒1回、Terminated 1チェックの完了を待っています。
終了していない間は(WaitForSingleObject(PI.hProcess、1000)= WAIT_TIMEOUT)を行います。
//取得するか、リターンコードを作成します(短いブールスキームがあるはずです)
終了した、またはGetExitCodeProcess(PI.hProcess、FExitCode)ではない場合、FExitCode:= $​​ FFFFFFFF;
CloseHandle(PI.hProcess)//不要なシステムリソースを無料でダウンロード
終わり
そうでなければFExitCode:= GetLastError //起動に失敗した、理由を調べる
終わり

終わり。



Besa   (2001-09-12 09:56) [6]

>ユリゾトフ
どうもありがとうございました。
アルハンゲリスクの本「Delphi 5」に、より多くの完了コードを蓄積した。
必要に応じて、転載して投稿することができます。私は怠け者だからではなく、他の人がこのサイトで作業しているのであれば二重の作業をしないためにお願いします。
そしてゆり、記事を追加するためにあなたを参照することができます
http://delphi.mastak.ru/articles/winexec/index.html
あなたの例では、 この記事では、私が理解している限りでは、ヘルプDelphiはロシア語で記述されており、外部プログラムとの対話については何も言っていませんか?



Юрий Зотов   (2001-09-12 15:24) [7]

補足、欲求があれば、役に立つことは、そうではありません。 記事を補足する前に、著者のMikhail Podmogovの同意を得る必要があると私は思います。 またはあなた自身の独立した記事を書いてください。

そしてもっと。 FWorkingDirectoryが空の文字列の場合(これはごく普通のもので、簡単にできることもあります)、PChar(FWorkingDirectory)はエラーを返します。 この場合、対応するCreateProcessパラメータでは、単にnilを渡す必要があるため、TMyThread.Executeメソッドのコードを少し変更することが望ましいです。 例えば、

VAR
PWorkDir:PChar。 // Execute内の別のローカル変数
...
FWorkingDirectory = ""の場合
それからPWorkDir:= nil
そうでなければPWorkDir:= @FWorkingDirectory [1];

そして今、私たちはPWorkDirを転送します。

ただし、テキストで言及するだけで、そのまま残すことができます。 「サハラ砂漠での飼いならされたライオンの捕獲は、独立した演習として読者に提供される」(「物理学者の冗談」という本から)。



Besa   (2001-09-12 17:20) [8]

>ユリゾトフ
ありがとうございます!
マイケルへの手紙、私はすでに送った。 答えを待ちます。
彼の沈黙に十分ではないかもしれませんが、私は試してみます。



handra   (2001-09-12 19:24) [9]

開始して完了を待つ別のオプション:

function ExecAndWait(const fname、params:string; nShowCmd:Cardinal):ブール値。
var data:TShellExecuteInfo;
始まる
結果:= false。
data.cbSize:= sizeof(data);
data.fMask:= SEE_MASK_DOENVSUBSTまたはSEE_MASK_NOCLOSEPROCESS。
data.Wnd:= 0;
data.lpVerb:= nil;
data.lpFile:= PChar(fname);
data.lpParameters:= PChar(params);
data.lpDirectory:= nil;
data.nShow:= nShowCmd;
ShellExecuteEx(@data);
本当のうちに始める
Application.ProcessMessages;
ケースWaitForSingleObject(data.hProcess、100)
WAIT_FAILED:結果:= false。
WAIT_OBJECT_0:結果:= true;
それ以外の場合は続行します。
終わり
破る;
終わり
終わり



Delirium   (2001-10-08 18:59) [10]

そしてWinExecだけが弱い(PChar( ".....")、SW_SHOW)?



vovan1   (2001-11-07 18:15) [11]

紳士、助けてください! Yu。Ozerovが提供したコードを試してみましたが、問題はこれです:いくつかのファイルをアーカイブに入れる方法は? ファイルごとにアーカイバを別々のストリームで呼び出すサイクルを実行すると、アーカイブには1つか2つのファイルしかありませんが、4つ必要です。 この状況から抜け出す方法は? 前のプロセスがうまくいくまで、次のプロセスの実行を遅くするにはどうすればいいですか? 助けて!!



ページ: 1 全枝

フォーラム: "WinAPI";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

2階





メモリ:0.6 MB
時間:0.028 c
14-22339
Zo Wootのような中国人
2001-11-01 10:12
2002.01.08
プログラマー、あなたのニックネームには何がありますか?


3-21941

2001-11-30 14:56
2002.01.08
アプリケーションからIB SQLプロシージャを作成してください。


3-21942
回転
2001-12-03 12:19
2002.01.08
親切な人がストアドプロシージャを手伝います。


7-22449
シュミ
2001-09-15 07:45
2002.01.08
Windowsのお気に入り


14-22386
密な
2001-11-08 21:13
2002.01.08
面白い? いくら?





アフリカーンス語 アルバニア語 アラビア語 アルメニア語 アゼルバイジャン語 バスク ベラルーシ ブルガリア語 カタルーニャ語 中国語(簡体字) 中国語(繁体字) クロアチア語 チェコ語 デンマーク語 オランダ語 英語 エストニア語 フィリピン語 フィンランド語 フランス語
ガリシア語 ジョージアン ドイツ語 ギリシャ語 ハイチ語 ヘブライ語 ヒンディー語 ハンガリー語 アイスランド語 インドネシア語 アイリッシュ イタリア語 日本語 韓国語 ラトビア語 リトアニア マケドニア語 マレー語 マルタ語 ノルウェー語
ペルシア語 ポーランド語 ポルトガル語 ルーマニア語 ロシア語 セルビア スロバキア語 スロベニア語 スペイン語 スワヒリ語 スウェーデン語 タイ語 トルコ語 ウクライナ語 ウルドゥー語 ベトナム語 ウェールズ語 イディッシュ語 ベンガル語 ボスニア語
セブアノ語 エスペラント グジャラート語 ハウサ語 モン族 イボ ジャワ語 カンナダ語 クメール語 ラオ語 ラテン マオリ語 マラーティー語 モンゴル語 ネパール語 パンジャブ語 ソマリ タミル語 テルグ語 ヨルバ語
ズールー語
Английский Французский Немецкий Итальянский ポルトガル語 Русский Испанский