2012-03-16 84 views
2

我试图访问使用C#创建并注册的COM对象,但没有任何成功。访问InnoSetup中的C#COM对象时出现异常

; Script generated by the Inno Setup Script Wizard. 
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 

[Setup] 
AppName=CoolCOM 
AppVerName=CoolCOM 1.0 
CreateAppDir=no 
DisableProgramGroupPage=yes 
DefaultGroupName=CoolCOM 
UninstallDisplayIcon={app}\CoolCOM.exe 
OutputDir=userdocs:Inno Setup Examples Output 

[Files] 
Source : "UsingCOM.dll";DestDir: "{app}" 

[Code] 

const 
    CLSID_ShellLink = '{51E1EF73-0A8F-440a-B68F-614A83B515DB}'; 


procedure AboutButtonOnClick(Sender: TObject); 
var Form : TSetupForm; 
    OKButton,CancelButton : TNewButton; 
    FormCaption : TLabel; 
    Obj: Variant; 
begin 

{ Create the main ShellLink COM Automation object } 
    Obj := CreateOleObject('UsingCOM.CUsingCom'); 

try 
    Form := CreateCustomForm(); 
    Form.Clientwidth := 400; 
    Form.ClientHeight := 300; 
    Form.Caption := 'VATSAG Inc.'; 
    Form.Color := clGray; 
    Form.CenterInsideControl(WizardForm, False); 

    OKButton := TNewButton.Create(Form); 
    OKButton.Caption := '&OK'; 
    OKButton.Parent := Form; 
    OKButton.Top := Form.ClientHeight - ScaleY(25); 
    OKButton.Left := Form.ClientWidth - ScaleX(200); 
    OKButton.ModalResult := mrOk; 

    CancelButton := TNewButton.Create(Form); 
    CancelButton.Caption := '&Cancel'; 
    CancelButton.Parent := Form; 
    CancelButton.ModalResult := mrCancel; 
    CancelButton.Top := OKButton.Top; 
    CancelButton.Left := Form.ClientWidth - ScaleX(100); 

    FormCaption := TLabel.Create(Form); 
    FormCaption.Caption := Obj.GetCustomerName(); 
    FormCaption.Left := ScaleY(20); 
    FormCaption.Top := ScaleY(10); 
    FormCaption.Width := 200; 
    FormCaption.Height := 20; 
    FormCaption.Parent := Form; 
    FormCaption.WordWrap := True; 
    FormCaption.Font.Size := 12; 
    FormCaption.Font.Color := clWhite; 
    FormCaption.Font.Style := [fsBold]; 

    Form.ActiveControl := OKButton; 

    if Form.ShowModal = mrOk then begin 
    MsgBox('So you agree with me :)', mbInformation, mrOk); 
    end 
    else begin 
    MsgBox('Do you have a problem with me 8)', mbInformation, mrOk); 
    end; 

finally 
    Form.Free(); 
end; 

end; // EO AboutButtonOnClick 

procedure CreateAboutButtonAndURLLabel(ParentForm: TSetupForm; CancelButton: TNewButton); 
var 
    AboutButton: TNewButton; 
    URLLabel: TNewStaticText; 
begin 
    AboutButton := TNewButton.Create(ParentForm); 
    AboutButton.Left := ParentForm.ClientWidth - CancelButton.Left - CancelButton.Width; 
    AboutButton.Top := CancelButton.Top; 
    AboutButton.Width := CancelButton.Width; 
    AboutButton.Height := CancelButton.Height; 
    AboutButton.Caption := '&About...'; 
    AboutButton.OnClick := @AboutButtonOnClick; 
    AboutButton.Parent := ParentForm; 

end; 

procedure InitializeWizard(); 
var 
    Left, LeftInc, Top, TopInc: Integer; 
begin 
    Left := WizardForm.WelcomeLabel2.Left; 
    LeftInc := (WizardForm.CancelButton.Width*3)/2 + ScaleX(8); 
    TopInc := WizardForm.CancelButton.Height + ScaleY(8); 
    Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc; 

    CreateAboutButtonAndURLLabel(WizardForm, WizardForm.CancelButton); 

end; 

其中obj.GetCustomerName()是公开的COM方法。 UsingCOM是命名空间和CUsingCom是类的名称

任何人都可以指出我在哪里摇摇欲坠?

+0

你有什么豁免?同时创建COM对象或调用Obj.GetCustomerName? COM是否已经注册(您需要先注册UsingCOM.dll才能使用它)? – kobik 2012-03-16 17:16:37

+0

你能引用TLB而不是DLL吗? – code4life 2012-03-16 19:24:01

回答

3

您需要第一注册COM DLL 之前,您可以创建并使用它。 您可能需要将dll提取到目标,然后在致电CreateAboutButtonAndURLLabel之前致电RegisterServer

当使用[Files]部分时,您需要添加regserver属性来注册COM服务器,但是这会在您的安装过程中太晚地复制和注册dll。

+0

正如我所提到的,我已经注册了DLL ...但我会尝试添加regserver attr选项 – 2012-03-16 18:33:52

+0

对不起,我误解了你的问题。我仍然无法理解您的设置过程。什么会发生在一台没有注册DLL的机器上(使用regsvr32)?在创建向导窗口之后完成文件复制过程...无论如何,尝试从inno以外的其他应用程序加载COM dll以验证其是否正确注册。 – kobik 2012-03-16 22:18:25