성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Excel Sheet를 WinForm에서 사용하는 방법 - 두 번째 이야기</h1> <p> 예전에 쓴,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Excel Sheet를 WinForm에서 사용하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1208'>http://www.sysnet.pe.kr/2/0/1208</a> </pre> <br /> dsoframer.ocx가 아직도 잘 동작하는군요. ^^ 그래서 오래간만에 해당 프로젝트를 Visual Studio 2019로 마이그레이션 해봤습니다. 우선, C++ 프로젝트는 빌드하면 다음과 같은 식의 매크로 사용 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C3688 invalid literal suffix 'DSOFRAMERCTL_CLSIDSTR'; literal operator or literal operator template 'operator ""DSOFRAMERCTL_CLSIDSTR' not found </pre> <br /> 문제가 된 소스 코드를,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > hr = RegRecursiveDeleteKey(HKEY_CLASSES_ROOT, "CLSID\\<span style='color: blue; font-weight: bold'>"DSOFRAMERCTL_CLSIDSTR</span>); </pre> <br /> 매크로와 큰따옴표 간의 공백만 추가하는 것으로 바꾸면 해결됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > hr = RegRecursiveDeleteKey(HKEY_CLASSES_ROOT, "CLSID\\<span style='color: blue; font-weight: bold'>" DSOFRAMERCTL_CLSIDSTR</span>); </pre> <br /> 이 외에는 컴파일 오류는 발생하지 않으며, 링크 단계에서 다음의 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Error LNK2026 module unsafe for SAFESEH image. </pre> <br /> 이건 <a target='tab' href='https://social.msdn.microsoft.com/Forums/ko-KR/4039184d-d765-45bf-9d72-25f5c6f8d5b4/error-lnk2026-module-unsafe-for-safeseh-image?forum=vcgeneral'>Q&A</a>에 따라 "Linker / Advanced / Image Has Safe Exception Handlers" 옵션 값을 꺼주면(/SAFESEH:NO) 됩니다.<br /> <br /> 그 외에 개발자 PC에 설치한 Office 버전에 따라 #import 오류가 발생하는데 이 부분은 다음과 같은 식의 매크로를 정의하는 것으로 일단 우회해서 해결했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 아래의 경로는 개발자의 환경에 맞게 수정해야 합니다. #if OFFICEVER == 16 #import "C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\mso.dll" rename("ColorFormat", "ColorFormatEx"),rename_namespace("Office") #import "C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\VBE6EXT.olb" rename_namespace("VBE6") #import "C:\Program Files (x86)\Microsoft Office\root\Office16\MSWORD.olb" rename("ExitWindows","ExitWindowsEx"),rename_namespace("MSWord") #import "C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" rename("RGB","RGBEx"),rename("DialogBox","DialogBoxEx"),rename_namespace("MSExcel") #import "C:\Program Files (x86)\Microsoft Office\root\Office16\MSPPT.OLB" named_guids,rename_namespace("MSPPT") #else // ...[생략]... #endif </pre> <br /> 변경한 소스 코드는 다음의 github에 올려 두었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > DotNetSamples/Cpp/dsoframer_v2.2.1.2 ; <a target='tab' href='https://github.com/stjeong/DotNetSamples/tree/master/Cpp/dsoframer_v2.2.1.2'>https://github.com/stjeong/DotNetSamples/tree/master/Cpp/dsoframer_v2.2.1.2</a> </pre> <br /> 하는 김에, 예제 코드도 새롭게 reg-free를 적용해,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Registry 등록 과정 없이 COM 개체 사용 - 두 번째 이야기 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1167'>http://www.sysnet.pe.kr/2/0/1167</a> </pre> <br /> ocx를 regsvr32.exe로 등록 없이 사용할 수 있도록 변경했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > DotNetSamples/WinForms/EmbedExcelSample ; <a target='tab' href='https://github.com/stjeong/DotNetSamples/tree/master/WinForms/EmbedExcelSample'>https://github.com/stjeong/DotNetSamples/tree/master/WinForms/EmbedExcelSample</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, dsoframer.ocx가 보여주는 Excel 화면을 프로그래밍으로 제어하고 싶을 수 있는데요. dsoframer 컨트롤에 보면 SetFieldValue 같은 메서드를 제공하고 있긴 하지만 소스 코드를 보면 그것은 Cell과는 전혀 무관한 동작을 수행하는 것을 볼 수 있습니다. 그럼 어떻게 해야 할까요?<br /> <br /> 간단합니다. dsoframer 컨트롤이 제공하는 ActiveDocument를 dynamic 변수로 받아 VBA 스크립트에서 사용하던 식으로 접근하면 됩니다. 예를 들어, 다음의 소스 코드는 A1, A2 셀에 대해 "test"라는 문자열을 설정합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private void Button1_Click(object sender, EventArgs e) { dynamic doc = this.axFramerControl1.ActiveDocument; doc.ActiveSheet.Range("A1:A2").Cells.value = "test"; } </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1169
(왼쪽의 숫자를 입력해야 합니다.)