GSI

소스 코드 :


Http를 통해서 해당 파일을 다운로드 받는 클래스 입니다.

// 접속
if (HttpOpenURL ("http://localhost/Azitro.cab")) {
    OutputDebugString ("HTTP open error.\n");
    ... 기타 작업 ....
    PostQuitMessage (0);
    return;
}

// 다운로드
if (PushDownloadObj (szFileName, NULL, NULL, 0, 0) == false) {
   ... 기타 작업 ...
   PostQuitMessage (0);
   return;
}

이후에 다운로드 진행사항이 보여지는 다이얼로그를 표시 하고 실제 파일을 다운로드 받고 cab 파일을 풀어서 설치 하는 과정까지 짝 있는데요 아무래도 좀더 파악하고 올려야 할듯 합니다. 제대로 데모를 하나 만들어서 ^^
필요하신분은 요청해 주세요 ^^.

Posted by gsi
:

윈도우 찾아서 종료 시키기

인스톨 프로그램과 비슷한 경우를 보면 해당 실행파일을 업데이트 할 경우가 생기게 되는데 이때 실행 파일을 종료 하고 새로운 파일을 추가한 후에 다시 실행시켜야 하는 경우가 발생 한다.

그래서 화면에 떠 있는 응용 프로그램의 타이틀이나 클래스를 검색 해서 프로세스 아이디를 얻은 다음에 프로세스를 종료 시켜야 한다.

프로그램을 실행하고 Spy++로 보게 되면 아래와 같이 보이게 됩니다.

사용자 삽입 이미지




여기서 나오는 "TestRemoteClose" 와 "#32770" 두개를 접근해서 프로세스를 처리할 수 있습니다.

아래의 함수는 os에서 현재 돌아가고 있는 각종 윈도우를 순회 하면서 내가 원하는 윈도우를 찾아 주는 코드 입니다.

BOOL CALLBACK SearchWindowProc (HWND hWnd, LPARAM lParam)
{
 char szClassName[1024]={0,}, szTitle[1024]={0,};
 char *pTitle = "TestRemoteClose", *pTitle2 = "TestRemoteClose";
 char *pDest = NULL, *pDest2 = NULL;

 GetClassName (hWnd, szClassName, sizeof(szClassName));
 GetWindowText (hWnd, szTitle, sizeof(szTitle));

#ifdef _DEBUG
 char szBuf[2048];
 wsprintf (szBuf, "Title: [%s],\tClass: [%s]\n", szTitle, szClassName);
 OutputDebugString (szBuf);
#endif

 pDest = strstr (szTitle, pTitle);
 pDest2 = strstr (szTitle, pTitle2);

 // Title 의 값에서 pTitle, pTitle2의 값을 검사해서 NULL인지를 검사한다.
 // 즉, NULL 이 아니면 해당 윈도우라고 판단한다.
 if (pDest != NULL || pDest2 != NULL) {

  //if (!strcmp (szClassName, "IEFrame")) // 웹일 경우 IEFrame로 되어 있다.
  {

   if (bIsMsgBox == false) {
    bIsMsgBox = true;
    MessageBox (NULL, "정상적인 설치를 위하여 잠시 종료합니다.", "설치 정보", MB_ICONINFORMATION);
   }

   DWORD dwProcessId = 0;
   GetWindowThreadProcessId (hWnd, &dwProcessId);

   if (dwProcessId)
    UserTerminateProcessId (dwProcessId);
  }
 }

 return TRUE;
}

// 메인쪽에서 아래 함수를 호출하면서 순회 하게 된다.
EnumWindows (SearchWindowProc, NULL);

더 자세한 내용이나 수정해야될 부분이 있다면 코멘트 부탁 드립니다.

Posted by gsi
:

어플리케이션이 실행될 OS의 타입과 빌드 번호 등을 알아 오는 데모

사용자 삽입 이미지

OSVersionChk 소스 코드 :

Posted by gsi
:

상태바를 추가 해서 툴을 적용할때 각종 정보들을 출력할 수 있습니다.

1. 리소스 기호를 추가 합니다.

사용자 삽입 이미지
2. String Table 에 추가 합니다.
사용자 삽입 이미지

3. 해당 내용을 추가 합니다.

