ホーム >プログラム >Delphi 6 ローテクTips >Char型

Char型の注意点。



参考サイトのサンプル。

procedure TForm1.Button1Click(Sender: TObject);
var
  FName: String;
begin
  FName := 'Test.vbs';
  ShellExecute(Handle, 'OPEN', PChar(FName), PChar('1'), nil, SW_NORMAL);
end;

Test.vbsの中身。

msgbox WScript.Arguments.Item(0)

実行してボタンを押すとアクセス違反のエラーになります。

Read of adress 00000031 の31はOrd('1')と同じです。
ちなみに、
  ShellExecute(Handle, 'OPEN', PChar(FName), PChar('2'), nil, SW_NORMAL);
とすれば Read of adress 00000032 になりますし
  ShellExecute(Handle, 'OPEN', PChar(FName), PChar('A'), nil, SW_NORMAL);
とすれば Read of adress 000000041 になります(Ord('A')は10進値で41)

procedure TForm1.Button1Click(Sender: TObject);
var
  FName: String;
  FArg:  Char;
begin
  FName := 'Test.vbs';
  FArg  := '1';
  ShellExecute(Handle, 'OPEN', PChar(FName), PChar(FArg), nil, SW_NORMAL);
end;

としても同じく Read of adress 00000031 となってしまいます。
どうやらChar型の文字をPCharでキャストするのはNGなようで、上記のような場合はそのまま渡す必要があるようです。

procedure TForm1.Button1Click(Sender: TObject);
var
  FName: String;
begin
  FName := 'Test.vbs';
  ShellExecute(Handle, 'OPEN', PChar(FName), '1', nil, SW_NORMAL); //PCharでキャストせずそのまま渡す
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  FName: String;
  FArg:  Char;
begin
  FName := 'Test.vbs';
  FArg  := '1';
  ShellExecute(Handle, 'OPEN', PChar(FName), FArg, nil, SW_NORMAL); //これもPCharでキャストせずそのまま渡す
end;

2010-10-08: