http://support.microsoft.com/kb/330184/ko

컴퓨터를 시작할 때 "잘못된 Boot.ini" 또는 "Windows를 시작할 수 없습니다." 오류 메시지가 나타난다

기술 자료 ID : 330184
마지막 검토 : 2007년 3월 20일 화요일
수정 : 2.0

현상

Microsoft Windows XP로 업그레이드한 후 컴퓨터를 시작하면 다음과 같은 오류 메시지 중 하나 또는 모두가 나타날 수 있습니다.
잘못된 Boot.ini
다음 파일이 없거나 손상되어 Windows를 시작할 수 없습니다:

Windows\System32\Hal.dll

원인

Boot.ini 파일이 없거나, 손상되었거나, 잘못된 항목을 포함하는 경우 이 문제가 발생할 수 있습니다.

해결 방법

이 문제를 해결하려면 Windows XP CD에서 컴퓨터를 시작하고 복구 콘솔을 시작한 다음 Bootcfg.exe 도구를 사용하여 Boot.ini 파일을 다시 작성해야 합니다. 이렇게 하려면 다음과 같이 하십시오.
1. 컴퓨터를 CD-ROM 또는 DVD-ROM 드라이브에서 시작하도록 구성합니다. 이렇게 하는 방법에 대한 자세한 내용은 컴퓨터 설명서를 참조하거나 컴퓨터 제조업체에 문의하십시오.
2. Windows XP CD-ROM을 CD-ROM 또는 DVD-ROM 드라이브에 넣은 다음 컴퓨터를 다시 시작합니다.
3. "Press any key to boot from CD" 메시지가 나타나면 아무 키나 눌러 Windows XP CD-ROM에서 컴퓨터를 시작합니다.
4. "설치 프로그램을 시작합니다" 메시지가 나타나면 R 키를 눌러 복구 콘솔을 시작합니다.
5. 이중 부팅이나 다중 부팅 컴퓨터에서는 복구 콘솔에서 사용해야 하는 설치를 선택합니다.
6. 관리자 암호를 입력하라는 메시지가 나타나면 입력한 다음 Enter 키를 누릅니다.
7. 명령 프롬프트에서 bootcfg /list를 입력한 다음 Enter 키를 누릅니다. 현재 Boot.ini 파일의 항목이 화면에 나타납니다.
8. 명령 프롬프트에서 bootcfg /rebuild를 입력한 다음 Enter 키를 누릅니다. 이 명령은 Windows XP, Microsoft Windows 2000 또는 Microsoft Windows NT 설치를 위해 컴퓨터의 하드 디스크를 검사한 다음 결과를 표시합니다. 화면에 나타나는 지시에 따라 Boot.ini 파일에 Windows 설치를 추가합니다. 예를 들어, Boot.ini 파일에 Windows 설치를 추가하려면 다음과 같이 하십시오.
a. 다음과 유사한 메시지가 나타나면 Y를 누릅니다.
확인된 전체 Windows 설치: 1

[1] C:\Windows
부팅 목록에 설치를 추가하시겠습니까? (Y/N/A)
b. 다음과 유사한 메시지가 나타납니다.
로드 ID 입력
이것은 운영 체제의 이름입니다. 이 메시지가 나타나면 운영 체제의 이름을 입력한 다음 Enter 키를 누릅니다. 이것은 Microsoft Windows XP Professional 또는 Microsoft Windows XP Home Edition입니다.
c. 다음과 유사한 메시지가 나타납니다.
OS 로드 옵션 입력
이 메시지가 나타나면 /fastdetect를 입력한 다음 Enter 키를 누릅니다.

참고 화면에 나타나는 지시는 컴퓨터의 구성에 따라 다를 수 있습니다.
9. exit를 입력한 다음 Enter 키를 눌러 복구 콘솔을 닫습니다. 컴퓨터가 시작되고 "시작할 운영 체제를 선택하십시오" 메시지가 나타날 때 업데이트된 부팅 목록이 표시됩니다.

추가 정보