static UINT indicators[] =
{
// ID_SEPARATOR,           // 상태 줄 표시기
 ID_INDICATOR_INFO0,      // 추가한 상태바
 ID_INDICATOR_INFO1,      // 추가한 상태바
 ID_INDICATOR_INFO2,      // 추가한 상태바
 ID_INDICATOR_INFO3,      // 추가한 상태바
 ID_INDICATOR_CAPS,
 ID_INDICATOR_NUM,
 ID_INDICATOR_SCRL,
};

4. 메인 프레임 사이즈 조정시 상태바의 크기도 조절 되도록 한다.

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
 CFrameWnd::OnSize(nType, cx, cy);

 if(m_wndStatusBar.m_hWnd != NULL)
 {
  int width = cy - 90;

  m_wndStatusBar.SetPaneInfo(0, ID_INDICATOR_INFO0, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(1, ID_INDICATOR_INFO1, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(2, ID_INDICATOR_INFO2, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(3, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(4, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, 30);
  m_wndStatusBar.SetPaneInfo(5, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, 30);
  m_wndStatusBar.SetPaneInfo(6, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, 30);
 }
}

5. 문자열을 바꿀때는 SetPaneText()를 사용한다.

m_wndStatusBar.SetPaneText(0, str0);  // 0은 인덱스, str0은 문자열

Posted by gsi
:

stl을 사용해서 문자열의 토큰을 처리 하는 클래스 입니다.
물론 펌 입니다.
출처 : http://blog.naver.com/inobae?Redirect=Log&logNo=90025826561

사용법은 아래와 같아요.

1. 파싱할 sample.txt 파일

슈퍼맨, 2000, 23.5
홍길동, 3000, 45,6

2. 같은 형태의 포멧을 가진 txt 파일이 있을때
    아래와 같이 우선 파일을 로드 합니다.

ifstream file;
file.open("sample.txt");

3. 해당 파일을 한줄 단위로 읽습니다.
   그리고 나서 StringToKenizer 클래스를 사용해서 파싱합니다.

char buf[1024];
while(!file.eof())   // 다 읽었다면 빠져 나간다.
{
  // 한줄당 읽어 들입니다.
  file.getline(buf, 1024);

  // 토큰 분리
  StringTokenizer st = StringTokenizer(buf, ",");

  // 파싱된 문자열을 해당 값에 따라서 저장하면 됩니다.
  string name = st.NextToken();
  double value0 = atof(st.NextToken().c_str());
  double value1 = atof(st.nextToken().c_str());
}
Posted by gsi
:

13가지 주의 사항: Visual C++ .NET 프로그램을 Visual Studio 2005로 이식하기 전에 알아야 할 13가지 내용


Stanley B. Lippman

Microsoft Corporation


적용 대상:

   Microsoft Visual C++ .NET

   Microsoft Visual C++ 2005

   Microsoft Visual Studio 2005

   Microsoft Visual Studio .NET


요약: 개발자가 응용 프로그램을 Microsoft Visual Studio 2005로 이식할 때 주의해야 할 내용에 대해 Stan Lippman이 소개합니다.



Posted by gsi
:

해당 블로그 : http://blog.naver.com/kellio?Redirect=Log&logNo=45119872
감사 ^^


/*******************************
*  BSTR 변수에 스트링 넣기
*******************************/

BSTR  bstrTemp;
wchar_t tchar[] = L"hello world";
bstrTemp = SysAllocString(tchar);
SysFreeString(bstrTemp);
 
 // HRESULT Tempfunc(BSTR bstrArg);
Tempfunc(bstrTemp);


// BSTR의 길이 구하기

SysStringLen(bstrTemp) 함수를 이용한다~

/*****************************
* LPCTSTR to BSTR
*****************************/

LPCTSTR lpStr= _T("hello world");

BSTR bstrStr;
bstrStr = ((CString)lpStr).AllocSysString();

/*****************************
* BSTR to CString
*****************************/

CString bstrToCString(BSTR bstr)
{
   char* pbstr;
   USES_CONVERSION;  //convert를 위한 매크로
   pbstr=OLE2A(bstr);     //bstr을 char로 convert
   return CString(pbstr);
}

/*****************************
* _bstr_t to CComBSTR
*****************************/

_bstr_t bstrStr(_T("This is the test String!"));
CComBSTR bstrComStr;
bstrComStr.AppendBSTR(bstrStr);
ShowBSTR(bstrComStr);

BSTR CStringTobstr(CString str)
{
    return str.AllocSysString();    //CString을 bstr로 convert
}

[bstr-> char*]

BSTR inputdata;
char *pbstr;
pbstr=OLE2A(inputdata);

[char* -> bstr]

TCHAR szTitle[ 512 ];
_bstr_t bstrText = szTitle;
*bstrTitle = bstrText.copy();

/*******************************
* CString to CComVariant
*******************************/

 CComVariant out(str.AllocSysString());  or  CComVariant out(str);

----------- VARIANT 구조체 사용예 ----------

VARIANT vVal;
VariantInit(&vVal); //초기화
vVal.vt = VT_BOOL;
vVal.boolVal = TRUE;

---------- BSTR 사용예 --------------

1) BSTR m_pStr;
m_pStr = L"Hello CodeIn"; // 문자의 개수가 지정되지 않음

2) wchar_t Example[] = L"String";
BSTR m_pStr = SysAllocString(Example); // BSTR 문자열 영역확보

//..

SysFreeString(m_pStr); // BSTR 문자열 영역 해제

Posted by gsi
:

[MFC] 폴더 경로 얻기

C++ 2007. 12. 12. 14:23 |

사용자 삽입 이미지

 ITEMIDLIST      *pidlBrowse;
 char                  pszPathname[MAX_PATH];

 BROWSEINFO     BrInfo;

 BrInfo.hwndOwner = GetSafeHwnd();
 BrInfo.pidlRoot = NULL;

 memset( &BrInfo, 0, sizeof(BrInfo) );
 BrInfo.pszDisplayName = pszPathname;
 BrInfo.lpszTitle = "선택하고자 하는 폴더를 선택해 주십시오.";
 BrInfo.ulFlags = BIF_RETURNONLYFSDIRS;

 // 다이얼로그 띄우기
 pidlBrowse = SHBrowseForFolder(&BrInfo); 

 if( pidlBrowse != NULL)
 {
  // 패스를 얻어옴
  BOOL bSuccess = ::SHGetPathFromIDList(pidlBrowse, pszPathname);

  if ( bSuccess )
  {
   m_szSafedefaultPath = pszPathname;   //<-- 여기서 값을 입력
   UpdateData(FALSE);
  }
  else
  {
   MessageBox("잘못된 폴더명입니다.", "lol", MB_OKCANCEL|MB_ICONASTERISK );
  }
 }

Posted by gsi
:

 //저장파일의 파일명을 찾아낸다.
 //확장자 분리 모듈
 TCHAR szDir[_MAX_DIR];
 TCHAR szDrive[_MAX_DRIVE];
 TCHAR szFileName[200] ;
 TCHAR szFileExt[20] ;
 _tsplitpath(saveFile, szDrive, szDir,szFileName, szFileExt);

 // etc
 //aze 파일 확장자를 소문자로 바꾸는 코드
 CString fileName;
 CString fileExt;
 fileExt.Format("%s", szFileExt);
 fileExt.MakeLower();
 fileName.Format("%s%s%s%s", szDrive, szDir, szFileName, fileExt);

szFile = strrchr( *pFullPath, '\\' ) + 1;
이건 뒤에 있는 파일이름+확장자 를 뽑아 주는 함수.
Posted by gsi
:

Dll 프로젝트를 하나 만들고 xml을 읽는 테스트를 진행해 봤다.
아래의 xml 파일을 읽는 테스트...

<?xml version="1.0" encoding="euc-kr" ?>

<Symbols>
  <Scanorders>
    <order Name="default">
      <!--false이면 지그재그-->
      <lineartype>true</lineartype>
      <!--두개씩 쌍을 이룬다.
          처음 두개는 진행방향 from > to 이고,
          뒤에 두개는 흐름방향 이다.-->
      <left>-1</left>
      <right>-1</right>
      <top>-1</top>
      <bottom>-1</bottom>
    </order>
  </Scanorders>
 
  <!--DefaultSymbol은 true이면 line이고, false이면 rectangle 이다.-->
  <Symbol Name="none" Uid="0" Type="line" DefaultSymbol="true">
    <HorizontalPixels>1</HorizontalPixels>
    <VerticalPixels>11</VerticalPixels>
    <SymbolWidth>12</SymbolWidth>
    <SymbolHeight>13</SymbolHeight>
    <ScanOrder>14</ScanOrder>
    <TotalPixels>15</TotalPixels>
    <TotalWidth>16</TotalWidth>
    <TotalHeight>17</TotalHeight>
    <Length>18</Length>
    <Color>
      <r>128</r>
      <g>129</g>
      <b>130</b>
    </Color>
  </Symbol>
  <Symbol Name="none" Uid="0" Type="line" DefaultSymbol="true">
<!--    <HorizontalPixels>1</HorizontalPixels> -->
    <VerticalPixels>2</VerticalPixels>
    <SymbolWidth>2</SymbolWidth>
    <SymbolHeight>2</SymbolHeight>
    <ScanOrder>2</ScanOrder>
    <TotalPixels>2</TotalPixels>
    <TotalWidth>2</TotalWidth>
    <TotalHeight>2</TotalHeight>
    <Length>2</Length>
    <Color>
      <r>80</r>
      <g>81</g>
      <b>82</b>
    </Color>
  </Symbol>
  <Symbol Name="none" Uid="0" Type="line" DefaultSymbol="true">
    <HorizontalPixels>3</HorizontalPixels>
    <VerticalPixels>3</VerticalPixels>
    <SymbolWidth>3</SymbolWidth>
    <SymbolHeight>3</SymbolHeight>
    <ScanOrder>3</ScanOrder>
    <TotalPixels>3</TotalPixels>
    <TotalWidth>3</TotalWidth>
    <TotalHeight>3</TotalHeight>
    <Length>3</Length>
    <Color>
      <r>150</r>
      <g>151</g>
      <b>152</b>
    </Color>
  </Symbol>
</Symbols>



C++ 에서 테스트할때..

    TRACE("--- xml start ---\n");
    if(m_TestXmlWrap2.Load("d:\\symbol.xml")) {
     // 정상적으로 읽었다면 여기로..
     
     HRESULT hr;
     MSXML2::IXMLDOMDocument2Ptr  pDoc;
     MSXML2::IXMLDOMNodeListPtr  pNodeList;
     MSXML2::IXMLDOMNodePtr   pNodeSub;
     MSXML2::IXMLDOMNodeListPtr  pNodeSubList;
     MSXML2::IXMLDOMNodePtr   pNodeSubSub;
     MSXML2::IXMLDOMNodePtr   pNodeSubSubSub;
     MSXML2::IXMLDOMElementPtr  pNodeSubElement;
     BSTR bszNodeValue;

     TRACE("--- xml start ---\n");
     if(m_TestXmlWrap2.GetDoc()) {
      pNodeList = m_TestXmlWrap2.GetDoc()->selectNodes(".//Symbol");
      for(int i = 0; i < pNodeList->length; i++) {
       pNodeSub = pNodeList->Getitem(i);

       // 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
       pNodeSubSub = pNodeSub->selectSingleNode(".//HorizontalPixels");
       string value = "none";
       if(pNodeSubSub)
        value = (LPCTSTR)pNodeSubSub->Gettext();
       TRACE1("Symbol/HorizontalPixels=%s\n", value.c_str());
      }
     }
     TRACE("--- xml end ---\n");

     TRACE("--- xml start ---\n");
     if(m_TestXmlWrap2.GetDoc()) {
      pNodeList = m_TestXmlWrap2.GetDoc()->selectNodes(".//Symbol");
      for(int i = 0; i < pNodeList->length; i++) {
       pNodeSub = pNodeList->Getitem(i);

       pNodeSubList = pNodeSub->selectNodes(".//Color");
       for(int i = 0; i < pNodeSubList->length; i++) {
        pNodeSubSub = pNodeSubList->Getitem(i);

        string value;
        // 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
        pNodeSubSubSub = pNodeSubSub->selectSingleNode(".//r");
        value = "none";
        if(pNodeSubSubSub)
         value = (LPCTSTR)pNodeSubSubSub->Gettext();
        TRACE1("Symbol/Color/r=%s\n", value.c_str());

        // 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
        pNodeSubSubSub = pNodeSubSub->selectSingleNode(".//g");
        value = "none";
        if(pNodeSubSubSub)
         value = (LPCTSTR)pNodeSubSubSub->Gettext();
        TRACE1("Symbol/Color/g=%s\n", value.c_str());

        // 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
        pNodeSubSubSub = pNodeSubSub->selectSingleNode(".//b");
        value = "none";
        if(pNodeSubSubSub)
         value = (LPCTSTR)pNodeSubSubSub->Gettext();
        TRACE1("Symbol/Color/b=%s\n", value.c_str());
       }
      }
     }
     TRACE("--- xml end ---\n");

      // 저장
      m_TestXmlWrap2.Save(_T("d:\\save_test.xml"));
    }

Dll 코드 :


Posted by gsi
:

// 프로젝트 생성
MFC Extension DLL 을 체크 하고 생성한다.

// DLL 내부에서 class 생성할때
class AFX_EXT_CLASS CTest : public CDialog
이런 형태로 앞에 AFX_EXT_CLASS 를 추가한다.

// 해당 프로젝트에서 사용할때.
*.h, *.lib를 추가한다.
*.dll을 실행파일과 같은 경로 또는 시스템 폴더에 추가한다.
나머지 사용시에는 일반 클래스와 같이 동작한다.

이건. mfc에서 확장해서 리소스 및 다이얼로그 등등.. 모든 자원을 dll로 뺀 다음에
사용이 가능한듯 보인다.
Posted by gsi
:

기존의 스크롤뷰가 페이지의 크기가 커지면, 많은 문제점이 생기게 됩니다.
좀 불합리성이 보이네욤..
더블 버퍼링도 좀 부피가 커져서 효율이 떨어 지고. 스크롤의 최대 값도 좀 걸리고.
그래서 싱글 뷰에 직접 컨트롤 박아서 처리해봤어요.

사용자 삽입 이미지
위에서 보는 거 처름 CView 에 View, ScrollBar등을 달아서
움직이도록 처리 해봤습니다.

더 보정할건 많지만. 기초 프로토타입으로는 좋은거 같네요..

앞으로 여기에 마우스로 컨트롤 추가 하고 타임 라인 비슷한 화면을 구성해 볼려고 합니다.
잘 되면 좋겠네요 ^^.

관련코드 :
Posted by gsi
:

XML 처리방법

C++ 2007. 12. 6. 12:53 |

XML 데이터 처리 하는 방법 정리.
파일 읽기, http 정보 읽기, 노드 정보 출력, 노드 검색 정보 출력


1. XML 파일 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}
AfxMessageBox(pDoc->xml);

