使用 activeX 控件 "AcroPDF.dll" 我的应用程序工作正常,但如果未安装 adobe acrobat,则在启动时崩溃
Using the activeX Control "AcroPDF.dll" my application works fine, but crashes on startup if adobe acrobat is not installed
我有一个向PDF文件添加文本的应用程序,我有一个axAcroPDF1预览面板,它借用了acrobat来显示PDF文件的状态,但是对于程序的功能来说并不是必需的,所以我想让程序仍然启动,即使没有安装 acrobat,尽管功能更有限 ,然后用户将不会有预览面板,这很好。我该怎么做?
我唯一想尝试的是在程序启动时初始化 this.axAcroPDF1 时添加 catch/exception,这允许我弹出一个消息弹出窗口,提示需要 Adobe reader,但此后程序仍然崩溃,所以无论如何我都想让程序启动,只是在没有安装 adobe 时不要调用它,或者你们有任何其他建议,这样这个应用程序在有或没有 adobe 的情况下仍然可以正常运行.
我知道如何检查是否安装了 adobe,但我不知道如何将结果应用到我的程序中。
初始化时的 catch 异常给出了以下错误(我是菜鸟所以这里可能没有提供好的信息):
System.Runtime.InteropServices.COMException (0x80040154): Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
at System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
at System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
at System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
at System.Windows.Forms.AxHost.CreateInstance()
at System.Windows.Forms.AxHost.GetOcxCreate()
at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
at System.Windows.Forms.AxHost.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
解决方案:我决定使用 Inno Installer,因为我有一些 DLL 文件,在安装程序脚本中,我进行了 adobe 检查,如果他们没有 adobe 或正确的版本,我会提示用户下载 reader。这是检查 adobe 的基本代码:
[Code]
procedure ExitProcess(exitCode:integer);
external 'ExitProcess@kernel32.dll stdcall';
function GetAcrobatReaderVersion(): String;
var
sVersion: String;
begin
sVersion := '';
RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe',
'', sVersion );
GetVersionNumbersString( sVersion , sVersion );
Result := sVersion;
end;
function GetAcrobatVersion(): String;
var
sVersion2: String;
begin
sVersion2 := '';
RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe',
'', sVersion2 );
GetVersionNumbersString( sVersion2 , sVersion2 );
Result := sVersion2;
end;
function NextButtonClick(CurPage: Integer): Boolean;
begin
// by default go to next page
Result := true;
if CurPage = wpWelcome then
begin
if Length( GetAcrobatReaderVersion + GetAcrobatVersion() ) = 0 then
begin
MsgBox( 'adobe not detected', mbInformation, MB_OK );
Result := false;
ExitProcess(0);//adobe isn't installed, so exit installer
end
else
//MsgBox( 'Acrobat reader installed is version ' + GetAcrobatReaderVersion() ,
MsgBox( 'adobe detected', mbInformation, MB_OK );
end;
end;
我有一个向PDF文件添加文本的应用程序,我有一个axAcroPDF1预览面板,它借用了acrobat来显示PDF文件的状态,但是对于程序的功能来说并不是必需的,所以我想让程序仍然启动,即使没有安装 acrobat,尽管功能更有限 ,然后用户将不会有预览面板,这很好。我该怎么做?
我唯一想尝试的是在程序启动时初始化 this.axAcroPDF1 时添加 catch/exception,这允许我弹出一个消息弹出窗口,提示需要 Adobe reader,但此后程序仍然崩溃,所以无论如何我都想让程序启动,只是在没有安装 adobe 时不要调用它,或者你们有任何其他建议,这样这个应用程序在有或没有 adobe 的情况下仍然可以正常运行.
我知道如何检查是否安装了 adobe,但我不知道如何将结果应用到我的程序中。
初始化时的 catch 异常给出了以下错误(我是菜鸟所以这里可能没有提供好的信息):
System.Runtime.InteropServices.COMException (0x80040154): Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
at System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
at System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
at System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
at System.Windows.Forms.AxHost.CreateInstance()
at System.Windows.Forms.AxHost.GetOcxCreate()
at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
at System.Windows.Forms.AxHost.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
解决方案:我决定使用 Inno Installer,因为我有一些 DLL 文件,在安装程序脚本中,我进行了 adobe 检查,如果他们没有 adobe 或正确的版本,我会提示用户下载 reader。这是检查 adobe 的基本代码:
[Code]
procedure ExitProcess(exitCode:integer);
external 'ExitProcess@kernel32.dll stdcall';
function GetAcrobatReaderVersion(): String;
var
sVersion: String;
begin
sVersion := '';
RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe',
'', sVersion );
GetVersionNumbersString( sVersion , sVersion );
Result := sVersion;
end;
function GetAcrobatVersion(): String;
var
sVersion2: String;
begin
sVersion2 := '';
RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe',
'', sVersion2 );
GetVersionNumbersString( sVersion2 , sVersion2 );
Result := sVersion2;
end;
function NextButtonClick(CurPage: Integer): Boolean;
begin
// by default go to next page
Result := true;
if CurPage = wpWelcome then
begin
if Length( GetAcrobatReaderVersion + GetAcrobatVersion() ) = 0 then
begin
MsgBox( 'adobe not detected', mbInformation, MB_OK );
Result := false;
ExitProcess(0);//adobe isn't installed, so exit installer
end
else
//MsgBox( 'Acrobat reader installed is version ' + GetAcrobatReaderVersion() ,
MsgBox( 'adobe detected', mbInformation, MB_OK );
end;
end;