[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();
}
'C++ > MFC' 카테고리의 다른 글
Dialog 생성 AfxBeginThread 이용 Thread 호출 예제 입니다. (1) | 2024.11.09 |
---|---|
[MFC] PRINTER_INFO_4를 이용한 프린터 설치 여부 체크 진행 예제 (0) | 2024.06.28 |
[MFC] Windows Service 시작 / 중지 상태 확인 제어 예제 (0) | 2023.06.27 |
RegOpenKeyEx 32bit 응용프로그램에서 64bit Registry 접근 예제 (0) | 2023.06.22 |
[MFC] WAS서버에 POST 파라미터 전송 시에 한글 깨짐으로 인하여 URLEncode 처리 구현 테스트 진행 (0) | 2023.03.02 |