Bootcfg.exe 도구에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
291980 (http://support.microsoft.com/kb/291980/) Bootcfg 명령과 그 용도에 대한 설명
복구 콘솔에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
289022 (http://support.microsoft.com/kb/289022/) Windows XP에서 Boot.ini 파일을 편집하는 방법
307654 (http://support.microsoft.com/kb/307654/) HOWTO: Windows XP에서 복구 콘솔 설치 및 사용




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft Windows XP Professional
Microsoft Windows XP Home Edition
키워드: 
kberrmsg kbenv kbprb KB330184

'1.소프트웨어 이야기 > 09.ETC' 카테고리의 다른 글

Unmountable_Boot_Volume 에러시 복구 방법  (0) 2009.02.01
프로그래밍 격언 모음..  (0) 2008.03.05
RGB 색상표  (0) 2008.02.12
Open Dialog나 Save Dialog 사용시 보통 실행 시키면 화면 중앙에 위치하게 된다.

그런데, 원하는 특정 위치로 보내야할때가 있다..

이럴때는 해당 다이얼로그의 OnFolderChange의 이벤트에 다음과 같이 작성한다.
 
요약: When trying to creating a simple C++ designtime package that might refer to ‘DesignIntf’,’DesignEditors, the Delphi compiler complains that 'DesignIntf.dcu' and 'Proxies.dcu'cannot be found.

When trying to compile a C++ package that refers to DesignIntf, DesignEditors in say, a pascal unit you might see errors as follows:

[DCC Error] XXXX.pas(X): F1026 File not found: 'DesignIntf.dcu'


Or if you add the DesignEditors.pas location to the project’s "search path", the error is:

[DCC Error] DesignEditors.pas(609): F1026 File not found:'Proxies.dcu'

This issue is documented in readme for BDS2006. This is the note from BDS 2006's readme file:

 

C++ Notes
If you are creating a C++ Package that contains a Delphi unit thatuses the DesignIntf and DesignEditors tools, you must choose Project|Options|Pascal Compiler|Other Options and then add
"-LUDesignIDE" for the compiler to work correctly.

So in CB2007/RAD Studio 2007, all you need to do is:

Project|Options|Pascal Compiler|Other Options|"Use these packages when
compiling", then add "DesignIDE" in the combobox. 

Author: Roy Nelson


// 한번에 하는 방법은 ForceDirectories 함수를 이용하면 된다..

함수 설명은 아래와 같다..  반환값은 실패 성공 뿐이니까.. 실패 성공만 처리하면된다..
굳이 디렉토리가 존재하는지 확인 할 필요도 없다.
있으면 그냥 넘어가고 없으면 생성하게 된다.

ex) ForceDirectories("C:\\IT\\LOG");

Creates a new directory, including the creation of parent directories as needed.

Pascal
function ForceDirectories(const Dir: string): Boolean;
C++
Boolean ForceDirectories(string Dirconst);

FileCtrl

ForceDirectories creates a new directory as specified in Dir, which must be a fully-qualified path name. If the directories given in the path do not yet exist, ForceDirectories attempts to create them. 

ForceDirectories returns true if it successfully creates all necessary directories, false if it could not create a needed directory.

Warning: 
Important:Do not call ForceDirectories with an empty string. Doing so causes ForceDirectories to raise an exception.  
Note: 
The FileCtrl unit (Windows only) also contains a ForceDirectories function. However, the FileCtrl version is deprecated, and the SysUtils version preferred, even if the code does not need to be cross-platform.  

 


출처 : Tong - navy9370님의 MFC통

1. DC얻기
  CClientDC dc(this);

2. Client 영역 구하기

  GetClientRect(&rect);
  WM_SIZE 메시지발생후 cx,cy 사용

3. 문자열 사각형안에 그리기

  pDC->DrawText(문자열,사각형,Style);
  Style: DT_BOTTOM - 문자열을 사각형 맨아래줄에배열 반드시 DT_SINGLELINE과 함께사용
        DT_CENTER - 문자열을 가로중앙에 배치
        DT_VCENTER - 문자열을 세로중앙에 배치
        DT_LEFT,RIGHT - 문자열을 좌,우로 배치
        DT_SINGLELINE - 문자열을 한줄로만 쓴다

4. Brush 사용법
  CBrush brushname(RGB(red,green,blue)); //브러쉬 생성
  CBrush *oldBrush=pDC->SelectObject(&brushname); //이전Brush 저장, 새로운 Brush 선택
  pDC->SelectObject(oldBrush); //원래의 브러쉬로 반환

5. Pen사용법
  CPen pen(Pen Style,RGB(red,green,blue)); //브러쉬생성
//Style: PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_GEOMETRIC,PS_COSMETRIC - 펜종류
        PS_ENDCAP_ROUND,PS_ENDCAP_SQUARE - 펜끝을 둥글게,각지게 설정
  CPen *oldPen=pDC->SelectObject(&pen); //이전Pen저장, 새로운 Pen설정
  pDC->SelectObject(oldPen); //펜반환

6. 화면다시그리기
  View Class에서 - Invalidate(TRUE) : 화면을 지우고다시그린다
                    Invalidate(FALSE) : 화면을 덮어씌운다
  UpdateAllViews(NULL);  // Doc Class에서 View 의 OnDraw 호출
  RedrawWindow();

7. 메시지,함수 수동으로 넣기 (EX)버튼클릭함수넣기
  헤더파일의 AFX_MSG_MAP 부분에 함수를 정의
  EX) afx_msg void funcName();
  .cpp파일의 AFX_MSG 부분에 메시지를 추가한다
  EX) ON_BN_CLICKED(ID_NAME,funcName)...
  ID 등록:  View 메뉴의 Resource Symbol 에 들어가서 메뉴 ID 를 등록해준다..
  .cpp파일의 맨아래에서 함수를 정의한다
  EX) void CClass::funcName() { ... }

8. 마우스커서 바꾸기
  리소스탭에서 커서를 그리고 저장한뒤 ID값은 준다음
  SetCapture(); //커서의입력을 클라이언트영역을 벗어나더라도 받아낸다
  SetCursor(AfxGetApp()->LoadCursor(nIDResource));
  //APP클래스의 LoadCursor View의 SetCursor 사용
  ReleaseCapture(); //SetCursor()상태를 해제한다

9. 색상표 사용하기
  CColorDialog dlg;
  if(dlg.DoModal()==IDOK) //Dialog 를 띄운후 OK버튼을누르면 실행할부분
  MemberFunc: GetColor() //선택된 색상을 받아온다 return 형은 COLORREF 형

10. 팝업메뉴 만들기
  CMenu menu; //메뉴 객체생성
  CMenu *pmenu; //메뉴 포인터생성
  menu.LoadMenu(IDR_MAINFRAME); //메뉴를 불러온다
  pmenu=menu.GetSubMenu(3); //메뉴의 3번째 메뉴를 가져온다
  menu.CheckMenuItem(ID_MENU,m_kind==ID_MENU ? MF_CHECKED : MF_UNCHECKED);
  //메뉴 체크하기 (메뉴 ID, ID 체크조건)
  pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this)  //(TMP_Style,x좌표,y좌표,hWnd) 메뉴 띄우기

  *주의사항*
    [안내]태그제한으로등록되지않습니다-OnContextMenu(CWnd* pWnd, CPoint point)  //여기서 point 는 스크린 기준이고,
    OnRButtonDown(UINT nFlags, CPoint point)  //여기서 point 는 클라이언트 기준이다!


11. 클라이언트 포인터를 스크린 포인터로 변경
  ClientToScreen(&point);

