this-Me
this-Me

Reputation: 2145

Exception while accessing a C# COM object in InnoSetup

I'm trying to access a COM object created and registered using C# but without any success.

; 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;

where the obj.GetCustomerName() is the exposed COM method. UsingCOM is the namespace and CUsingCom is the name of the class

Can anyone point out where am i faltering ??

Upvotes: 2

Views: 604

Answers (1)

kobik
kobik

Reputation: 21252

You need to first register the COM dll before you can create and use it. You might want to extract the dll to it's destination and then call RegisterServer before you call CreateAboutButtonAndURLLabel.

When using the [Files] section you need to add regserver attribute to register the COM server, but this will copy and register the dll too late in your setup process.

Upvotes: 3

Related Questions