2013-04-23 58 views
1

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

错误

[帕斯卡错误] 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

我无法复制。我也怀疑错误消息。没有德尔福的编译器我记得曾经说过'[Pascal Error]'。你真的在使用Delphi吗?哪个版本? – 2013-04-23 08:23:06

+0

我与Borland Developer Studio 2006合作 – 2013-04-23 08:27:06

+0

好的,我已经在问题中加了标签。仍然无法重现。在RTL单元之前的搜索路径中是否有一个名为'ShellAPI'的单元? – 2013-04-23 08:28:31

回答

0

综观ShellExecute在.NET实现的ShellAPI的声明,显然做什么。停止铸造PChar和写你这样的代码:

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

我没有意识到这一点,直到如今,但它似乎Windows API调用你Delphi.net使用相同DllImport属性其他.net语言。我想这是有道理的,这些只是普通的p/invoke调用,就像在C#interop代码中会发现的那样。

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

另外,Embarcadero的开发人员在他们的DllImport声明中犯了一个错误。他们设置SetLastError = True这对于ShellExecute不正确,它不会设置线程的最后一个错误值。

+0

现在我收到此错误 - > [Pascal Error] Engine.pas (41):E2089无效的类型转换 [Pascal致命错误] Project1.dpr(18):F2063无法编译使用的单元'Engine.pas' – 2013-04-23 09:45:53

+0

当我使用此ShellExecute(0,'open',Path,nil,nil, SW_SHOW);我得到这个[Pascal Error] Engine.pas(41):E2250没有可以用这些参数调用的'ShellExecute'的重载版本 – 2013-04-23 09:48:22

+1

这是工作正确 - > ShellExecute(0,'open',Path,'' ,'',SW_SHOW); – 2013-04-23 09:49:16