没有'ShellExecute'Delphi的重载版本

时间:2013-04-23 08:18:37

标签: delphi delphi-2006

我是Delphi的初学者,现在我想学习这门语言,但我有错误,我不知道问题出在哪里以及如何解决。这个例子我把它从书到delphi。

错误

[Pascal Error] 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);

图片错误 enter image description here

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')]

1 个答案:

答案 0 :(得分:0)

查看ShellExecute的.net实现中ShellAPI的声明,很清楚该怎么做。停止转换为PChar并编写如下代码:

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

直到现在我还没有意识到这一点,但似乎您从Delphi.net调用的Windows API使用与其他.net语言相同的DllImport属性。我想这是有道理的,这些只是普通的p / invoke调用,可以在C#interop代码中找到。

有趣的是,您报告尝试将nil传递给其中一个字符串参数会导致编译器错误。这意味着没有简单的方法将空指针传递给需要C字符串的API函数。您需要做的是使用一个重载的外部声明,该声明收到Pointer作为您要传递nil的参数的参数。

顺便说一句,Embarcadero开发人员在DllImport声明中犯了一个错误。他们为SetLastError = True设置了ShellExecute,这对{{1}}没有设置线程的最后错误值。