Borland Delphi 7 TExcelApplication.Connect работает на офисных машинах, но не на клиенте - PullRequest
0 голосов
/ 17 января 2012

Я отвечаю за поддержание некоторого устаревшего кода в моем офисе (Pascal) из-за его ограничений, я написал Delphi DLL для доступа к Excel с помощью TExcelApplication.

DLL отлично работает в офисе, машины работают под управлением Microsoft Office 2010, Windows 7 32-разрядная и 64-разрядная.Клиент использует рабочие станции Novel, Windows XP, Microsoft 2007.

dll выдает исключение точки останова при обнаружении TExcelApplication.Connect;команда.

Кроме различий, которые я упомянул, сценарий точно такой же.

Существуют ли какие-либо ограничения в отношении доступа к Microsoft Excel на рабочей станции Novel, или же есть лучший вариант?способ доступа к документам Excel?

Примечание: я просто хочу прочитать из документа Excel, он охватывает несколько строк, столбцов и электронных таблиц, исходные документы Excel являются * .xls 2007 документов.

Его основная функция заключалась в том, чтобы включить автоматическое согласование с документом Excel.

Вот фрагмент кода библиотеки

library MyLibrary;
uses
  SysUtils, Classes, Variants, Dialogs, StdCtrls, OleServer, ExcelXP, Windows;
Type
  PString=String[254];

Var
  ExcelObj : TExcelApplication;

Procedure XLSOPEN(THENAME:PSTRING;VAR Reslt:PSTRING); stdcall;
Begin
  If FileExists(THENAME) Then
  Begin
    ExcelObj := TExcelApplication.Create(nil);
    ExcelObj.ConnectKind := ckRunningOrNew;
    ExcelObj.Connect;

    If ExcelObj=nil Then
    Begin
      Result := 'Error : EXCEL couldnt be started!';
      Exit;
    End Else
    Begin
      Result := 'Successful';
      Exit;
    End;
  End Else
  Begin
    Result := 'Error : File '+THENAME+' does not exist!';
    Exit;
  End;
End;

Exports XLSOPEN Name 'XLSOpen';

Begin
End.

1 Ответ

1 голос
/ 18 января 2012

Вам необходимо добавить ActiveX в свой список использования и использовать CoInitialize(nil); для инициализации компонентов ActiveX. Причина этого в том, что Application-> Initialize инициализирует компоненты, теперь, когда это dll, вы должны вручную инициализировать компонент при его загрузке и использовать UnCoInitizlise; при выгрузке dll.

USES ActiveX, Windows;

INITIALIZATION
  CoInitialize(nil);
FINALIZATION
  UnCoInitialize;
...