한글 오피스 2024에서 API를 사용한 문서 열기 및 닫기 오류

Visual Studio(MFC)기반입니다.
한글 오토메이션입니다.

한글 오피스 2024에서 HwpAutomation( CHwpObject클래스 )를 사용해서 문서를 열려고 하면 "서버에서 예외 오류가 발생했습니다."메시지가 뜹니다.

다시 닫으려고 하면 "RPC 서버를 사용할 수 없습니다."메시지가 뜹니다 확인 부탁드립니다.

디버깅하면서 느리게 열면 문제가 없습니다.
최신 패치를 해도 동일합니다.

1개의 좋아요

안녕하세요 ^^
아래와 같은 코드로 테스트시 제 PC에서 테스트시 정상 동작하고있습니다~!
혹시 어떻게 생성하고 사용하시는지 샘플코드를 주신다면 확인해보겠습니다.
감사합니다.

CHwpObject myHwpObj;
if (myHwpObj.CreateDispatch(L"HwpFrame.HwpObject.2") == TRUE) {
	myHwpObj.RegisterModule(L"FilePathCheckDLL", CComVariant(L"FilePathCheckModule"));

	CXHwpWindows xWindows;
	xWindows = myHwpObj.get_XHwpWindows();

	CXHwpWindow xWindow;
	xWindow = xWindows.get_Active_XHwpWindow();
	xWindow.put_Visible(1);
	
	myHwpObj.Open(CComVariant(L"c:\\test.hwpx"),CComVariant(L""),CComVariant(L""));	
}
1개의 좋아요

오래 기다리셨습니다. 해당 부분만 분리해서 테스트하였고, 동일한 메시지가 발견되었습니다.

오류 발생 시나리오입니다.

[1] 한글 오토메이션을 생성한 후에 해제합니다.

m_ctrlHwp = new CHwpObject();
BOOL	bSuccessCreate = m_ctrlHwp->CreateDispatch(_T("HWPFrame.HwpObject.1"));
if (bSuccessCreate == FALSE)
{
	return FALSE;
}
if (m_ctrlHwp != NULL)
{
	m_ctrlHwp->Quit();//반드시 있어야 합니다.
	m_ctrlHwp->DetachDispatch();//없어도 오류 나옵니다.
	m_ctrlHwp->ReleaseDispatch();//없어도 오류 나옵니다.

	delete m_ctrlHwp;
	m_ctrlHwp = NULL;
}

[2] 그 후에 특정 한글 문서를 열면서 화면에 표시시킵니다.

CLawView* pLawView = new CLawView();

DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_TOP | AFX_CBRS_CLOSE | AFX_CBRS_FLOAT;
if (!pLawView->Create(strTargetSrcView, this, CRect(0, 0, 0, 0), TRUE, 1, dwStyle))
{
	delete pLawView;
	pLawView = nullptr;
	return FALSE; // failed to create
}

//파일 열기(자세한 내용은 생략)

varFormat =(CComBSTR)T2BSTR(_T(“HWP“))
varArgument= (CComBSTR)T2BSTR(L"lock:false;forceopen:true”)
BOOL bOpen = m_ctrlHwp->Open(strFilename, varFormat, varArgument);

DockingPane위에 CDialog롤 올렸고 그 위에 CHwpObject의 핸들을 올렸습니다.
자세한 것은 내부 기술이기 때문에 forum에 공개하기 어렵습니다.

[3] DockingPane을 상속받은 클래스의 Create함수 내부는 아래와 같습니다.

BOOL CLawView::Create(LPCTSTR lpszCaption, CWnd* pParentWnd, const RECT& rect, BOOL bHasGripper,
UINT nID, DWORD dwStyle, DWORD dwTabbedStyle, DWORD dwControlBarStyle, CCreateContext* pContext)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
BOOL bCreate = CDockablePane::Create(lpszCaption, pParentWnd, rect, bHasGripper, nID, dwStyle,
AFX_CBRS_REGULAR_TABS, AFX_DEFAULT_DOCKING_PANE_STYLE, pContext);
m_ctrlHwp->ReleaseDispatch();

m_ctrlHwp->Clear(COleVariant((short)1));

BOOL	bSuccessCreate = m_ctrlHwp->CreateDispatch(_T("HWPFrame.HwpObject.1"));
if (bSuccessCreate == FALSE)
{
	return FALSE;
}

VARIANT varModuleData;
varModuleData.vt = VT_BSTR;
varModuleData.bstrVal = (CComBSTR)T2BSTR(L"FilePathCheckerModuleExample");
BOOL	bSuccessRegister = m_ctrlHwp->RegisterModule(L"FilePathCheckDLL", varModuleData);
m_ctrlHwp->Run(_T("ShapeObjAlignWidth"));

}

오류 메시지가 발생하는 시점은 Open함수입니다.

1개의 좋아요

forum에는 파일 추가가 안 되어서 첨부하지 못 했습니다.
메일로는 드릴 수 있습니다.

1개의 좋아요