2. http을 통한 XML 파일 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

DWORD startTick = GetTickCount();
pDoc->put_async(VARIANT_FALSE);
HRESULT hr = pDoc->load((_variant_t)"http://localhost/TestXml/test2.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}
AfxMessageBox(pDoc->xml);

3. XML 데이터의 첫번째 해당 노드값 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}

MSXML2::IXMLDOMNodePtr pNode;
pNode = pDoc->selectSingleNode(L"//name");

CString outString;
outString.Format("[검색결과] 노드명:%s, 노드값:%s\r\n", (LPCTSTR)pNode->GetnodeName(), (LPCTSTR)pNode->Gettext());
AfxMessageBox(outString);

4. XML 데이터의 해당 노드값 모두 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}

MSXML2::IXMLDOMNodeListPtr pNodeList;
pNodeList = pDoc->selectNodes(L"//name");

CString outTotalString;
for(int i = 0; i < pNodeList->length; i++) {
 CString outString;
 outString.Format("[검색결과] 노드명:%s, 노드값:%s\r\n",
  (LPCTSTR)pNodeList->Getitem(i)->GetnodeName(),
  (LPCTSTR)pNodeList->Getitem(i)->Gettext());
 outTotalString.Append(outString);
}
AfxMessageBox(outTotalString);

