我的Excel插件需要安装Excel的Visual Basic for Applications选项才能使其正常工作。我希望我的安装(使用InnoSetup编写)能够检测是否安装了VBA,如果不安装则警告用户。
如何检测选项是否已安装?
答案 0 :(得分:2)
一种可能性是检查C:\ Program Files \ Common Files \ Microsoft Shared \ VBA \ VBA6中是否存在VBE6.DLL。或者在注册表中查找对该DLL或字符串VBA的引用。
请注意,Office 2010的位置/文件名可能不同,因为VBA编辑器中存在一些更改。
答案 1 :(得分:0)
你为什么不尝试这样的功能...... found here
Option Explicit
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Sub cmdCheck_Click()
MsgBox "Exist ??? =" & CheckForComponent("user32.dll")
End Sub
Private Function CheckForComponent(ComPath As String) As Boolean
Dim Ret As Long
Ret = LoadLibrary(ComPath)
FreeLibrary Ret
If Ret = 0 Then
CheckForComponent = False
Else
CheckForComponent = True
End If
End Function
答案 2 :(得分:0)
public static class VbePrerequisiteDetector {
private const string VbeInstallationPathKey = @"SOFTWARE\Microsoft\VBA";
private const string Vbe6InstallationPathValue = "Vbe6DllPath";
private const string Vbe7InstallationPathValue = "Vbe7DllPath";
/// <summary>
/// Return true if VBE6 installed. VBE6 is prerequisite for for Office2003 and Office2007
/// </summary>
/// <returns>Return true if VBE6 installed.</returns>
public static bool IsVbe6Installed() {
try {
RegistryKey vbaPathKey = Registry.LocalMachine.OpenSubKey(VbeInstallationPathKey);
if (vbaPathKey != null) {
if (vbaPathKey.GetValue(Vbe6InstallationPathValue) != null) {
string pathToVbe = (string)vbaPathKey.GetValue(Vbe6InstallationPathValue);
if (File.Exists(pathToVbe)) {
return true;
}
}
}
}
catch (Exception) {
//Ignore all exceptions
}
return false;
}
/// <summary>
/// Return true if VBE7 installed. VBE7 is prerequisite for for Office2010
/// </summary>
/// <returns>Return true if VBE7 installed.</returns>
public static bool IsVbe7Installed() {
try {
RegistryKey vbaPathKey = Registry.LocalMachine.OpenSubKey(VbeInstallationPathKey);
if (vbaPathKey != null) {
if (vbaPathKey.GetValue(Vbe7InstallationPathValue) != null) {
string pathToVbe = (string)vbaPathKey.GetValue(Vbe7InstallationPathValue);
if (File.Exists(pathToVbe)) {
return true;
}
}
}
}
catch (Exception) {
//Ignore all exceptions
}
return false;
}
}
答案 3 :(得分:0)
我们正在谈论Windows Installer组件。 安装程序有一个API,您可以在其中请求是否安装了功能/组件。 认为api也会返回安装组件的位置。 如果是nessacary,你可以安装缺少的组件。
你唯一需要的是组件和产品guid。
答案 4 :(得分:0)
检测是否安装了VBA的最佳方法是使用MsiQueryFeatureState API并询问Windows Installer是否安装了该功能。下面是一些在VB.NET中执行此操作的示例代码,但是您可以使用任何允许您调用COM组件的语言对此进行编码(抱歉,不熟悉InnoSetup)。
Private Declare Function MsiQueryFeatureState Lib "Msi" Alias "MsiQueryFeatureStateA" (ByVal Product As String, ByVal Feature As String) As Long
Public Function FVbaAvailable() As Boolean
Dim objExcelApp As Object
Dim strProductCode As String
Dim nState As Long
Dim fAvailable As Boolean = False
Try
' Start an Excel instance and get the product code.
objExcelApp = CreateObject("Excel.Application")
strProductCode = DirectCast(objExcelApp.ProductCode, String)
' Get FeatureState for the VBAFiles Feature.
nState = MsiQueryFeatureState(strProductCode, "VBAFiles")
If (nState = 1) OrElse (nState = 3) OrElse (nState = 4) Then
' VBA is available.
fAvailable = True
End If
' Clean up.
objExcelApp.Quit()
Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcelApp)
objExcelApp = Nothing
Catch ex As Exception
Trace.WriteLine(ex.Message)
End Try
Return fAvailable
End Function