2012-03-16 6 views
2

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

; 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. ИспользованиеCOM - это пространство имен, а CUsingCom - это имя класса

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

+0

Где у вас есть освобождение? при создании COM-объекта или вызове Obj.GetCustomerName? COM уже зарегистрирован (вам нужно сначала зарегистрировать UseCOM.dll, прежде чем сможете его использовать)? – kobik

+0

Можете ли вы ссылаться на TLB вместо DLL? – code4life

ответ

3

Вы должны первого регистра СОМ длл перед тем вы можете создать и использовать его. Возможно, вы захотите извлечь DLL в пункт назначения, а затем позвонить по телефону RegisterServer, прежде чем позвонить по телефону CreateAboutButtonAndURLLabel.

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

+0

Как я уже упоминал, я зарегистрировал Dll ... Но я попробую добавить параметр regserver attr –

+0

Извините, я неверно разобрал ваш вопрос. Я все еще не понимаю ваш процесс установки. что произойдет на машине, у которой доза не была зарегистрирована dll (с regsvr32)? процесс копирования файлов, выполняемый после создания окна мастера ... в любом случае, попробуйте загрузить COM-dll из другого приложения, кроме inno, чтобы убедиться, что он правильно зарегистрирован. – kobik

 Смежные вопросы

  • Нет связанных вопросов^_^