나머지 노드값 변경하는 방법,
속성값 읽어 오기 및 변경 방법 등을 정리 해야 함.

테스트 소스 :

Posted by gsi
:

설정방법 :
1. MSXML 4.0을 설치한다.

2. VC++ 디렉토리  설정부분에서 include, lib를 설정해 준다.

3. MFC Dialog로 프로젝트 생성시 "자동화" 를 체크 해준다.
   3.1. 아마도 이런 코드가 더 추가되는거 같다. 다른 코드가 더 있는지는 잘 모르겠다.
// 이 매크로는 COleObjectFactory 생성자에 대한 bMultiInstance 매개 변수에 TRUE를
// 전달하는 점만 제외하면 IMPLEMENT_OLECREATE와 같습니다.
// 자동화 컨트롤러에서 요청한 각 자동화 프록시 개체에 대해 이 응용 프로그램에 대한 별도의 인스턴스가 시작되도록 합니다.
#ifndef IMPLEMENT_OLECREATE2
#define IMPLEMENT_OLECREATE2(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
 AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \
  RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \
 const AFX_DATADEF GUID class_name::guid = \
  { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } };
#endif // IMPLEMENT_OLECREATE2

4. stdafx.h 파일에 아래의 코드를 추가한다.
#import <msxml4.dll>
using namespace MSXML2;