12. 그림판기능

         if(m_flag==FALSE)  return;   //m_falg=그리기 기능 참,거짓설정  그리기 아니면 빠져나간다
        CClientDC dc(this);
        CPen myPen(PS_SOLID,m_width,m_color);
        CPen *pOldPen=dc.SelectObject(&myPen);
        switch(m_shape)
        {
        case ID_FREELINE: //자유선그리기
                dc.MoveTo(m_oldpt.x,m_oldpt.y); //지난포인터부터
                dc.LineTo(point.x,point.y); //새포인터까지 그린다
                break;

        case ID_RECT: //사각형그리기
                dc.SetROP2(R2_NOTXORPEN);
                dc.Rectangle(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y);  //지워지는 효과
                dc.Rectangle(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과
                break;

        case ID_ELLIPSE: //원그리기
                dc.SetROP2(R2_NOTXORPEN);
                dc.Ellipse(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y);  //지워지는 효과
                dc.Ellipse(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과
                break;

        case ID_LINE: //선그리기
                dc.SetROP2(R2_NOTXORPEN);
                dc.MoveTo(m_spt.x,m_spt.y); //시작점부터
                dc.LineTo(m_oldpt.x,m_oldpt.y); //지난점까지 그은선을 지운다
                dc.MoveTo(m_spt.x,m_spt.y); //시작점부터
                dc.LineTo(point.x,point.y); //새로운점까지 그린다
                break;
        }
        m_oldpt=point;  //바로이전값 보관
        dc.SelectObject(pOldPen); //펜 반환

13. MessageBox
  AfxMessageBox() -> 전역함수를 이용하영 메세지 박스를 출력한다.   //어디서든지 사용할수 잇다
  int CWnd::MessageBox("메세지","창제목","아이콘|버튼(상수값)");   //View클래스에서 사용한다
  아이콘 상수값  MB_IC[안내]태그제한으로등록되지않습니다-xxONERROR, MB_ICONWARNING, MB_ICONQUESTION,MB_ICONINFOMATION
                MB_SYSTEMMODAL //시스템모달 대화창 닫기전에 다른작업 못함
                MB_APPLMODAL //응용모달
  버튼 상수값    MB_OK, MB_OKCANCEL, MB_YESNO

14. OS 컨트롤
        ExitWindowEx(EWX_SHUTDOWN,NULL); //Shut Down
        ExitWindowsEx(EWX_FORCE,0); //강제종료
        ExitWindowsEx(EWX_LOGOFF,0); //로그오프
        ExitWindowsEx(EWX_POWEROFF,0); //Shut Down -> Turn Off
        ExitWindowsEx(EWX_REBOOT); //Shut Down -> Reboot

15. DialogBox 메시지 교환
        UpdateData(FALSE); // 컨트롤에 멤버변수의 내용을 표시해준다
        UpdateData(TRUE);  // 컨트롤 내용을 다이얼로그 클래스의 멤버변수로 저장

16. 자료변환

        atoi,itoa - int <=> ASCII(char) 변환
        str.Format(" %d %d",x,y); // int형을 문자열로 변환
        atol,ltoa - ASCII <=> long 변환
        atof - ACSII => float 변환
        fcvt,gcvt  - 실수를 text로 변환
        LPtoDP, DPtoLP - 장치좌표 <=> 논리좌표 변환

17. CEdit Class 사용하기
  CEdit e_str.SetSel(int StartChae, int EndChar); //처음문자부터 마지막까지 블록 지정
  CEdit e_str.GetSel(int SChar,int EChar); //블럭 지정한 처음문자와 마지막문자 받기
  CString str=m_str.Mid(SChar,EChar-SChar); //블럭지정한 부분을 가져온다

18. 컨트롤과 자료교환
  SetDlgItemText(컨트롤 ID,문자열) //컨트롤에 문자열을 넣는다
  GetDlgItemText(컨트롤 ID,문자열) //컨트롤의 내용을 문자열에 넣는다
  GetDlgItem(컨트롤 ID); //컨트롤의 주소를 가져온다

19. 상태바조작
  CMainFrame 생성자 위에
  static UINT indicators[] = //이안에 새로운 ID를 넣고 그 ID의 갱신핸들러를 만든다음 코딩
  pCmdUI->SetText("표시할내용");

20. 수동으로 Bitmap 컨트롤 사용하기

  CStatic bitmap; //bitmap 컨트롤변수
  bitmap.SetBitmap(CBitmap m_bitmap); //컨트롤에 비트맵지정
  GetDlgItem(IDC_BITMAP)->ShowWindow(SW_SHOW,HIDE);  // 그림을 보이거나 숨긴다.   

21. 응용프로그램 실행하기
  WinExec("프로그램경로",SW_SHOW,HIDE); //응용프로그램실행,경로는 \\로 구분한다

22. Bitmap 사용하기

  CBitmap bitmap.LoadBitmap(IDC_BITMAP); //비트맵객체에 비트맵지정
  CDC memDC; //그림그릴 메모리DC생성
  MemDC.CreateCompatibleDC(pDC); //화면 DC와 메모리 DC 호환 생성
  CBitmap *pOldBitmap=MemDC.SelectObject(&m_bitmap); //메모리에 그림을그린다.
  pDC->BitBlt(int x, int y,int Width, int Height, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);
//BitBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림시작x좌표,그림시작y좌표,스타일);
  pDC->StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop )
//StretchBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림x좌표,그림y좌표,메모리그림넓이,메모리그림높이,스타일);
MemDC.SelectObject(pOldBitmap); // 메모리DC반환

23. Font 바꾸기

  CFontDialog dlg; //폰트다이얼로그 생성
  LOGFONT m_logFont; //폰트받을변수선언
  if(dlg.DoModal()==IDOK) //폰트다이얼로그표시
  {dlg.GetCurrentFont(&m_logFont)} //선택된 폰트받기

  OnDraw()
   CFont newFont,*pOldFont; //폰트 객체 만들기
   newFont.CreateFontIndirect(&m_logFont); //폰트 생성
   pOldFont=(CFont *)pDC->SelectObject(&newFont); //폰트 선택

   OnCreate()
   CClientDC dc(this); //DC 생성
   CFont *pFont=dc.GetCurrentFont();        //클라이언트 영역의 폰트를
   pFont->GetLogFont(&m_logFont); //로그폰트 멤버값으로 지정

24. Font 만들기
         LOGFONT logfont; //폰트를 만든다
        logfont.lfHeight=50;               //문자열 높이
        logfont.lfWidth=0;                 //너비
        logfont.lfEscapement=0;            //문자열기울기
        logfont.lfOrientation=0;             //문자개별각도
        logfont.lfWeight=FW_NORMAL;     //굵기
        logfont.lfItalic=TRUE;             //이탤릭
        logfont.lfUnderline=TRUE;  //밑줄
        logfont.lfStrikeOut=FALSE; //취소선
        logfont.lfCharSet=HANGUL_CHARSET; //필수
        logfont.lfOutPrecision=OUT_DEFAULT_PRECIS;              
        logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS;      //가변폭폰트 고정폭폰트
        logfont.lfPitchAndFamily=DEFAULT_PITCH|FF_SWISS; //글꼴이름
        strcpy(logfont.lfFaceName,"궁서체");
        CClientDC dc(this);

        CFont newFont; //폰트객체생성
        newFont.CreateFontIndirect(&logfont); //폰트지정
        CFont *pOldFont=dc.SelectObject(&newFont); //폰트선택
        dc.TextOut(100,100,m_text);
        dc.SelectObject(pOldFont); //폰트반환


25. Font 만들기 2

  CFont newFont;
  newFont.CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );
