안녕하세요,
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() 함수를 통과할 때
“형식이 일치하지 않습니다.” 오류가 표기됩니다.
어떻게 진행하는 것이 좋을지 답변을 부탁드립니다.
감사합니다.