怎样获取任一应用程序的绝对路径??(100分)

  • 主题发起人 主题发起人 driby
  • 开始时间 开始时间
D

driby

Unregistered / Unconfirmed
GUEST, unregistred user!
&nbsp; 怎样获取任一应用程序的绝对路径??例:<br>&nbsp; &nbsp;已知:Uedit32.exe应用程序存在,要得到<br>&nbsp; &nbsp;它的绝对路径("C:/Program Files/ULTRAEDT/UEDIT32.EXE")。
 
如果此程序已经与某个后缀相关连,那么可以使用如下函数:<br>HINSTANCE FindExecutable(<br>&nbsp; &nbsp; LPCTSTR lpFile,<br>&nbsp; &nbsp; LPCTSTR lpDirectory,<br>&nbsp; &nbsp; LPTSTR lpResult<br>);<br><br>lpFile :文件名,可以是文档或执行文件。<br>lpDirectory :缺省子目录<br>lpResult :返回可执行文件绝对路径<br><br>如果没有关联,只好FindFirst/FindNext
 
用GetModuleFileName函数获取包含指定模块的可执行文件的完整路径和文件名。<br>Windows 95:<br>&nbsp;当应用程序版本号高于4.0并且长文件名有效时,<br>GetModuleFilename函数返回长文件名. 否则返回8.3格式的文件名。<br>DWORD GetModuleFileName(<br>&nbsp; &nbsp; HMODULE hModule, // 模块句柄<br>&nbsp; &nbsp; LPTSTR lpFilename, // 缓冲区指针 <br>&nbsp; &nbsp; DWORD nSize &nbsp; &nbsp; &nbsp; &nbsp; // 缓冲区大小 &nbsp; &nbsp;); <br>参数hModule 指定需要获取可执行文件名的模块. <br>&nbsp; &nbsp;如果为Null, GetModuleFileName返回创建调用本函数的进程的文件名.<br>lpFilename 指定存放返回文件名的缓冲区。<br>nSize指定缓冲区大小在Delphi中使用如下:<br>刚试过,包怎行!(是李颖说的)
 
GetModuleFilename是取正在运行的某个模块的文件名。<br>但是问题要求不是这样。<br>
 
&nbsp;我用FindExecutable时发现lpDirectory必须指定为某一具体EXE文件的路径才行。不知是否我用正确了,麻烦指教。
 
不需要呀,我试着是可以的。<br>var<br>&nbsp; Path: PChar;<br>begin<br>&nbsp; Path := AllocMem(260);<br>&nbsp; FindExecutable('UEdit32.exe', '', Path);<br>&nbsp; ......<br>&nbsp; FreeMem(Path);<br>end;<br>
 
  Blade,我照着你所说的做,怎么发现只能找到"Uedit32.exe"的路径,换另外的EXE文件名就又不行了。我自己都觉得奇怪,你可否试试??(我还特意注意区分了文件名的大小写,其实我试的其他EXE文件都是放在/Program Files/目录下的)
 
Blade,我也照着你所说的做了,结果跟driby说的一样,请问你还有别的<br>方法吗?望指教。
 
不好意思,上来就用UEdit32.exe试了一把,以为OK了呢,换了一个还真不行。<br>保证正确的话,也许就只能用FindFirst、FindNext剔一遍了。
 
当我们、双击一个未知类型的文件扩展名时,windows会打开一个dialog<br>让我们选取打开该类型文件的程序,凡是在那个对话框里列出来的程序都<br>可以通过FindExecutable找到原始路径。<br><br>至于那个对话框的列表是如何形成的,我还没搞明白,在注册表里也没有。
 
使用API &nbsp;SearchPath
 
to Pipi.<br>&nbsp; SearchPath的第一个参数:lpPath Points to a null-terminated string that specifies the path to be searched for the file. If this parameter is NULL, the function searches for a matching file in the following directories in the following sequence: <br>&nbsp; 1.The directory from which the application loaded. <br>&nbsp; 2.The current directory. <br>&nbsp; 3.Windows 95: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory.<br>&nbsp; Windows NT: The 32-bit Windows system directory. Use the &nbsp; GetSystemDirectory function to get the path of this directory. The name of this directory is SYSTEM32.<br>&nbsp; 4.Windows NT: The 16-bit Windows system directory. There is no Win32 function that obtains the path of this directory, but it is searched. The name of this directory is SYSTEM.<br>&nbsp; 5.The Windows directory. Use the GetWindowsDirectory function to get the path of this directory. <br>&nbsp; 6.The directories that are listed in the PATH environment variable. <br><br>所以,若是要找的应用程序不在上述任一路径中, SearchPath也是无能为力
 
ExpandFileName returns the full path of Filename.<br><br>Unit<br><br>SysUtils<br><br>Category<br><br>file name utilities<br><br>function ExpandFileName(const FileName: string): string;<br><br>Description<br><br>The ExpandFileName function converts the relative file name into a fully qualified path name by merging in the current drive and directory. A fully qualified path name includes the drive letter and any directory and subdirectories in addition to the file name and extension. ExpandFileName does not verify that the resulting fully qualified path name refers to an existing file, or even that the resulting path exists.
 
对不起,浪费大家的带宽,ExpandFilePath是错误的.
 
基本上只能是通过findfirst/findnext来查找了.<br>可以用递归的方法, 一个一个目录找过去, 深度优先.<br><br>另外, 我想了一个笨办法, 应该也可行的:<br><br>用ShellExecute函数运行 "dir /s/a/b program.exe &gt; c:/result.dir"<br>然后分析一下result.dir文件就可以了.<br>这个方法应该是受Windows版本影响的(如果Windows改变了dir的输出格式的话)<br>
 
我有一个TFileFinder的控件,<br>支持包含子目录,模糊查找,等,<br>kxy@csdn.net 来信我发过去.
 
FindExecutable函数只是根据注册表中/HKEY_LOCAL_MACHINE/Software<br>/Microsoft/Windows/CurrrentVersion/App Paths下的键值来查找。<br>
 
这么简单的问题不用如此复杂.<br>如提问者还需要此答案, 发 EMAIL 给我.<br>GUO_LIU@HOTAMIL.COM / GUO_QPETER@263.NET<br>
 
后退
顶部