CFont *pOldFont=dc.SelectObject(&newFont);

26. ComboBox 사용하기

  CComboBox combo; //콤보박스 선언
  combo.Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
  //Style - WS_CHILD|WS_VISIBLE
  int n=combo.GetCurSel(); //선택된 아이템의 index를 가져온다
  combo.AddString("문자열"); //문자열을 추가한다
  combo.GetLBText(n,str); //n번째 아이템을 str에 저장

27. Spin 사용하기
  Spin은 바로앞의 Tab Order에 따라 붙는다
  m_spinr.SetRange(1900,3000); //스핀 범위 지정
  m_spinr.SetPos(m_nYear); //스핀 위치 지정

28. CTime사용하기
  CTime time; //시간객체생성
  time=CTime::GetCurrentTime(); //현재시간을 저장
  time.GetYear(),time.GetMonth();,time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond()

29. CListBox 메소드
  AddString("문자열");             //리스트에 문자열 추가
  DeleteString(index);             //리스트에서 항목 삭제
  GetCount()                     //전체 항목 갯수를 얻는다.
  GetSelcount()                   //선택된 항목 갯수 리턴
  GetSel()                       //선택된 것인지 아닌지를 리턴한다 -> 양수 = TRUE , 음수 => FALSE
  GetText(int index,문자열변수)     //index 번째 문자열을 문자열 변수에 넣는다
  FindStringExact(문자열)          //지정 문자열의 index 값 리턴 -> 없으면 리턴값 LB_ERR 반환
  FindString("a")                 //"a"로 시작하는 항목을 모두 찾는다.
  ResetCountent()                 //모든 내용을 지운다.

30. 파일입출력
프로젝트생성시 Step4 => Advanced => 저장파일확장자지정
.h 파일에       DECLARE_SERIAL(CSawon) //이 클래스를 저장,로드가능한 클래스로 쓰겟다는 선언
.cpp 파일에     IMPLEMENT_SERIAL(CSawon,CObject,1) //이거를 해야 저장이 가능하다
void CFileioDoc::Serialize(CArchive& ar)
        if (ar.IsStoring())  //저장하기
        {        ar<
        else    //열기
        {        ar>>m_shape; //불러올걸 쓴다. 읽을때도순서대로읽어야한다}

31. MicroSoft FlexGrid 사용하기!
        CMSFlexGrid m_Grid; //FlexGrid 컨트롤 변수
        CString strTitle[]={"고객코드","고객성명","고객포인트","신장","몸무게","고객등급","BMT지수","판정결과"};
        // Grid 의 제목에 넣을문자배열
        int Width[]={900,900,1100,800,800,900,1000,900};
        // Grid 의 열넓이 지정할 배열
        m_Grid.SetRows(m_cnt+2); //전체행수 지정
        m_Grid.SetCols(8); //전체열수 지정
        m_Grid.Clear(); //지우기
        m_Grid.SetFixedCols(0); //고정열은 없다.
        m_Grid.SetRow(0); // 행선택
        for(int i=0;i<=7;i++)
        {
                m_Grid.SetColWidth(i,Width[i]); //열 넓이 설정
                m_Grid.SetCol(i); //열 선택
                m_Grid.SetText(strTitle[i]); // 선택된행, 선택된열에 Text 를 넣는다
        }

32. 4대 Class간 참조
//각각 헤더파일 include
#include "MainFrm.h" //메인프레임 헤더파일
#include "ClassDoc.h"   //Doc클래스 헤더파일
#include "ClassView.h" //View를 include 할때는 반드시 Doc 헤더파일이 위에잇어야한다
#include "Class.h" //APP Class 의 헤더파일

void CClassView::OnMenuView() //뷰클래스
        CClassApp *pApp=(CClassApp *)AfxGetApp();   //View -> App
        CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd();  //View -> MainFrm
        CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument(); //View -> MainFrm -> Doc
        CClassDoc *pDoc=(CClassDoc *)GetDocument();                     //View -> Doc

//MainFrame 클래스
        CClassView *pView=(CClassView *)GetActiveView();  //MainFrm -> View
        CClassDoc *pDoc=(CClassDoc *)GetActiveDocument();  //MainFrm -> Doc
        CClassApp *pApp=(CClassApp *)AfxGetApp(); //MainFrm -> App

//Doc 클래스
        CClassApp *pApp=(CClassApp *)AfxGetApp(); //Doc -> App
        CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //Doc -> MainFrm
        CClassView *pView=(CClassView *)pMain->GetActiveView(); // Doc -> MainFrm -> View
        CClassView *pView=(CClassView *)m_viewList.GetHead();      // Doc -> View

//App 클래스
        CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //App -> MainFrm
        CClassView *pView=(CClassView *)pMain->GetActiveView(); //App -> MainFrm -> View
        CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument(); //App -> MainFrm -> Doc

33. ToolBar 추가하기
  CMainFrame 으로 가서 멤버변수 추가
        CToolBar m_wndToolBar1;
  OnCreate 로 가서 다음 내용을 추가해준다 (위의 toolbar 부분을 복사하고 이름만 바꾸면 된다.3군데..)
  if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
                | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
                !m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1))
        {
                TRACE0("Failed to create toolbar\n");
                return -1;      // fail to create
        }

  그 함수내에서 //TODO 아래에 내용추가..역시..복사해서 이름만 바꾸면 된다.
        m_wndToolBar1.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);
        //DockControlBar(&m_wndToolBar1);   <= 이부분 대신..
        이거를 넣는다..
        CRect toolRect; //툴바 영역을 얻을 사각형
        this->RecalcLayout(); //현상태의 Client 영역을 구해서 저장한다
        m_wndToolBar.GetWindowRect(&toolRect); //툴바영역을 저장한다
        toolRect.left+=1; //사각형의 왼쪽을 1Pixel 줄인다
        DockControlBar(&m_wndToolBar1,AFX_IDW_DOCKBAR_TOP,&toolRect); //ToolRect에 툴바를 붙인다
        return 0;

