Исключение при доступе к объекту C # COM в InnoSetup - PullRequest
2 голосов
/ 16 марта 2012

Я пытаюсь получить доступ к COM-объекту, созданному и зарегистрированному с помощью C #, но безуспешно.

; 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 - это имя класса

Кто-нибудь может указать, где я колеблюсь ??

1 Ответ

3 голосов
/ 16 марта 2012

Вам необходимо сначала зарегистрировать COM DLL до того, как вы сможете создать и использовать его. Возможно, вы захотите извлечь dll по назначению, а затем позвоните RegisterServer, прежде чем позвонить CreateAboutButtonAndURLLabel.

При использовании раздела [Files] вам необходимо добавить атрибут regserver для регистрации COM-сервера, но это скопирует и зарегистрирует dll слишком поздно в процессе установки.

...