2011-09-06 4 views
4

Delphi 2006에서 MS Excel COM-Addin을 작성하고 있습니다. 개발 컴퓨터에 Excel 2007이 설치되어 있습니다.Delphi Excel COM-Addin

프로젝트를 ActiveX 라이브러리로 시작한 다음 Delphi ActiveX 프로젝트 메뉴에서 자동화 개체를 추가했습니다. 내 자동화 개체에서

나는

IDTExtensibility2 = interface(IDispatch) 
    ['{32E456FC-C710-43AA-9ACA-DDE8F132B91B}'] 
    function OnAddinsUpdate(var w_Custom: OleVariant): HResult; stdcall; 
    function OnBeginShutDown(var w_Custom: OleVariant): HResult; stdcall; 
    function OnConnection(const w_Application: IDispatch; w_ConnectMode: Integer; 
         const w_AddInInst: IDispatch; var w_Custom: OleVariant): HResult; stdcall; 
    function OnDisconnection(w_DisconnectMode: Integer; var w_Custom: OleVariant): HResult; stdcall; 
    function OnStartupComplete(var w_Custom: OleVariant): HResult; stdcall; 
end; 

으로하는 IDTExtensibility2 인터페이스를 정의하고 TAutoObject에서 파생 된 클래스에서 인터페이스를 구현했습니다. 유닛의 초기화 섹션에서

나는

TAutoObjectFactory.Create(ComServer, TPBSExcelAddin, Class_PBSExcelAddin, ciSingleInstance, tmApartment); 

COM 개체가 미세 등록하고, 그러나 그것은에서 엑셀에 설치합니다 엑셀 추가 기능 옵션에 표시 호출합니다. "로드되지 않았습니다 .Addin COM로드 중 오류가 발생했습니다."

누구나 내 인터페이스에 문제가있을 수 있습니까? 또는 내가 com 객체를 만드는 방법? 이 디버깅 할 수있는 방법이 있습니까?

감사합니다

+0

나는이 일을 약간 뒤로하려고 노력했다. 올바르게하기가 어렵습니다. 결국 나는 Add-in Express를 발견했는데 나는 충분히 추천 할 수 없었다. –

+0

David에게 감사드립니다. 내가 애드 인 익스프레스를 고려했지만 오히려 내 자신의 학습을 위해 처음부터 그것을 할 것입니다. –

+1

그럼 행운을 빌어 요! –

답변

4

귀하의 신고는 IDTExtensibility2입니다. 그것은해야한다 : 기억하는 것이 중요하다

IDTExtensibility2 = interface(IDispatch) 
    ['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}'] 
    procedure OnConnection(const Application: IDispatch; ConnectMode: ext_ConnectMode; 
         const AddInInst: IDispatch; var custom: PSafeArray); safecall; 
    procedure OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall; 
    procedure OnAddInsUpdate(var custom: PSafeArray); safecall; 
    procedure OnStartupComplete(var custom: PSafeArray); safecall; 
    procedure OnBeginShutdown(var custom: PSafeArray); safecall; 
end; 

한 가지 인터페이스의 메소드가 올바른 선언해야한다는 것입니다 주문 잘못된 순서로 선언했다. 나는 또한 당신이 당신의 GUID를 어디서 얻었는지 모른다.

Microsoft Add-In Designer 용 형식 라이브러리를 가져 와서이 인터페이스 선언을 가져 왔습니다. 나는 당신이 똑같이하도록 강력히 권한다.

+0

감사합니다. 나는 독자적으로 알아낼 수 있었지만, 직접 선언하지 않고 형식 라이브러리를 가져올 수있을 때까지 인터넷 검색을 조금만했습니다. 이것은 실제로 형식 라이브러리 가져 오기에 대해 알지 못했기 때문에 COM 추가 기능을 작성한 첫 번째 시간입니다. Addin 탭에 예상대로 나타나는 버튼과 이벤트를 추가하는 방법을 알아 냈습니다. –

+0

추가 기능이 제대로 작동하는지 확인하는 것이 좋습니다. 이제 리본과 상호 작용하는 코드를 작성해 주셔서 감사합니다. 재밌네. –

1

예,이 디버깅하는 방법이있다 :

  • 프로젝트 옵션 (Ctrl 키 + + F11 시프트)
  • 이동 링커 탭을 열고

    1. 닫기 Excel을
    2. 확인 TD32 디버그 정보 포함원격 디버깅 기호을 포함하십시오. 즉시 매개 변수 (실행 메뉴, 매개 변수 ...) 엑셀
    3. -
    4. 변경 호스트 응용 프로그램 다시 실행을 실행하는
    5. 이동 (아마도 첫 번째는 필요하지만 미안보다 안전) 귀하 addin이로드되면 디버깅을 시작할 수 있습니다.

    디버깅을하지 않으면 초기화 코드에 문제가없는 것입니다. 그러면 필요한 패키지를로드하는 데 문제가 있거나 추가 기능에서 올바른 방식으로 _IDExtensibility 인터페이스를 구현하지 못할 수 있습니다.

  • +0

    감사합니다 The_Fox 매우 도움이됩니다.그러나 델파이에서 IDTExtensibility 인터페이스를 정의하는 올바른 방법은 무엇입니까? 사용자 지정 및 응용 프로그램 매개 변수에 사용할 형식을 잘 모르겠습니다. –

    +0

    4 단계는 전혀 필요하지 않습니다. –

    +0

    @David Heffernan : 4 단계에서 해결했다고 생각되는 호스트 응용 프로그램을 설정하여 dll/bpl을 디버깅 할 때 (중단 점을 설정할 수 없음) 몇 가지 문제점을 기억합니다. 어쨌든 그 속성을 설정하는 것은 상처를줍니다. –

    관련 문제