主要问题在于你使用了 nginx.conf
作为文件名。你需要完整的文件名(包括驱动器和目录)。如果文件与你的EXE文件位于同一目录中,你应该这样做:
ShellExecute(Handle, nil,
PChar(ExtractFilePath(Application.ExeName) + 'nginx.conf'),
nil, nil, SW_SHOWNORMAL)
无需设置目录,通常应使用SW_SHOWNORMAL
。
此外,仅当运行应用程序的系统正确设置了.conf
文件的文件关联时,此方法才有效。如果运行应用程序的系统使用MS Paint打开.conf
文件,则上述代码将启动MS Paint。如果没有任何关联,则该行代码将无法工作。
您可以手动指定使用notepad.exe
:
ShellExecute(Handle, nil, PChar('notepad.exe'),
PChar(ExtractFilePath(Application.ExeName) + 'nginx.conf'),
nil, SW_SHOWNORMAL)
现在我们开始运行
notepad.exe
并将文件名作为第一个参数传递。
第三,你现在不应该像你这样使用
try..except
。
ShellExecute
可能因为其他原因而失败,而且无论如何,它都不会引发异常。相反,考虑
if FileExists(...) then
ShellExecute(...)
else
MessageBox(Handle, 'Invalid path to configuration file', 'Error', MB_ICONERROR)
现在,回到主要问题。我的第一个代码片段只有在运行您的应用程序的系统恰好具有适当的文件关联后缀.conf
文件时才起作用,而第二个将始终打开记事本。更好的选择可能是使用用于打开.txt
文件的应用程序。David的答案给出了一个例子。
.txt
,而不是txtfile
,因为并不保证在所有系统上txtfile
都是文本文件的注册progid。一些应用程序确实会更改它。 - Remy LebeauShellExecuteEx()
之前,我从未需要使用类名。我只是评论了文档中所说的内容(即类名可以是文件扩展名或progid),以及我对文件扩展名progid如何工作的一般了解。 - Remy Lebeau