34. ToolBar에 ComboBox붙이기
        CComboBox m_combo; //객체생성
        ID 등록 => view 메뉴 => resource symbol => new => ID_COMBO
  oncreate 에 내용 추가 (콤보를 만들고 표시하는 내용)
        m_wndToolBar.SetButtonInfo(10,IDC_COMBO,TBBS_SEPARATOR,150); 
        //툴바의 10번째버튼을 편집한다
        CRect itemRect; //콤보를넣을 사각형을 만든다
        m_wndToolBar.GetItemRect(10,&itemRect); //툴바의 10번째 버튼을 사각형에 넣는다
        itemRect.left+=5; //앞여백
        itemRect.right+=5; //뒤여백
        itemRect.bottom+=100; //콤보가열릴 공간확보
       m_combo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,itemRect,&m_wndToolBar,IDC_COMBO);
        //콤보박스를 툴바에 붙여준다
        m_combo.AddString("이름"); //내용추가
        m_combo.SetCurSel(0); //셀 선택

35.  Toolbar에 수동으로넣은 ComboBox 사용하기
  afx_msg void [안내]태그제한으로등록되지않습니다-xxOnSelectCombo(); //원형
  ON_CBN_SELCHANGE(IDC_COMBO,[안내]태그제한으로등록되지않습니다-xxOnSelectCombo) //메세지맵에 추가
        CMainFrame *pMain=(CMainFrame *)GetParent(); //메인프레임 주소참조
        CComboBox *pCom=(CComboBox *)(pMain->m_wndToolBar.GetDlgItem(IDC_COMBO));
        //콤보박스의 주소를 가져온다, 접근할 때 메인프레임 -> 툴바 -> 콤보박스 의 순서로 가야한다
        int n=pCom->GetCurSel(); //현재선택된 셀의 인덱스를 가져온다
        if(n==CB_ERR) return; //선택된셀이 없으면 중지한다
        CString str;
        pMain->m_combo.GetLBText(n,str); //선택된셀의 Text를 가져온다

36. UPDATE_COMMAND 사용하기
        pCmdUI->Enable(TRUE); //버튼 활성화
        pCmdUI->SetText((bAdd)?"취소":"신규"); //버튼의 text 설정
        pCmdUI->SetCheck(TRUE); //버튼 체크

37. 프로그램정보저장
  CWinApp::GetProfileString(섹션명,항목명,기본값); // 함수를 사용한다. (문자열)
  CWinApp::GetProfileInt(섹션명,항목명,기본값);  //불러올때사용 (숫자) 
  CWinApp::WriteProfileString(섹션명,항목명,값); //저장할때 사용 (문자열)
  CWinApp::WriteProfileInt(섹션명,항목명,값); //저장할때 사용 (숫자)

  //불러올때 사용할함수
  void CMainFrame::ActivateFrame(int nCmdShow)  //프로그램 실행후 프레임생성될때 실행

  //저장할 때 WM_DESTROY 메시지 사용

38. 컨트롤바 표시하기
        CMainFrame *pMain=(CMainFrame *)GetParent(); //MainFrame 주소가져오기
        pMain->ShowControlBar(&pMain->m_wndToolBar,bTool1,FALSE); //툴바를 bTool2 에따라 보이고 감춘다

39. Window 창크기,위치정보 저장하기

MainFrame 의 WM_DESTROY 에
        WINDOWPLACEMENT w;
        this->GetWindowPlacement(&w); //윈도우의 정보를 저장한다.
        CString strRect;
        strRect.Format("%04d,%04d,%04d,%04d", //04d 는 4자리 확보하고 남은건 0으로 채워라
                w.rcNormalPosition.left,w.rcNormalPosition.top,
                w.rcNormalPosition.right,w.rcNormalPosition.bottom); //윈도우의 위치,크기 확보..
        
        BOOL bMax,bMin; //윈도우의 상태를 저장하기위한 변수
        //w.falg 는 이전상태의 정보를 가지고 잇다!!
        if(w.showCmd==SW_SHOWMINIMIZED)           //최소화 상태
        {
                bMin=TRUE;
                if(w.flags==0) //falg 값이 0 이면 이전 상태가 보통상태이다!!
                        bMax=FALSE;
                else    //이전상태가 최대화 상태
                        bMax=TRUE;
        }
        else                            
        {
                if(w.showCmd==SW_SHOWMAXIMIZED) //최대화상태
                {
                        bMax=TRUE;
                        bMin=FALSE;
                }
                else  //보통 상태
                {
                        bMax=FALSE;
                        bMin=FALSE;
                }
        }
        AfxGetApp()->WriteProfileString("WinStatus","Rect",strRect);
        AfxGetApp()->WriteProfileInt("WinStatus","Max",bMax);
        AfxGetApp()->WriteProfileInt("WinStatus","Min",bMin);

//읽어올차례..
ActivateFrame 함수로 가서
        WINDOWPLACEMENT w;  //윈도우의 상태를 저장하는 구조체..
        BOOL bMax,bMin;               //최대,최소상태를 저장할 변수
        CString strRect; //창크기를 받아올 변수
        strRect=AfxGetApp()->GetProfileString("WinStatus","Rect","0000,0000,0500,0700");
        bMin=AfxGetApp()->GetProfileInt("WinStatus","Min",FALSE);
        bMax=AfxGetApp()->GetProfileInt("WinStatus","Max",FALSE);
        int a=atoi(strRect.Left(4)); //문자열을 int 로 바꿔준다.
        int b=atoi(strRect.Mid(5,4));     //atoi 아스키 값을 int형으로 바꿔준다..
        int c=atoi(strRect.Mid(10,4));
        int d=atoi(strRect.Mid(15,4));
        w.rcNormalPosition=CRect(a,b,c,d);
        if(bMin)
        {
                w.showCmd=SW_SHOWMINIMIZED;
                if(bMax)
                {
                        w.flags=WPF_RESTORETOMAXIMIZED  ;
                }
                else
                {
                        w.flags=0;
                }
        }
        else
        {
                if(bMax)
                {
                        w.showCmd=SW_SHOWMAXIMIZED;
                }
                else
                {
                        w.showCmd=SW_SHOWNORMAL;
                }
        }
        this->SetWindowPlacement(&w); //설정된 값으로 윈도우를 그리게 한다..
        
        //CFrameWnd::ActivateFrame(nCmdShow); //이건 반드시 주석처리한다..

