OLE Automation입니다.
개발환경은 MFC(Visual C++)입니다.
CHwpObject의 SetTextFile함수입니다.
<<소스 코드 시작>>
CHwpObject m_hwpObject;
VARIANT varText;
varText.vt = VT_BSTR;
varText.bstrVal = (CComBSTR)((CString)strData).AllocSysString();
m_hwpObject.SetTextFile(varText, _T(“UNICODE”), _T(“insertfile”));
<<소스 코드 종료>>
혹시 몰라서 CComBSTR을 bstrVal에 사용했습니다.
화면에 해당 글씨가 아니라, "UNICODE"라는 글씨만 기록됩니다.
확인 부탁드립니다.
안녕하세요 ^^
아래와같이 MFC에서 테스트시 정상적으로 데이터를 넣어주고있습니다.
참고 부탁드립니다. 감사합니다 ^^
정상 동작하지 않을경우 정상적으로 들어가지 않는 데이터를 알려주시면 확인해보겠습니다.
CComBSTR strBuffer;
strBuffer = L"테스트 데이터입니다.";
VARIANT vartext;
vartext.vt = VT_BSTR;
vartext.bstrVal = strBuffer;
myHwpObj.SetTextFile(vartext, L"UNICODE", L"insertfile");
1개의 좋아요
글 주신 것 처럼
######################
CComBSTR strBuffer;
strBuffer = L"테스트 데이터입니다.";
VARIANT varText;
varText.vt = VT_BSTR;
varText.bstrVal = strBuffer;
######################
으로 입력을 넣으면 잘 나옵니다. 하지만
######################
VARIANT varText;
varText.vt = VT_BSTR;
varText.bstrVal = (CComBSTR)L"테스트 데이터입니다.";
######################
으로 직접 넣으면 "UNICODE"라는 글씨로 나옵니다.
참고로 varText.bstrVal = (CComBSTR)((CString)strData).AllocSysString();처럼 처리한 이유도
varText.bstrVal = (CComBSTR)strData;으로 처리했을 때, 문제가 있기 때문에 추가적으로 더 해본 부분입니다.
1개의 좋아요
참고로 하단 세줄의 strData는 CString이나 LPCTSTR입니다.
1개의 좋아요
CComBSTR을 사용하는 이유는 개체간 통신을 위해 ms의 com 프로토콜을 이용하기떄문입니다.
user106님이 사용하신것 처럼 캐스팅으로는 정상 적인 사용이 어려운것으로 보입니다.
CComBSTR을 따로 선언후 여기에 텍스트를 복사후 인터페이스 이용이 필요할것으로 보입니다 ^^
1개의 좋아요
조금 더 자세한 설명 부탁드립니다. 기존 데이터가 CString이기 때문에 어떻게 CString을 CComBSTR로 바꿀 수 있는지에 대한 설명을 부탁드립니다.
저도 찾아보고는 있지만 어려움이 있기에 자세하게 언급 부탁드립니다.
[1] 첫번째 시도
VARIANT varText;
varText.vt = VT_BSTR;
CComBSTR strComData = (CComBSTR)strData;
varText.bstrVal = (CComBSTR)strComData;
m_hwpObject.SetTextFile(varText, _T(“UNICODE”), _T(“insertfile”));
=> UNICODE라는 글씨로 나옵니다.
[2] 두번재 시도
VARIANT varText;
varText.vt = VT_BSTR;
CComBSTR strComData;
strComData.m_str = (BSTR)strData;
varText.bstrVal = (CComBSTR)strComData;
m_hwpObject.SetTextFile(varText, _T("UNICODE"), _T("insertfile"));
=> 죽어 버립니다.
[3] 세번째 시도
VARIANT varText;
varText.vt = VT_BSTR;
CComBSTR strComData;
strComData.m_str = ((CString)strData).AllocSysString();
varText.bstrVal = (CComBSTR)strComData;
m_hwpObject.SetTextFile(varText, _T(“UNICODE”), _T(“insertfile”));
=> UNICODE라는 글씨가 나옵니다.
캐스팅 관련 인터넷 설명
그냥 BSTR을 CComBSTR로 캐스팅하면 된다고 나옵니다.
---------------- CComVariant, CComBSTR ---------------
VARIANT => CComVariant;
BSTR => CComBSTR
1개의 좋아요
일단 글씨가 입력되는 것은 확인하였습니다.
하지만 글자모양이 주변 글씨의 글자모양을 따르지 않습니다. 무조건 “바탕”, "10pt"로 나옵니다.
void CStringToCComBSTR(CComBSTR& strComBSTR, CString strData)
{
strComBSTR = L"";
strComBSTR.m_str = (BSTR)strData.AllocSysString();
}
// 메인 구현 부분
CComBSTR strComBSTR = L"";
CStringToCComBSTR(strComBSTR, strData);// 생성
VARIANT varText;
varText.vt = VT_BSTR;
varText.bstrVal = strComBSTR;
//varText.bstrVal = (CComBSTR)strComBSTR;// 이렇게 CComBSTR로 캐스팅하면 안 됩니다.
m_hwpObject.SetTextFile(varText, _T("UNICODE"), _T("insertfile"));
::SysFreeString(strComBSTR);// 해제
1개의 좋아요
아래 두가지 예제 전달드립니다.
CComBSTR를 사용하는 이유는 BSTR의 경우 프로세스간 스트링 전달을 위해서 시스템 메모리에 할당을 하기때문에 해제를 잘해주어야하는데 CComBSTR의 경우 자동으로 해제를 해줍니다.
CString strData = L"테스트 데이터입니다.";
CComBSTR strBuffer;
strBuffer = strData.AllocSysString();
VARIANT vartext;
vartext.vt = VT_BSTR;
vartext.bstrVal = strBuffer;
myHwpObj.SetTextFile(vartext, L"UNICODE", L"insertfile");
CString strData = L"테스트 데이터입니다.";
VARIANT vartext;
vartext.vt = VT_BSTR;
vartext.bstrVal = strData.AllocSysString();
myHwpObj.SetTextFile(vartext, L"UNICODE", L"insertfile");
1개의 좋아요
SetTextFile의 경우 텍스트 파일을 해당위치에 넣는 api기때문에 현재 캐럿의 글자모양을 따르지 않습니다.
insertText 액션을 이용하시면 될것 같습니다^^
1개의 좋아요
문제를 해결되었습니다. 이 글을 읽을 다른 분들을 위해서 하단에 내용을 정리합니다.
###########################################
[1] LPCTSTR strData = _T(“”);
CComBSTR strBuffer;
strBuffer = strData;
처럼 LPCTSTR값을 그대로 대입하지 마시기 바랍니다.
CString strData = _T("");
CComBSTR strBuffer;
strBuffer = strData.AllocSysString();
CString에서 AllocSysString함수를 받아서 사용하시기 바랍니다.
[2]
CComBSTR strComBSTR = L"내용";
VARIANT varText;
varText.vt = VT_BSTR;
varText.bstrVal = (CComBSTR)strComBSTR;
처럼 CComBSTR로 캐스팅하지 마시기 바랍니다. varText.bstrVal는
BSTR bstrVal; /* VT_BSTR */
와 같이 BSTR입니다.
CComBSTR strComBSTR = L"내용";
VARIANT varText;
varText.vt = VT_BSTR;
varText.bstrVal = strComBSTR;
처럼 BSTR을 그냥 넣으시기 바랍니다.
[3] HwpObject의 SetTextFile함수는 커서의 [글자모양]을 사용하지 않고 하드코딩값인 “바탕”, "10pt"을 사용합니다.
기준 HwpCtrl을 사용하셨다면 “InsertText” Action을 사용하셔야 할 것 같습니다.
하지만 다른 점은 "InsertText"는 입력을 끝내면 커서가 입력값의 마지막에 놓여 있습니다.
1개의 좋아요
cwy
9월 25, 2023, 6:56오전
11
안녕하세요. 한컴디벨로퍼입니다.
유용한 정보를 공유해 주셔서 감사합니다.
한컴디벨로퍼는 고객님의 참여로 성장하고 있습니다. 관심과 기대에 부응하는 한컴디벨로퍼가 되겠습니다.
감사합니다.
한컴디벨로퍼 드림
1개의 좋아요