看看这个,不知道有没有用
如何确定 Office 应用程序的路径
察看本文应用于的产品
文章编号 : 240794
最后修改 : 2006年9月12日
修订 : 6.2
概要
本文通过示例代码说明了在给定 Microsoft Office 应用程序的 ProgID 的情况下,如何以编程方式确定该应用程序的安装路径。
回到顶端
更多信息
自动化服务器具有一个唯一的 ProgID,通常用于自动运行该服务器。下面的列表提供了 Office 应用程序的 ProgID:
应用程序 ProgID
Microsoft Access Access.Application
Microsoft Excel Excel.Application
Microsoft Outlook Outlook.Application
Microsoft PowerPoint Powerpoint.Application
Microsoft Word Word.Application
Microsoft FrontPage FrontPage.Application
请注意,上表提供的 ProgID 与版本无关。应用程序还具有与版本有关的 ProgID,可以将其与本文中提供的示例代码一起使用。例如,Microsoft Excel 具有与版本无关的 ProgID“Excel.Application”以及与版本有关的 ProgID(例如,“Excel.Application.8”和“Excel.Application.9”)。
在给定进程外服务器的 ProgID 的情况下,可以通过检查注册表来获取其位置。进程外服务器在注册表以下位置拥有项:
HKEY_LOCAL_MACHINE\Software\Classes\PROGID\CLSID
它提供了服务器的唯一 CLSID(或类 ID)。该 CLSID 又在以下位置拥有注册表项:
HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\LocalServer32
其中指定了服务器的路径。例如,如果要使用 ProgID“Excel.Application”来确定 Microsoft Excel 的路径,应检查以下注册表项:
HKEY_LOCAL_MACHINE\Software\Classes\Excel.Application\CLSID
同时,您将发现 Excel.Application 的 CLSID 为“{00020841-0000-0000-C000-000000000046}”(具体取决于所安装的 Excel 的版本)。接下来,应使用此 CLSID 来检查以下注册表项,以查找 EXCEL.EXE 的路径:
HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{00020841-0000-0000-C000-000000000046}\LocalServer32
所有这些操作都可以通过 advapi32.dll 中的注册表 API 函数以编程方式来完成。
示例代码
1. 启动一个新的用 Visual Basic 编写的“标准 EXE”项目。默认情况下会创建“Form1”。
2. 向“Form1”中添加一个文本框和一个命令按钮。
3. 将以下代码添加到 Form1 的模块中:Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
"RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) _
As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, _
ByVal lpData As String, lpcbData As Long) As Long
'Note that if you declare the lpData parameter as String,
'you must pass it ByVal.
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Const REG_SZ As Long = 1
Const KEY_ALL_ACCESS = &H3F
Const HKEY_LOCAL_MACHINE = &H80000002
Private Sub Command1_Click()
Dim hKey As Long
Dim RetVal As Long
Dim sProgId As String
Dim sCLSID As String
Dim sPath As String
sProgId = Text1.Text
'First, get the clsid from the progid
'from the registry key:
'HKEY_LOCAL_MACHINE\Software\Classes\<PROGID>\CLSID
RetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Classes\" & _
sProgId & "\CLSID", 0&, KEY_ALL_ACCESS, hKey)
If RetVal = 0 Then
Dim n As Long
RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, "", n)
sCLSID = Space(n)
RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, sCLSID, n)
sCLSID = Left(sCLSID, n - 1)
'drop null-terminator
RegCloseKey hKey
End If
'Now that we have the CLSID, locate the server path at
'HKEY_LOCAL_MACHINE\Software\Classes\CLSID\
'
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\LocalServer32
RetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
"Software\Classes\CLSID\" & sCLSID & "\LocalServer32", 0&, _
KEY_ALL_ACCESS, hKey)
If RetVal = 0 Then
RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, "", n)
sPath = Space(n)
RetVal = RegQueryValueEx(hKey, "", 0&, REG_SZ, sPath, n)
sPath = Left(sPath, n - 1)
MsgBox sPath
RegCloseKey hKey
End If
End Sub
4. 按 F5 键运行该程序。
5. 在“文本框”中,键入 Excel.Application,然后单击“命令按钮”。Excel.exe 的路径将出现在一个消息框中。