40. progress Bar 쓰기
        m_progress.SetRange(m_first,m_last); //Progress 범위설정하기
        m_progress.SetStep(m_step); //Progress Step설정하기
        //m_progress.StepIt(); //스텝만큼 움직이기
        //또는 다음을 사용한다
        for(int a=m_first;a<=m_last;a+=m_step) //a가 처음부터 끝까지
        {
                m_progress.SetPos(a); // 위치를 a에 맞춘다
                Sleep(50); //천천히 움직이게한다
        }

41. 파일대화상자 FileDialog 사용하기

void CConDlg1::OnFileopen()  //파일열기 버튼
{
        CFileDialog *fdlg; //파일대화상자 객체 생성 // 포인터로 만든다..
        static char BASED_CODE szFilter[] = "Animate Video Files (*.avi)|*.avi|All Files (*.*)|*.*||";
        //필터를 만들어 준다..이건 할줄 모름..
        fdlg =new CFileDialog(TRUE, ".avi", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
        //대화상자 만들기..이렇게 해야댄다..
        if(fdlg->DoModal()==IDOK) //이제..대화상자를 띠우고..    
        {                               //OK 누르면 실행될 부분..
                m_filename=fdlg->GetPathName();        //대화상자에서 경로를 받아서 저장.
                UpdateData(FALSE);    
        }
}
선생님이 해준거 //파일 다이얼로그 만들기
CFileDialog fdlg(TRUE,"avi",".avi",OFN_OEVRWRITEPROMPT,"Vidoe Files(*.avi)|*.avi|All Files(*.*)|*.*||");

42. Animate Control 사용하기
        m_animate.Open(m_filename); //파일을 연다
        m_animate.Play(0,-1,1);  //(처음프레임,마지막프레임,반복횟수)
        m_animate.Stop(); //정지시키기
        m_ani.SetAutoStart(TRUE); //자동으로 시작한다

43. Control 의 Style 바꿔주기
        Control.ModyfyStyle(제거할스타일,추가할스타일); //스타일은 MSDN내용 참조

44. 시스템 날자바꾸기 버튼
//SetSystemTime(),GetSystemTime() //GMT 표준시를 가져온다.
//GetLocalTime(),SetLocalTime()  //현재 지역시간을 가져온다.
        SYSTEMTIME st;
        GetLocalTime(&st); //현재 시간, 날자를 넣는다.
        st.wYear=m_date2.GetYear();
        st.wMonth=m_date2.GetMonth();
        st.wDay=m_date2.GetDay();
        SetSystemTime(&st);

45. 시스템 시간 바꾸기 버튼
        UpdateData(TRUE);
        SYSTEMTIME st;
        GetLocalTime(&st);
        st.wHour=m_time.GetHour();
        st.wMinute=m_time.GetMinute();
        st.wSecond=m_time.GetSecond();
        SetLocalTime(&st);

46.시스템의 드라이브 문자 얻기
        char temp[50];
        GetLogicalDriveStrings(sizeof(temp),temp);
        CString str,str1;
        int n=0;
        while(*(temp+n)!=NULL)
        {
                str=temp+n;
                str1+= " "+str.Left(2);
                n+=4;
        }

47. 현재 작업경로 얻기
        char temp[MAX_PATH]; //MAX_PATH 는 경로길이의 최대를 define 해놓은것.
        GetCurrentDirectory(sizeof(temp),temp);  // 현작업하는 경로를 얻어온다.(경로 길이,문자형);

48. Tree Control 사용하기
        HTREEITEM hmov,hmus; //핸들을받을 변수 이게 잇어야 하위 디렉토리 생성가능
        hmov=m_tree.InsertItem("영화",TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST는 default
        hm1=m_tree.InsertItem("외화",hmov);  //hmov 아래 "외화"트리 생성
        CImageList m_image; //그림을 사용하기 위한 클래스다!! 알아두자..
        m_tree.SetImageList(&m_image,TVSIL_NORMAL); //Tree View Style Image List => TVSIL
        hmov=m_tree.InsertItem("영화",0,1,TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST는 default
        hmus=m_tree.InsertItem("가요",1,2); //("문자열",처음그림번호,선택시그림)
        hm1=m_tree.InsertItem("외화",2,3,hmov); //그림 번호는 default 로 0이 들어간다..

49. List Control 사용하기
        m_list.ModifyStyle(LVS_TYPEMASK, LVS_ICON); //리스트를 큰아이콘형태로 보인다
        m_list.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);  //리스트를 작은아이콘형태로 보인다
        m_list.ModifyStyle(LVS_TYPEMASK, LVS_LIST); //리스트를 리스트형태로 보인다
        m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); //리스트를 자세히형태로 보인다

        CImageList m_treeimage; //이미지리스트
        CImageList m_small, m_large;
        m_large.Create(IDB_LARGE,32,0,RGB(255,255,255)); //이거는 클래스에서 추가해준거다
        m_small.Create(IDB_SMALL,16,0,RGB(255,255,255)); (bmp ID값,
        m_list.SetImageList(&m_large,LVSIL_NORMAL);
        m_list.SetImageList(&m_small,LVSIL_SMALL);
        CString name[]={"홍길동","진달래","한국남","개나리"};
        CString tel[]={"400-3759","304-7714","505-9058","700-9898"};
        CString born[]={"1980-1-1","1981-12-20","1980-05-15","1981-08-31"};
        CString sex[]={"남자","여자","남자","여자"};
  
        m_list.InsertColumn(0,"이름",LVCFMT_LEFT,70);
        m_list.InsertColumn(1,"전화번호",LVCFMT_LEFT,80);
        m_list.InsertColumn(2,"생일",LVCFMT_LEFT,90);
        m_list.InsertColumn(3,"성별",LVCFMT_LEFT,50);

        LVITEM it; //리스트 구조체
        char temp[100];
        for(int a=0;a<4;a++)
        {       
                int n=(sex[a]=="남자")?0:1;
                m_list.InsertItem(a,name[a],n); //insert item 은 행을 만들고..
                it.mask=LVIF_TEXT|LVIF_IMAGE; //마스크 설정
                it.iItem=a;

                it.iSubItem=1; //열 설정
                strcpy(temp,tel[a]); //이거 모하는거냐..
                it.pszText=temp;
                m_list.SetItem(&it);                      // setitem 열에 정보를 넣는다.

                it.iSubItem=2; //열 설정
                strcpy(temp,born[a]); //이거 모하는거냐..
                it.pszText=temp;
                m_list.SetItem(&it);                      // setitem 열에 정보를 넣는다.

                it.iSubItem=3; //열 설정
                strcpy(temp,sex[a]); //이거 모하는거냐..
                it.pszText=temp;

                m_list.SetItem(&it);                      // setitem 열에 정보를 넣는다.

50. Bitmap Button 사용하기
  CBitmapButton 을 사용한다! CButton 에서 상속 받는클래스임..
        m_button1.Create(NULL,
                WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,CRect(310,20,370,50),
                this,IDC_MYBUTTON); //버튼만들기
        m_button1.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //버튼의 그림설정
        m_button1.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!
그냥 버튼을 비트맵버튼으로 바꾸기 -> 버튼을 만든다 속성에서 OWNERDRA 속성에 체크!!
        m_button2.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //버튼의 그림설정
        m_button2.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!

51. 중복없는 난수발생하기
        int su; //발생된 난수저장
        int a,b;
        BOOL bDasi; //숫자가중복될경우 다시하기위한 변수
        for(a=0;a<9;a++)  //난수 9개 발생
        {
                bDasi=TRUE;
                while(bDasi)
                {
                        bDasi=FALSE;
                        su=rand()%10; //난수발생
                        for(b=0;b
                        {
                                if(temp[b]==su)  //중복이면
                                {
                                        bDasi=TRUE; //중복이 잇으면 다시while 문을 실행한다
                                        break;
                                }//if
                        }//for
                }//while
                temp[a]=su; //중복이 아니면 대입한다

52. 메뉴 범위로 사용하기
  ON_COMMAND_RANGE(ID_LEVEL3,ID_LEVEL9,OnLevel); //범위메세지 발생
 //메뉴 ID의 값이 연속된 숫자일 경우 범위로 지정해서 사용할수잇다

53. 한,영 전환함수
void CCustView::SetHangul(BOOL bCheck) //T:한글 F:영문 이건 외우자..
{
        HIMC hm=ImmGetContext(this->GetSafeHwnd()); //뷰클래스의 윈도우 핸들포인터를 얻는다.
        if(bCheck)
        {
                ::ImmSetConversionStatus(hm,1,0); //1은 한글 0은 영문
        }
        else
        {
                ::ImmSetConversionStatus(hm,0,0); //영문으로 바꿔준다
        }
        ::ImmReleaseContext(this->GetSafeHwnd(),hm); //장치를 풀어준다
}

#include "imm.h" //헤더 반드시 추가하고
imm32.lib (라이브러리 파일)를 반드시 링크해주어야 한다!
**** 라이브러리 추가하기
프로젝트메뉴 -> 셋팅 -> 링크탭

54. DLL함수정의하기

임포트함수 :  extern "C"  __declspec(dllimport)   리턴형  함수명(매개변수,...) ;
  - 메인프로그램에서 DLL에 있는 함수를 호출할때 사용한다.
엑스포트함수 :  extern "C"  __declspec(dllexport)   리턴형  함수명(매개변수,...)
                      {
                             내용;
                      }

'1.소프트웨어 이야기 > 01.MFC(Visual Studio)' 카테고리의 다른 글

[펌] 다중 쓰레드 동기화  (0) 2009.02.27
[펌] DialogBar 구현  (0) 2008.08.07
클래스간 포인터 얻기  (0) 2007.12.06

[원문] http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=60&MAEULNo=23&no=234&ref=234


구현 내용은 다이얼로그바에서 버튼을 틀릭 하면 뷰가 변경되는 기능을 구현 하엿으며,

뷰 스위칭 하는 소스는 데브피아에서 참고 하여 작성 하엿습니다..


프로젝트는 CE MFC(exe)의 뷰의 Base Class를  CFormView기반으로 시작 하엿습니다..

나중에 뷰 스위칭을 위해서요..^^
 

1.  CDialogBar를 상속 받은 파생 클래스를 제작 합니다. 클래스명은 CDlgBar이고요..^^

---클래스 생성시 위져드에 보면 CDialogBar 가 Base class 에 포함 되어 있지 않기 때문에
    CDialog 를 상속 받아 클래스를 만든 다음 부모 클래스를 CDialogBar로 바꾸어 주어야 합니다..

    그리고 리소스에서 다이얼로그 의 스타일을 Child로 바꾸어 줍니다..


- 생성된 클래스에 Create 함수를 두개 구현 합니다..

    필요한거 하나만 구현 하여 사용 하셔도 됩니다..^^


2. 다이얼로그바 활성화 시키기

    -- 다이얼로그바 클래스를 만들고 MainFrame에서 바로 생성 하여 사용 할려면 버튼이 활성화 되지 않는     현상이 생기게 됩니다..
    해서 ON_UPDATE_COMMAND_UI 메시지 핸들러 함수를 설치하셔야 합니다..

    이녀석 또한 위져드에서 보이지가 않더군요...

    메시지 맵에 직접 추가해 주었습니다..

    메시지 핸들러 함수는

        afx_msg void OnUpDateCmdUi(CCmdUI *pCmdUI );

    BEGIN_MESSAGE_MAP에는

        ON_UPDATE_COMMAND_UI(IDC_DLGBAR_BTN1, OnUpDateCmdUi)

    핸들러 함수 구현은  

        void CDlgBar::OnUpDateCmdUi(CCmdUI *pCmdUI )

        {

            pCmdUI->Enable(TRUE);

        }

    이와 같이 등록 하여 줍니다..

     ON_UPDATE_COMMAND_UI매크로를 이용하여 COMMAND ID 와 메시지 핸들러 함수를 연결해 두면

    그 COMMAND ID를 갖는 사용자 인터페이스가 갱신되어야 할 필요가 있을때마다

    그 함수가 호출됩니다.

    - 이렇게 하여 다이얼로그바의 컨트롤을 (예제에서는 버튼) 을 활성화 하게 됩니다.


3.    다이얼로그바 생성

    CDlgBar를 MainFrame의 멤버 변수로  선언 하고 ,

    MainFrame의 OnCreate함수 에서 아래와 같이 다이얼로그바를 생성해 줍니다..

   



    이렇게 하면 다이얼 로그바가 생성 됩니다..
    다이얼로그바의 버튼 클릭시 하고 싶은 행동은 다이얼로그바의 클래스에서 해주시면 되겟죠..??^^

   

------------------    이렇게 해서 다이얼로그바는 생성을 마쳤습니다...  ----------------------


 그럼 다이얼 로그바의 버튼을 클릭 할때 버튼 마다 다른 뷰를 보여 주는 기능을 구현 해 보도록 하죠..

 

 데브피아에서 찿은 CE에서 뷰 스위칭 하는 소스를 가지고 사용 하엿습니다..^^;

 

1. 일단 메인뷰가 아닌 교체될 뷰를 생성 해야 겠죠??

    제가 만든 예제에서는 두개를 생성 햇습니다..
    - 먼저 리소스에서 다이얼로그를 하나 insert합니다.

    - 그다음 속성에서 style과  border를 각각 Child와 None으로 줍니다.

    - 그런 다음 Ctrl+W로 위져드를 열면 클래스를 생성할것이냐고 뭍습니다..그럼 OK하고 ,

    - 클래스 이름을 넣어 주시고 , Base Class 를 다이얼로그가 아닌 CFormView로 하여

        클래스를 생성 합니다.

    - 그럼 뷰 클래스 하나가 생성 되엇습니다..

   

    - 만든 뷰에서 어떤 작업을 하고 싶으면 만들어진 클래스에서 작업 하시면 됩니다..^^

   

2. 교체되어질 뷰가 만들어 졌으니 이제 교체를 해보겟습니다..
    - 먼저 뷰를 담을 배열을 하나 선언 합니다..

        CView* m_pViewArray[MAX_VIEW_CNT];

        CView * 타입의 변수 입니다.. MAX_VIEW_CNT는 define된 배열의 개수 이고요

        이녀석을 생성자에서 초기화 해줍니다..



         

    - 그담에 MainFrame에 멤버 함수를 추가 합니다.

        뷰를 인덱스로 관리 하여 해당 뷰의 인덱스를 인자로 받아 현재 보이고 잇는 뷰를 사라지게 하고,

        바꾸어질 뷰를 보여 주는 함수 입니다..

        이 함수를 다이얼로그바의 버튼에서 호출 하면 버튼마다 보여주고 싶은 뷰를 보이도록 할 수

        있습니다..

       

설명이 제대로 됐는지 모르겠습니다..
아까 오전에 올린거는 설명이 넘 허접 하게 올려서 추후에 다시 수정 하겠습니다..
일하는중에 올리다 보니 정신이 없네요..^^; 남에세 설명 하는것도 처음이고요.....^^;

허접한 팁이었습니다..

 

소스첨부 하였습니다....

 

-----      즐거운 하루들 보내세요..^^     -----

사용예) hDLL = LoadLibraryEx("Temp.dll", NULL,LOAD_LIBRARY_AS_DATAFILE);

#define DONT_RESOLVE_DLL_REFERENCES            0x00000001
#define LOAD_IGNORE_CODE_AUTHZ_LEVEL           0x00000010
#define LOAD_LIBRARY_AS_DATAFILE                     0x00000002
#define LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE   0x00000040
#define LOAD_LIBRARY_AS_IMAGE_RESOURCE       0x00000020
#define LOAD_WITH_ALTERED_SEARCH_PATH         0x00000008

참고
•DONT_RESOLVE_DLL_REFERENCES :
   이 옵션은 윈도우 NT에서만 사용할 수 있으며 DllEntryPoint를 부르지 않을 때 사용한다.     DllEntry와 DllExit 코드는 Dll Main을 설명할 때 함께 하기로 하고,  지금은 Dll의 Entry Point에서 명시된 코드를 실행하지 않을 때 이 옵션을 사용한다

•LOAD_LIBRARY_AS_DATAFILE :
    이 옵션은 DLL 파일을 하나의 단순한 데이터 파일로 이해하고 적재하도록 하는데 그 목적이 있다. 실행 코드가 전혀 없는 DLL들은 시스템에서 DLL의 실행을 위한 특별한 준비가 필요하지 않으므로 실행 시간을 절약할 수 있다.

•LOAD_WITH_ALTERED_SEARCH_PATH :
   이 옵션을 사용하면 위에서 언급한 DLL을 탐색하는 경로를 LoadLibraryex(LPTCSTR)에 명시된 대로 바꿀 수 있다

LabView의 기능중에 컴파일 기능이 있다.

이중 DLL 만들기가 있다.

랩뷰가 생성되는 파일은 M$에서 사용되는 COFF 파일이다.
VCL에서는 OMF 형식으로 되니까.. 이부분을 변환해 줘야 된다고 생각하고 정적으로 불러왔으나 되지 않는다.

혹시나 해서 동적으로 불러보니 잘 된다.. ㅠㅠ(하루 까먹었다..)

우선 형을 정의해 주고..
typedef double (__stdcall *TTempTest)(double);

DLL을 인스턴스로 선언해주고..
HINSTANCE  Dll;

동적으로 생성할  함수형도 미리 선언
TTempTest DLLFunc;

사용하고자 하는 곳에서... (또는 생성부에서...) DLL 로드
둘 중 편한대로 사용..(2000과 XP 모두에서 사용할려면 아래 방식으로 해야 된다고 한다.. 2000 시스템이 없어서 확인 못함... XP는 사용가능)
 Dll = LoadLibrary("Temp.dll");
 Dll = LoadLibraryEx("Temp.dll", NULL, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE);

이제 동적으로 불러오고.... 실행...
 DLLFunc = (TTempTest)GetProcAddress(Dll, "TempTest");
 if(DLLFunc)
 {
       DLLFunc(8);
 }

참고로... 화면을 불러오고자 할때에는...

VI 설정화면에서  윈도우 동작을 플로팅으로 해야 한다..
기본으로 할 경우에는 화면이 동작하지 않는다.
그리고 호출시 프런트패널을 보일것인지.. 로드시 보일것인지도 판단하도록 하고..

그리고 While문을 사용할경우에도 주의..하자.. 
그래프나 차트랑 연동될경우..
하나의 창만 나타날수도 있다.

블록다이어그램에서 인보크노드에서 설정해도 된다..

그리고.. 함수의 입출력 부분을 커넥트 처리를 꼭하자.. 이거 안하면 함수의 인자나 반환값을 받을수가 없다.



+ Recent posts