5. 테스트로 OK 버튼에 아래와 같은 내용을 추가 해서 테스트를 진행한다.
void CReadXML2Dlg::OnBnClickedOk()
{
 MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
 MSXML2::IXMLDOMProcessingInstructionPtr pPI; // XML ProcessingInstruction 선언
 MSXML2::IXMLDOMElementPtr pRootElement; // XML Element 선언
 MSXML2::IXMLDOMElementPtr pElement;
 MSXML2::IXMLDOMTextPtr pText; // XML Text 선언
 pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성
 pPI=pDoc->createProcessingInstruction(L"xml",L"version=\"1.0\" encoding=\"euc-kr\""); // PI 생성
 pRootElement=pDoc->createElement(L"IRC"); // Root element 생성
 pElement=pDoc->createElement(L"Nick"); // "Nick" element 생성
 pText=pDoc->createTextNode(L"wiluby"); // "wiluby" text element 생성
 pDoc->appendChild(pPI); // ProcessingIsntruction 추가
 pElement->appendChild(pText); // text element를 "Nick" element에 추가
 pRootElement->appendChild(pElement); // "Nick" element를 root element에 추가
 pDoc->appendChild(pRootElement); // Root element를 문서에 추가
 AfxMessageBox(pDoc->xml); // XML 내용을 보자!!
 //
 OnOK();
}

