Announcement

Collapse
No announcement yet.

Anfängerproblem? CoInitialize wurde nicht aufgerufen...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anfängerproblem? CoInitialize wurde nicht aufgerufen...

    Hallo,
    ich mache gerade meine ersten Versuche mit COM, ich möchte (oder muß) alle Excel-Tabellen in einem Verzeichnis ausdrucken. Dazu habe ich zunächst folgenden Code geschrieben:

    <small>
    procedure TxlsDlg.PrnBtnClick(Sender: TObject);
    var
    FN : String;
    i : Integer;
    FWorkSheet : _Workbook;
    begin
    FExcel := CoExcelApplication.Create; { Deklaration: FExcel: _Application }
    for i := 0 to FileListBox.Items.Count-1 do begin
    FN := AddBackslash(FileListBox.Directory) + FileListBox.Items[i];
    FExcel.Workbooks.Open(FN,
    EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam,
    0);
    end;
    FExcel.Visible[0] := true;
    FWorkSheet := FExcel.Workbooks.Item[1];
    FWorkSheet.PrintOut(EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, 0);
    end;
    </small> <p>
    Das ergibt die Fehlermeldung "CoInitialize wurde nicht aufgerufen". Woran liegt das?

    Ist das Verfahren, das ich benutze überhaupt geeignet oder sollte man das anders lösen.

    Vielen Dank für jeden Tip

  • #2
    Hallo,

    insbesondere bei Fragen zum Thema COM ist es wichtig, das bei einer Frage immer die verwendete Delphi-Version angegeben wird. Gerade beim Thema "Initialisieren von COM beim Programmstart" unterscheiden sich die verschiedenen Delphi-Versionen grundlegend.

    Wenn Delphi 5 verwendet wird, muss in der Projektdatei (.DPR) der <b>Initialize</b>-Aufruf an erster Stelle stehen:
    <pre>
    program Word2000Test;

    uses
    Forms,
    Word2000TestFrm in 'Word2000TestFrm.pas' {Form1};

    {$R *.RES}

    begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
    end.
    </pre>

    Mit dem Aufruf von <b>CoInitialize</b> meldet der Thread die Art seines gewünschten <b>Apartments</b> an. Da jede Anwendung mindestens aus dem primären Thread besteht, muss also mindestens einmal diese Funktion aufgerufen werden, bevor auf ein Interface zugegriffen wird. Spaltet die Anwendung einen eigenen Thread ab und will von dort aus auf COM zugreifen, muss auch dort das Apartment neu definiert werden

    Comment

    Working...
    X