본문 바로가기
C++/MFC

[MFC Console] HwpAutomation을 이용한 Print 진행 예제 입니다.

by Hwoarang757 2024. 10. 20.

[MFC Console] HwpAutomation을 이용한 Print 진행 예제 입니다.

 

출처 : https://developer.hancom.com/hwpautomation

 

Hwp 파일에 대하여 오픈 메서드를 호출 할때 마다 보안승인을 하겠냐는 메시지 박스가 발생 하는 부분에 대하여 ,

보안 승인 모듈에 대하여 Registry에 등록되어있는지 여부를 체크 하고 등록되어 있지 않다면 등록 시도 하게 끔 하였습니다.

#include "pch.h"
#include "framework.h"
#include <string>
#include <vector>
#include <format>

#include "CHwpObject.h"
#include "CAction.h"
#include "CParameterSet.h"
#include "CSet.h"
#include "CPrint.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 유일한 애플리케이션 개체입니다.

CWinApp theApp;

//using namespace std;

int main()
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(nullptr);

    if (hModule != nullptr)
    {
        // MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
        if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
        {
            // TODO: 여기에 애플리케이션 동작을 코딩합니다.
            wprintf(L"심각한 오류: MFC 초기화 실패\n");
            nRetCode = 1;
        }
        else
        {
            std::wcout.imbue(std::locale(""));
            // TODO: 여기에 애플리케이션 동작을 코딩합니다.
            TryHWPPrintJob();
        }
    }
    else
    {
        // TODO: 오류 코드를 필요에 따라 수정합니다.
        wprintf(L"심각한 오류: GetModuleHandle 실패\n");
        nRetCode = 1;
    }

    return nRetCode;
}