그럼 아래와 같은 내용의 대화 상자가 나오게 된다.

사용자 삽입 이미지

그리고 제 환경이 그러서인지는 모르겠다. 2008을 깔고, .net 3.5를 다 깐 상태라서 MSXML 6.0이라는 폴더가 만들어져 있는 상태이다.

그래서 위의 코드 처름 스마트 포인터 형태의 IXMLDOMProcessingInstructionPtr  이런 변수들을 그냥 사용하면 아래와 같은 내용의 에러가 나오게 된다.

d:\temp\ReadXML2\ReadXML2\ReadXML2Dlg.cpp(205) : error C2872: 'IXMLDOMProcessingInstructionPtr' : 모호한 기호입니다.
        'c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\comdefsp.h(1261) : _com_ptr_t<_IIID> IXMLDOMProcessingInstructionPtr'일 수 있습니다.
        with
        [
            _IIID=_com_IIID<IXMLDOMProcessingInstruction,& _GUID_2933bf89_7b36_11d2_b20e_00c04f983e60>
        ]
        또는       'd:\temp\ReadXML2\ReadXML2\Debug\msxml4.tlh(298) : MSXML2::IXMLDOMProcessingInstructionPtr'일 수 있습니다.

아무래도 네임 스페이스 쪽의 충돌인지 선언이 안되어서 그런지는 잘 모르겠다.
하지만 위의 코드 처름 MSXML2:: 를 붙여 주면 해결이 된다.

이상.
 

Posted by gsi
:

MSXML 설치파일

C++ 2007. 12. 6. 09:18 |

xml을 읽기 위해서 필요한 데이터 파일

설치파일 :


Posted by gsi
: