한컴과 MFC 프로그램 연결 오류 관련 문의드립니다.

안녕하세요,
MFC 기반으로 hwp 문서와 연결하여 텍스트를 추출하고, MFC 앱에서 처리하는 것을 목적으로 기능 구현중입니다.
그러나 hwp 문서와 연결을 시도할 때 오류가 발생합니다.

해당 클래스의 목적 한글2022의 리본을 통해 HncUserAction과 연결하여 실행할 수 있도록 MFC 앱에서 구현 하였습니다.

개발 환경 참고사항으로는
Visual Studio 2015를 사용하였으며, CDHwpCtrl 클래스는 Typelib에서 클래스 추가하였습니다.

class Proxy
{
public:
	Proxy();
	~Proxy();
	
	ATL::CComPtr<IDispatch> GetExistHwp();
	void second_test();
	static BOOL __stdcall IsAccessiblePath(HWND hWnd, LONG nID, LPCTSTR szFilePath, LPCTSTR szSiteInfo);

private:
	ATL::CComPtr<IDispatch> hwp; // hwp 
};

// 현재 열려 있는 hwp 문서를 가져오기
ATL::CComPtr<IDispatch> Proxy::GetExistHwp()
{
	const wchar_t* DISPLAY_NAME = L"!HwpObject";
	ATL::CComPtr<IBindCtx> context;
	if (FAILED(CreateBindCtx(0, &context)))
		return nullptr;


	ATL::CComPtr<IRunningObjectTable> running_coms;
	if (FAILED(GetRunningObjectTable(0, &running_coms)))
		return nullptr;

	ATL::CComPtr<IEnumMoniker> monikers;
	if (FAILED(running_coms->EnumRunning(&monikers)))
		return nullptr;

	ATL::CComPtr<IMoniker> moniker;
	while (monikers->Next(1, &moniker, nullptr) == S_OK)
	{
		LPOLESTR display_name;
		if (SUCCEEDED(moniker->GetDisplayName(context, nullptr, &display_name))) {
			std::wstring name(display_name);
			CoTaskMemFree(display_name);

			if (name.find(DISPLAY_NAME) != std::wstring::npos) {
				IUnknown* unknown;
				HRESULT hr = running_coms->GetObject(moniker, &unknown);
				if (SUCCEEDED(hr)) {
					hr = unknown->QueryInterface(IID_IDispatch, (void**)&hwp);
					unknown->Release();  // 오리지널 IUnknown 출시
					if (SUCCEEDED(hr))
					{
						break;
					}
				}
			}
		}
		moniker.Release();
	}
	return hwp;
}

// hwp이랑 영결 테스트 위한 
void Proxy::second_test() {
	if (hwp) {
		CDHwpCtrl hwpCtrl(hwp);
		if (hwpCtrl.GetVersion();>= 0x05070130) {
			VARIANT vProc;
			AfxVariantInit(&vProc);
			vProc.vt = VT_BYREF;
			vProc.byref = IsAccessiblePath;
			hwpCtrl.RegisterModule(_T("FilePathCheckProc"), vProc);
		}
	}
}


BOOL __stdcall Proxy::IsAccessiblePath(HWND hWnd, LONG nID, LPCTSTR szFilePath, LPCTSTR szSiteInfo){
	// 무조건 허용합니다 
	return TRUE;
}

해당 함수를 기반으로 실행하여, GetExistHwp()를 호출하면 객체 “!HwpObject.120.1”이 얻어지며,
hwp 객체가 HwpCtrl(CDHwpCtrl)과 연결된 후 조건부에서 GetVersion() 함수를 통과할 때
“형식이 일치하지 않습니다.” 오류가 표기됩니다.

어떻게 진행하는 것이 좋을지 답변을 부탁드립니다.
감사합니다.

1개의 좋아요

안녕하세요. 한컴디벨로퍼입니다.

현재 담당자가 내용을 확인하고 있습니다. 조금만 기다려 주세요.

한컴디벨로퍼를 이용해 주셔서 감사합니다.

1개의 좋아요

안녕하세요.

추가하신 코드를 보니 한글 컨트롤을 추가하신 것 같은데 해당 부분은 HwpObject typelib을 추가하고 Automation으로 구현하셔야 합니다.

더 궁금한 점 있으시면 문의주세요!

1개의 좋아요

안녕하세요, 답변해주셔서 감사합니다.
해당 내용 추가적인 설명(예시나, 예)를 요청드려도 될까요?
제가 궁금한 부분은 HwpCtrl Object method 활용과 관련된 내용입니다.
감사합니다.

1개의 좋아요

안녕하세요.

CDHwpCtrl 클래스 추가하실 때 처럼 클래스 마법사에서 클래스 추가 - Typelib - HwpObject 1.0을 선택하시고 IHwpObject 인터페이스를 추가하시면 됩니다.

이후 Proxy::second_test 함수에서 사용한 CDHwpCtrl 클래스를 CHwpObject로 변경하시고 필요한 API를 사용하시면 됩니다.

Automation의 자세한 사용방법은 아래 링크를 참조하시고 포럼 내 정보를 이용하시면 됩니다.

추가 의문사항이 있으시면 언제든지 문의주세요

1개의 좋아요