Microsoft's DSOFramer
컨트롤을 사용하여 대화 상자에 Excel 파일을 포함시켜 사용자가 자신의 시트를 선택한 다음 해당 범위를 선택하도록 허용합니다. 세포; 대화 상자의 가져 오기 버튼과 함께 사용됩니다.DSOFramer 다른 문서에서 Excel 문서를 닫는 중입니다. 파일에 저장되지 않은 데이터가있는 경우 dsoframer가 "잘못된 주소에 액세스 시도"로 열리지 않습니다.
DSOFramer's OPEN
함수를 호출 할 때 다른 창에서 Excel을 열면 Excel 문서가 닫히지 만 Excel은 실행됩니다. 닫으려고하는 문서에 데이터가 저장되지 않은 경우 다른 창에서 Excel 문서를 닫는 대화 상자가 나타납니다. 파일에 저장하지 않은 데이터가있는 경우 dsoframer
메시지 상자를 사용하여 열 수 없습니다 : Attempt to access invalid address
.
나는 소스를 빌드하고 단계별로 진행하여 CDsoDocObject::CreateFromFile
함수를 호출하고 IMoniker 클래스의 객체에 BindToObject
을 호출합니다. HR
은 0x8001010a
The message filter indicated that the application is busy
입니다. 해당 오류가 발생하면 InstantiateDocObjectServer
에 의해 classid
중 CLSID
Microsoft Excel 워크 시트 ... 이 0x80040154
Class not registered
과 함께 실패합니다. InstantiateDocObjectServer
은 classid
의 CoCreateInstance
을 먼저 호출합니다. 먼저 CLSCTX_LOCAL_SERVER
으로, 그런 다음 CLSCTX_INPROC_SERVER
으로 실패합니다.
알고 계십니까? DSOFramer
은 다양한 대화 상자 및 양식에 Office 응용 프로그램을 포함시키기위한 인기있는 샘플 프로젝트입니다. 나는 다른 누군가가이 문제를 겪었고 이것이 어떻게 해결 될 수 있는지에 대한 통찰력을 갖기를 희망한다. 나는 실제로 열려있는 다른 Excel 문서를 닫고 싶지 않으며 저장되지 않은 데이터 때문에 문서를 닫을 수 없으면 오류를 내고 싶지 않습니다.
업데이트 1 : Excel.Application
(이 클래스가 해결 될 것이라고 알고 있음)로 전달 된 classid
을 변경하려고 시도했지만 작동하지 않았습니다. CDsoDocObject
에서 키 HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\DocObject
을 열려고하지만 실패합니다. 키가 내 레지스트리에 존재하지 않는다고 시각적으로 확인했습니다. 가이드 용 키가 있지만 DocObject
하위 키가 없습니다. 다음 오류 메시지 상자를 생성합니다 : The associated COM server does not support ActiveX document embedding
. Excel.Workbook programid
을 사용하려고하면 비슷한 결과 (다른 키, 물론)가 발생합니다.
업데이트 2 : 문제 자동화 Excel 인스턴스 대신 내 자동화가 가장 최근에 호출 된 것으로 바인딩되기를 기대하면서 Excel의 두 번째 인스턴스를 시작하려고했지만 그렇게하지 않은 것 같습니다. 결과는 동일했다. 내 문제는 다음과 같습니다. IMoniker
클래스의 개체에 BindToObject
을 호출하고 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)
The message filter indicated that the application is busy
을받는 중입니다. 나는 (SetBindOptions
을 통해) BindToObject
에 전달 된 플래그로 게임을 시도했지만 아무런 차이가없는 것 같습니다.
업데이트 3 : IMoniker 클래스를 사용하여 먼저 바인딩을 시도합니다. 실패 할 경우 clsid
의 CoCreateInstance
을 fallback
메소드로 호출합니다. 이 기능은 다른 MS Office 개체에서도 작동하지만 Excel 인 경우 클래스는 워크 시트 용입니다. 샘플을 CoCreateInstance _Application
으로 수정 한 다음 통합 문서를 얻은 다음 대상 파일에 대해 Workbooks::Open
이라고하고 워크 시트 개체를 반환합니다. 그런 다음 해당 포인터를 반환하고 원래 샘플 코드 경로로 다시 병합했습니다. 모두 일하고있어.