2012-01-17 1 views
-1

필자는 필자의 사무실 (파스칼)에서 일부 기존 코드를 유지 관리하고 있으며 제한 사항 때문에 TExcelApplication을 사용하여 Excel에 액세스하려면 델파이 DLL을 작성했습니다. .Borland Delphi 7 TExcelApplication.Connect는 사무실 컴퓨터에서 작동하지만 클라이언트에서는 작동하지 않습니다.

dll은 사무실에서 완벽하게 작동하며 컴퓨터는 Microsoft Office 2010, Windows 7 32 비트 및 64 비트를 실행합니다. 클라이언트는 소설 워크 스테이션, Windows XP, Microsoft 2007을 사용하고 있습니다.

dll은 TExcelApplication.Connect가 발생할 때 중단 점 예외를 발생시킵니다. 명령.

앞서 언급 한 차이점 외에도 시나리오는 완전히 동일합니다.

소설 워크 스테이션에서 Microsoft Excel에 액세스하는 것과 관련하여 제한이 있습니까? 아니면 Excel 문서에 액세스하는 더 좋은 방법이 있습니까?

참고 : Excel 문서를 여러 줄, 열 및 스프레드 시트로 읽으려는 경우 원본 Excel 문서는 * .xls 2007 문서입니다.

Excel 문서에 대해 자동 조정 기능을 사용하는 것이 주요 기능이었습니다. 여기

는 라이브러리 코드 당신은 사용 목록에 ActiveX을 추가하고 ActiveX 구성 요소를 초기화하는 CoInitialize(nil);를 사용할 필요가

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. 
+3

자세한 오류 진단 정보가 필요하다고 생각합니다. –

+0

면책 조항 : 90 년대 초반부터 Novell에서 근무하지 않았습니다. Novell은 서버 OS가 Windows보다 더 제한적인 방식으로 사용된다는 것을 알고 있습니다. Novell은 단순히 COM/OLE 자동화를 허용하지 않거나 특별히 "켜야"할 수 있습니다. 당신이 여기에서 사용하고있는 것은 무엇입니까. 그런 것이 없다면 예외 메시지를 추가하고 예외 메시지 및 LastOSError 코드 (및 메시지)와 같은 오류 정보를 기록하여 자세한 오류 정보를 얻고 이미 David이 제안한대로 여기에 제공하여 도움을 받으십시오. –

+0

@ Marjan, Netware가 아닙니다. 응용 프로그램은 Windows 컴퓨터에서 실행되며 "Novell (sp) 워크 스테이션"은 Novell Netware Client를 네트워킹 드라이버로 사용하고 있습니다. Netware를 사용하면 COM이 잘 작동합니다 (원격 COM을 사용하는 경우 컴퓨터 경계에서 DCOM). 그러나 Windows 네트워크와 마찬가지로 Excel을 코드를 실행하는 워크 스테이션에 설치해야합니다. (우리는 서버 두 대에 내 사무실에서 Netware를 실행하고 있습니다.) –

답변

1

의 조각입니다. 이유는 Application-> Initialize가 구성 요소를 초기화하기 때문입니다. 이제 dll이기 때문에로드 할 때 구성 요소를 수동으로 초기화하고 dll을 언로드 할 때 UnCoInitizlise;을 사용해야합니다.

USES ActiveX, Windows; 

INITIALIZATION 
    CoInitialize(nil); 
FINALIZATION 
    UnCoInitialize; 
+0

일부 컴퓨터에서는 코드가 작동하지만 다른 컴퓨터에서는 작동하지 않는 이유는 무엇입니까? –

+0

ActiveX 초기화와 관련하여 Windows XP와 Windows 7의 차이점과 관련이있을 수 있습니다. –