한글 오피스 2024 세부 버전 정보는 13.0.0.1053입니다.
처음에 설치했을 때는 13.0.0.711이었던 것으로 기억합니다.

1개의 좋아요

한글 오토메이션 개체와의 연결이 끊겨서 발생했을 가능성이 높습니다.

CreateDispatch를 하면 Client Application (Client) → Hwp.exe (Server) 가 연결되는데

  • 알 수는 없지만 Hwp.exe가 종료되었거나
  • 오토메이션 서버의 인스턴스인 m_ctrlHwp의 DetachDispatch 혹은 ReleaseDispatch로 연결을 끊었다던가

이런 케이스가 될 것 같은데요.

샘플을 디버깅해보면 명확히 답변드릴 수 있을 것 같네요. :sob:

1개의 좋아요

제가 조금 더 기다려야하는 건가요? 아니면, 제가 뭔가 해야 하는 건가요?
재현은 되셨나요?

안녕하세요 ^^
저도 바로 해보고 도와드리고 싶지만 급한 업무들이 밀려서 바로바로 해볼수가 없네요 ㅠ
언제 되겠다 딱 말씀드리기 어려울것같습니다.
그런데 작성하신 코드를 보니 Object를 릴리즈 한뒤 Clear API호출을 하는 부분이 있는대요.
여기서 오류가 날것같습니다. Release를 해제 했는데 ApI를 호출하여 정상 동작하지 않을것 같습니다.
혹시 의도한 동작이실까요?

[1] (별로 안 중요함) 제가 기억을 되집어보니 Clear(1) 함수는 한글 오피스를 빈 문서로 바꾸는 내용입니다.
CreateDispatch(생성)를 하기 전에 소멸의 개념으로 구현한 것으로 보입니다.
제가 텍스트로 드린 내용에는 없지만, 실제로는 소멸과 같이 메모리 해제도 같이 합니다.

[2] (중요함) ReleaseDispatch를 Clear보다 먼저 한 특별한 이유는 없는 것으로 보입니다.
저도 의구심이 들어서 Clear를 먼저 한 후 ReleaseDispatch를 해보았지만 동일한 문제가 발생했습니다.
즉, 이 부분이 문제는 아닌 것 같습니다.

저도 재촉하기는 싫지만, 언제쯤 확인시작 및 작업이 가능할까요?

안녕하세요 ^^
저도 빨리 확인해보고 싶지만 바로는 어려울것 같습니다.
다음주는 되어야 확인해볼수 있을것 같습니다~!

그런데 혹시 [1] 부분의 생성한 후 해제 한뒤 CHwpObject를 새로 new CHwpObject로 생성 하셨을까요?
전체 코드가 아니여서 유추해서 하나하나 돌렸을땐 문제가 없었는데 생각해보니 delete를 한뒤 null 인상태에서 CreateDispatch 를 호출하면 오류가 발생할수 밖에 없을것 같습니다.

우선 해당 부분이 아니라면 저도 소스를 다시 돌려보면서 어떤문제일까 확인을 고민을 해봐야할것 같은데 다음주나 가능할것 같습니다 ㅠ

delete하지 않았습니다.
delete했으면, "서버에서 예외 오류가 발생했습니다."라는 메시지가 안 뜨고, 그냥 죽었겠죠.

올려주신 1번 스탭에서 한글 오토메이션을 해제하는 분에서 createDispatch가 된 경우 delete를해서 포인터를 초기화 시키는 부분이 있어서 말씀드렸습니다 ^^
설명해주신대로 [1] [2] [3] 스탭을 갈떄 [2]스탭에서는 [1]스탭에서 컨트롤이 딜리트된 이후인데 [2]에서는 생성 부분이 없고 [3]에서는 createDispatch가 있으나 new를 하는 부분이 없어서 말씀드렸습니다.

1개의 좋아요

아! [1] 부분과 [3] 부분에 있는 m_ctrlHwp는 변수명만 같고, 다른 클래스에 있는 다른 변수입니다.

왠만하면, 샘플 만들려고 노력하지 마시고, 제가 가지고 있는 단위 테스트 파일 받아서 작업하시기 바랍니다.
파일 받으면, 이런 대화를 할 필요도 없기 때문입니다.

1개의 좋아요

다시 한번 더 현재 상황이 어떤지 조심스럽게 여쭈어 봅니다.

안녕하세요 ^^
확인해보았지만 내부에서는 정상적으로 뜨고 있습니다.
메일을 따로 알려드릴순 없고 구글 드라이버 같은 웹드라이버에 소스를 올려서 링크를 공유주시거나,
홈페이지의 고객지원 쪽으로 기술지원을 받으셔야할꺼 같습니다.
감사합니다.

1개의 좋아요

support@hancom.com으로 메일 드리면 안 되나요?

1개의 좋아요

네 해당메일은 제가 확인이어려울 것 같습니다 …! ㅜ ㅜ

1개의 좋아요

구글 드라이브를 자주 사용하지 않아서 제대로 했는지는 잘 모르겠습니다.

1개의 좋아요