CoInitialize를 호출 하셨나요 ?
uses
ActiveX;
initialization
CoInitialize(nil);
finalization
CoUnInitialize;
end.
박태성 님이 쓰신 글 :
: unit uExcelOut;
:
: interface
:
: uses
: SysUtils, Classes;
:
: Type
: TExcelProc = class(TObject)
: protected
: public
: constructor Create;
: destructor Destroy; override;
: end;
:
: var
: ExcelApp : OleVariant;
:
: implementation
:
: uses
: ComObj, Dialogs, Variants;
:
: { TExcelProc }
:
: constructor TExcelProc.Create;
: begin
: inherited Create;
: try
: ExcelApp := GetActiveOleObject('Excel.Application');
: except
: try
: // If no instance of Word is running, try to Create a new Excel Object
: ExcelApp := CreateOleObject('Excel.Application');
: except
: ShowMessage('Cannot start Excel/Excel not installed ?');
: Exit;
: end;
: end;
: end;
:
: destructor TExcelProc.Destroy;
: begin
: if not VarIsEmpty(ExcelApp) then
: begin
: ExcelApp.DisplayAlerts := False; // Discard unsaved files...
: ExcelApp.Quit;
: ExcelApp := Unassigned;
: end;
: inherited Destroy;
: end;
:
: initialization
:
: finalization
:
: end.
:
: 엑셀객체를 다루는 루틴을 폼에서 분리할려고 위와 같이 유닛을 생성했습니다.
: 처음에는 클래스의 생성자에 있던 구문은 유닛의 initialization 색션에 Destroy절에 있는 구문은 finalization 섹션에
: 넣어서 유닛만 폼의 uses절에 넣어서 실행을 하니 다운이 되어 버려서 위처럼 클래스를 하나 만들고 그 속에
: 집어 넣어니까 에러없이 작동을 합니다.
:
: 짧은 생각에는 initialization 에 변수를 할당하는 작업을 해도 될것 같은데 왜 에러가 나는지를
: 모르겠네요. initialization 섹션에 코드를 넣은것과 create절에 코드를 넣는게 어떤 차이가 나는건지요?