MFC에서 리플렉션 기능 구현 시 문자열만으로 클래스 생성하는 방법에 대해서 질문 드립니다.

renboy의 이미지

안녕하세요.

이거 하나 때문에 3주째 해결을 못하고 있어서 이렇게 질문을 드립니다.ㅠㅠ

제가 현재 구현하고자 하는 기능입니다.

2가지 통신 방법에 대해서 사용자가 선택할 수 있게끔 Com1 class, Com2 class를 만들었습니다.
두개 모두 동일하게 Com이라는 클래스로부터 상속을 받았구요.

어떤 통신 방법을 사용할지는 XML에 저장되어있습니다.
그리고 XML을 읽어들여 XML 노드의 이름이 Com1 이라고하면 Com1 클래스의 객체를 생성하고
XML 노드의 이름이 Com2이라고 하면 Com2 클래스의 객체를 생성하고자 합니다.

즉, 둘 중 하나만 선택이 되며 Com1 이 될지 Com2가 될지 모르기 때문에 CRuntime Class를 사용하려고 한 것입니다.

우선 Com1, Com2 클래스에는 DECLARE_DYNCREATE를 이용하였고
메인에서
CRuntimeClass* pRuntime = RUNTIME_CLASS(Com1);
Com* pCom = (Com*)pRuntime->CreateObject();

이렇게 해주니 객체가 생성이 되더라구요.

그런데 제가 필요한건 단순히 문자열 "Com1", "Com2"를 이용해서만 객체를 생성하려고 하는데
CreateObject 함수에 문자열 "Com1"을 넣어줘도 정상적으로 객체가 생기질 않습니다.

많은 예제를 보아도 문자열로 CreateObject("Com1") / CreateObject("Com2") 이렇게 사용한 예제는
하나도 없고 전부 RUNTIME_CLASS(Com1) / RUNTIME_CLASS(Com2) 이런식으로 하드코딩으로 입력하게끔
되어있습니다.

애초에 리플렉션이 어떤 클래스가 생길지 모르기 때문에 동적으로 생성하기 위한 기능으로 알고 있는데
하드 코딩으로 RUNTIME_CLASS(Com1) 이런식으로 코드에 입력할거면 if문이나 다른 방법으로 쓰지 애써
리플렉션 기능으로 왜 쓰는건지 이해가 되질 않습니다.

정리하자면

- 클래스명을 문자열로 알고 있다.
- 클래스명을 가지고 CRuntime class를 이용해서 객체를 생성하려 한다.

입니다.

바쁘신 와중에 수고스럽겠지만 제발 자그마한 도움이라도 부탁드리겠습니다.

일정이 있어서 더 이상 지체할수가 없는 상황이라 간곡히 부탁드립니다.

긴 글 읽어주셔서 너무나 감사드립니다.

감사합니다.!!

 의 이미지

혹시 레퍼런스는 찾아보셨나요?

https://msdn.microsoft.com/en-us/library/cyfc5et8.aspx#cruntimeclass__fromname

CRuntimeClass::FromName라는 메서드가 있는 듯하군요.

renboy의 이미지

답변 감사드립니다.

네 예전에 찾아보고 CRuntimeClass* pClass = CRuntimeClass::FromName("Com1");
이렇게 했었는데요...

pClass에는 null 값으로 들어와집니다.

이게 뭔가 미리 어딘가에 클래스를 등록을 해줘야하나싶기도 한데...

문자열만으로 해결하는건 도저히 되질 않네요 ㅠㅠ

 의 이미지

혹시 몰라서 여쭤봅니다만,
Com1 및 Com2가 CObject를 상속받고 있나요?
그리고 클래스 구현에는 IMPLEMENT_DYNCREATE를 사용하셨나요?

https://msdn.microsoft.com/ko-kr/library/56302tyt.aspx

레퍼런스에서 요구하는 조건을 모두 만족하셨는지 점검하실 필요가 있어 보입니다.

shint의 이미지

두가지를 아래 사이트에서 모두 검색해 봅니다.
운이 좋으면. 원하시는 예제를 찾으실 수 도 있습니다.
CRuntimeClass
RUNTIME_CLASS()

MSDN 과 책에서 함수 인자값. 리턴값. 오류값. 등을 확인해봅니다.
실행 잘되는. 책과 SDK 예제소스를 참고해봅니다.

혼자 어려우시면. 동아리. 블로그. 학원. 직업학교. 대학교. 창업보육센터. 인터넷 강의. 등을 참고해봅니다.
여럿이 같이 공부하시면. 좀 더 편할겁니다.
컴퓨터와 인터넷 좋은거로 사용하시면 좋습니다.
기술 지원을 받으실 수 있다면 더 좋을겁니다.

데브피아 VC 마을. Q/A. 자료실. 질문 답변
http://www.devpia.com/VC++.MAEUL

구글
https://www.google.co.kr

네이버
http://se.naver.com

코드 프로젝트 : MFC 예제
https://www.codeproject.com/

코드 구루 : VC 예제
http://www.codeguru.com/

네이버 책 : VC MFC .Net 검색
http://book.naver.com/

강컴 : VC MFC .Net 검색
http://www.kangcom.com

WinAPI
http://soen.kr/

팁 소프트
http://tipssoft.com/

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.