【问题标题】:There is no overloaded version of 'ShellExecute' Delphi没有“ShellExecute”Delphi 的重载版本
【发布时间】:2013-04-23 08:18:36
【问题描述】:

我是 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);

图片错误

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

【问题讨论】:

  • 我无法复制。我也怀疑错误信息。我记得没有任何 Delphi 编译器说过 [Pascal Error]。你真的在使用Delphi吗?哪个版本?
  • Delphi 是 Pascal 的儿子,可能在 Borland Developer 2006 中他们编写了 [Pascal] - 但正如我告诉你的那样,我是初学者。
  • @RBA 我在帖子中添加了图片
  • 您是否 100% 确定要使用 .net 编译器?我建议改用本机编译器。
  • @Arioch '我编辑了我的帖子并添加了单击 ctrl + click 时获得的信息

标签: delphi delphi-2006


【解决方案1】:

查看ShellAPI的.net实现中ShellExecute的声明,就很清楚要做什么了。停止投射到 PChar 并像这样编写代码:

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

直到现在我才意识到这一点,但您从 Delphi.net 进行的 Windows API 调用似乎使用与其他 .net 语言相同的 DllImport 属性。我想这是有道理的,这些只是普通的 p/invoke 调用,就像在 C# 互操作代码中一样。

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

顺便说一句,Embarcadero 开发人员在他们的DllImport 声明中犯了一个错误。他们设置了SetLastError = True,而ShellExecute 不正确,ShellExecute 没有设置线程最后一个错误值。

【讨论】:

  • 现在我得到这个错误 -> [Pascal Error] Engine.pas(41): E2089 Invalid typecast [Pascal Fatal Error] Project1.dpr(18): F2063 无法编译使用的单元'Engine。过去的
  • 当我使用这个 ShellExecute(0, 'open', Path, nil, nil, SW_SHOW);我得到这个 [Pascal Error] Engine.pas(41): E2250 没有可以使用这些参数调用的“ShellExecute”的重载版本
  • 这工作正常 -> ShellExecute(0, 'open', Path, '', '', SW_SHOW);
  • 感谢您的帮助和您的大量时间
  • @Arioch'我认为最好的解决方案是使用ShellExecuteEx,它确实使用了标准的最后一个错误机制:blogs.msdn.com/b/oldnewthing/archive/2012/10/18/10360604.aspx
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多