1

私は Delphi の初心者です。この言語を学びたいのですが、エラーが発生し、どこに問題があり、どのように修正すればよいかわかりません。この例では、本から Delphi に移行します。

エラー

[Pascal エラー] Engine.pas(41): E2250 これらの引数で呼び出すことができる 'ShellExecute' のオーバーロードされたバージョンはありません

すべてのコード:

unit Engine;
interface
uses Windows, Classes, SysUtils;
type
  TTemplate = array of String;
  TEngine = class
private
  FFileName : String;
  FFileLines : TStringList;
protected
  procedure Execute(Path : String); virtual;
public
  Pattern : TTemplate;
  Replace : TTemplate;
  procedure Parse;
  constructor Create(FileName : String);
  destructor Destroy; override;
end;
implementation
{ TEngine }
uses ShellAPI; // włączenie modułu ShellAPI
constructor TEngine.Create(FileName : String);
begin
  FFileName := FileName; // przypisanie wartości parametru do
  FFileLines := TStringList.Create; // utworzenie typu TStringList
  FFileLines.LoadFromFile(FileName); // załadowanie zawartości
  inherited Create;
end;
destructor TEngine.Destroy;
begin
  FFileLines.Free; // zwolnienie typu
  { zwolnienie tablic }
  Pattern := nil;
  Replace := nil;
  DeleteFile('temporary.html'); // wykasowanie pliku tymczasowego
  inherited; // wywołanie destruktora klasy bazowej
end;
procedure TEngine.Execute(Path: String);
begin
  // otwarcie pliku w przeglądarce Internetowej
  ShellExecute(0, 'open', PChar(Path), nil, nil, SW_SHOW);
end;
procedure TEngine.Parse;
var
  i : Integer;
begin
  for I := Low(Pattern) to High(Pattern) do
  { zastąpienie określonych wartości w FFileLines }
  FFileLines.Text := StringReplace(FFileLines.Text, Pattern[i],
  Replace[i], [rfReplaceAll]);
  FFileLines.SaveToFile('temporary.html');
  Execute('temporary.html');
end;
end.

エラーのある場所

ShellExecute(0, 'open', PChar(Path), nil, nil, SW_SHOW);

画像エラー ここに画像の説明を入力

Ctrl + クリック

[SuppressUnmanagedCodeSecurity, DllImport(shell32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'ShellExecute')]
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  Directory: string; ShowCmd: Integer): HINST; external;
[SuppressUnmanagedCodeSecurity, DllImport(shell32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'ShellExecute')]
4

1 に答える 1

0

ShellExecuteの .net 実装での の宣言を見ると、ShellAPI何をすべきかは明らかです。へのキャストを停止しPChar、次のようにコードを記述します。

ShellExecute(0, 'open', Path, '', '', SW_SHOW);

今までこれを理解していませんでしたが、Delphi.net から行う Windows API 呼び出しは、DllImport他の .net 言語と同じ属性を使用しているようです。これは理にかなっていると思います。これらは、C# 相互運用コードに見られる通常の p/invoke 呼び出しです。

nil興味深いことに、これらの文字列パラメーターのいずれかに渡そうとするとコンパイラ エラーが発生することが報告されています。つまり、C 文字列を想定している API 関数にヌル ポインターを渡す簡単な方法はありません。あなたがしなければならないことは、Pointer渡したいパラメータの を受け取ったオーバーロードされた外部宣言を使用することですnil

余談ですが、Embarcadero の開発者はDllImport宣言に間違いを犯しました。彼らは、スレッドの最後のエラー値を設定しないSetLastError = Trueために、どれが正しくないかを設定します。ShellExecute

于 2013-04-23T09:43:15.113 に答える