
http://mrxray.on.coocan.jp/Halbow/Notes/N001.htmlを基に
//----------
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
function WinExecAndWait32(FileName: string; Visibility: Integer): Longword;
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.WinExecAndWait32(FileName: string; Visibility: Integer): Longword;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil, //<<<<<<<<<<ここで停止します
PChar(FileName), // pointer to command line string
nil, // pointer to process security attributes
nil, // pointer to thread security attributes
False, // handle inheritance flag
CREATE_NEW_CONSOLE or // creation flags
NORMAL_PRIORITY_CLASS,
nil, // pointer to new environment block
nil, // pointer to current directory name
StartupInfo, // pointer to STARTUPINFO
ProcessInfo) // pointer to PROCESS_INF
then Result := WAIT_FAILED
else
begin
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end; { WinExecAndWait32 }
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExecAndWait32('Notepad.exe',SW_SHOW);
ShowMessage('メモ帳が終了しました');
end;
end.
//--------------------
というプログラムの動作テストをしているのですが、ボタンを押すと、例外クラス$C0000005(メッセージaccess violation at 0x765affeb:write of adress 0x005b48ee)を送出しました。というエラーメッセージが出て停止します。
if not CreateProcess(nil, のところで止まるようです。
何か足らないところがあるのでしょうか?
Delphi XE5 Starterを使っています。
No.2ベストアンサー
- 回答日時:
最初の質問「if not CreateProcess(nil, のところで止まるようです。
」については、if文の前に「UniqueString(FileName);」を追加します。捕捉コメントの質問「CardinalとLongBoolには互換性がありません」は、CreateProcess関数の返値のBOOL型(LongBool型の別名)の値をLongword型の変数resultに代入しているためです。
No.1
- 回答日時:
バージョン間による違いだったりするんじゃないですかねぇ…
http://edn.embarcadero.com/jp/article/38791
より…
>Delphi 2007(またはそれ以前) の PChar型は AnsiChar(バイト) 配列へのポインタですが、Delphi 2009 の PChar型は WideChar(ワード) 配列へのポインタとなっています。
ということで、CreateProcessW()がコールされているとすると…
http://kujirahand.com/blog/index.php?2009%252F04 …
や
http://stackoverflow.com/questions/6705532/acces …
など。
定数(文字列定数)として渡すとアウト…という部分かも知れません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
c言語で任意のファイルから読み...
-
ExcelVBAでのkernel32(64bit)
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
C言語のポインタに直接アドレス...
-
VC6.0で作ったライブラリをVBで...
-
VC++でmciSendString
-
アプリを32bitから64bit移行
-
sizeofについて
-
VC++6.0 MFC ダイアログバーを...
-
【C言語】戻り値が構造体の関数
-
NULLポインタが0でない処理系と...
-
パスからファイル名を抽出
-
#define NULL ((void *)0) の弊害
-
デバイスハンドルとは?
-
VB6でポインタ?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
プーさんのマウスポインタを教...
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
自作DLLの引数について、ポイン...
-
NULLポインタが0でない処理系と...
-
TCHAR文字列内の検索について
おすすめ情報
ありがとうございます。
次のようにしたのですが、
実行すると「CardinalとLongBoolには互換性がありません」と出ます。
//------------------------------
function TForm1.WinExecAndWait32(cmd: string): Longword;
var
pi: TProcessInformation;
si: TStartupInfo;
begin
UniqueString(cmd);// ** Point **
result := CreateProcess(nil, PWideChar(cmd), nil, nil, False,
CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pi);
end; { WinExecAndWait32 }
///続き
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExecAndWait32('Notepad.exe');
ShowMessage('メモ帳終了');
end;
end.
回答ありがとうございます。
返値の型をLongBoolに変え、
GetExitCodeProcess(ProcessInfo.hProcess, Result);をコメントアウトしたところ、うまく動作しました。
この行が(私のアプリに)いるのかどうか今のところ不明ですが、おかげさまで一歩前に進めました。
ありがとうございます。