/// <summary>
/// 모듈 Registry 등록 진행 
/// </summary>
/// <param name="parameter"></param>
void CheckModuleRegistry(std::wstring parameter) 
{
    HKEY hKey = NULL;
    DWORD dwDisposition;
    DWORD dwDataSize = 0;
    TCHAR* pszPath = NULL;
    
    
    std::wcout << L"FilePathCheckModule의 Registry 경로를 체크 진행 합니다." << std::endl;

    if (RegCreateKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\HNC\\HwpAutomation\\Modules", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS)
    {
        if (RegQueryValueEx(hKey, L"FilePathCheckModule", NULL, NULL, NULL, &dwDataSize) == ERROR_SUCCESS)
        {
            if (dwDataSize) 
            {
                
                std::wcout << L"Registry에 등록된 경로가 확인되었습니다 dwDataSize=" << dwDataSize << std::endl;
                
                pszPath = new TCHAR[dwDataSize];
                if (RegQueryValueEx(hKey, L"FilePathCheckModule", NULL, NULL, (LPBYTE)pszPath, &dwDataSize) == ERROR_SUCCESS)
                {
                    std::wstring szMsg(pszPath);
                    delete[] pszPath;
                    //std::wstring szReplMsg = replace_all(szMsg, L"\\", L"\\\\");
                    
                    
                    std::wcout << L"Registry에 등록된 경로가 확인되었습니다=" << szMsg << std::endl;
                }
            }   
        }
        else 
        {
            
            std::wcout << L"Registry에 키가 존재하지 않습니다 등록 시도 합니다." << std::endl;

            std::wstring strRegValue = parameter + L"\\FilePathCheckerModuleExample.dll";
            std::wcout << L"Registry Key Value=" << strRegValue << std::endl;
            
            // TODO Registry 등록 진행
            if (RegSetValueEx(hKey, L"FilePathCheckModule", 0, REG_SZ , (LPBYTE)strRegValue.c_str(), (strRegValue.size() + 1 )  * sizeof(wchar_t)  ) != ERROR_SUCCESS) {
                std::wcout << L"Registry 키 등록에 실패 하였습니다." << std::endl;
            }
        }
    }

    RegCloseKey(hKey);
}

/// <summary>
/// Hwp 파일을 인쇄 시도 하도록 한다.
/// </summary>
void TryHWPPrintJob() 
{
    LPWSTR* szArgList;
    int nArgs;
    std::vector<std::wstring> vecParam;
    std::wstring szParam;

    szArgList = CommandLineToArgvW(GetCommandLineW(), &nArgs);

    if (nArgs != 6) {
        std::wcout << L"매개변수의 개수가 일치 하지 않습니다." << std::endl;

        for (int i = 0; i < nArgs; i++) {
            szParam = szArgList[i];
            std::wcout << szParam << std::endl;
        }

        return;
    }
    else {
        for (int i = 0; i < nArgs; i++) {
            szParam = szArgList[i];
            vecParam.push_back(szParam);
        }
    }

    
    std::wcout << "parameter 0:" << vecParam.at(0) << std::endl;
    std::wcout << "parameter 1:" << vecParam.at(1) << std::endl;
    std::wcout << "parameter 2:" << vecParam.at(2) << std::endl;
    std::wcout << "parameter 3:" << vecParam.at(3) << std::endl;
    std::wcout << "parameter 4:" << vecParam.at(4) << std::endl;
    std::wcout << "parameter 5:" << vecParam.at(5) << std::endl;

    /*
        parameter 0:  ProcessName
        parameter 1 : D:\\Test\\Test.hwp
        parameter 2 : 0
        parameter 3 : 0
        parameter 4 : PrinterName
        parameter 5 : D:\\Test\\보안모듈(Automation)
    */

    CheckModuleRegistry(vecParam.at(5));

    CHwpObject hwpObject;
    HRESULT hResult = CoInitialize(NULL);

    if (hwpObject.CreateDispatch(L"HWPFrame.HwpObject.1") == TRUE)
        std::wcout << L"HwpFrame.HwpObject.1 CreateDispatch 에 성공 하였습니다." << std::endl;
    else {
        std::wcout << L"HwpFrame.HwpObject.1 CreateDispatch 에 실패 하였습니다." << std::endl;
        return;
    }

    CComVariant moduleData = L"FilePathCheckModule";
    if(hwpObject.RegisterModule(L"FilePathCheckDLL", moduleData))
        std::wcout << L"hwpObject.RegisterModule(L\"FilePathCheckDLL\", moduleData); 에 성공 하였습니다." << std::endl;
    else {
        std::wcout << L"hwpObject.RegisterModule(L\"FilePathCheckDLL\", moduleData); 에 실패 하였습니다." << std::endl;

        hwpObject.Quit();
        std::wcout << L"hwpObject.Quit();" << std::endl;
        hwpObject.DetachDispatch();
        std::wcout << L"hwpObject.DetachDispatch();" << std::endl;

        return;
    }

    CComVariant format = L"HWP";
    CComVariant arg = L"forceopen:true";
    
    BOOL bResult = hwpObject.Open(vecParam.at(1).c_str() ,format ,arg);

    if (bResult == FALSE) {
        std::wcout << L"한글 파일 열기에 실패 하였습니다." << std::endl;
        return;
    }

    CAction action;
    CParameterSet parameterSet;
    CSet set;
    CPrint print;

    action.AttachDispatch(hwpObject.get_HAction());
    parameterSet.AttachDispatch(hwpObject.get_HParameterSet());
    print.AttachDispatch(parameterSet.get_HPrint());
    set.AttachDispatch(print.get_HSet());
    action.GetDefault(L"Print", set);

    print.put_PrinterName(vecParam.at(4).c_str());

    if (vecParam.at(2) == L"0" && vecParam.at(3) == L"0") 
        print.put_Range(0);
    else {
        print.put_Range(4);
        std::wstring strRangeCustom = vecParam.at(2) + L"-" + vecParam.at(3);
        print.put_RangeCustom(strRangeCustom.c_str());
    }

    action.Execute(L"Print", set);

    parameterSet.DetachDispatch();
    print.DetachDispatch();
    set.DetachDispatch();
    action.DetachDispatch();

    hwpObject.Quit();    
    std::wcout << L"hwpObject.Quit();" << std::endl;
    hwpObject.DetachDispatch();
    std::wcout << L"hwpObject.DetachDispatch();" << std::endl;

    CoUninitialize();
}