2011-04-15 10 views
2

AVI 파일의 이름을 바꾸는 프로그램을 작성하고 확장 프로그램을 추가 한 다음 프레임을 가져 와서 BMP 파일에 저장합니다. 여기 전역 변수의 동작이 다른 함수에 따라 다릅니다.

코드의 중요한 부분입니다

#include "stdafx.h" 
#include "ImageProcessor2.h" 
#include <windows.h> 
#include <Commdlg.h> 
#include <Commctrl.h> 
#include <stdio.h> 
#include <string> 
#include "vfw.h" 
#include <atlstr.h> 

// Global Variables... 
HINSTANCE g_hInst; 
LPSTR selectedAVI=NULL; 

INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); 
void OpenDialog(HWND); 
void GetFrame(HWND); 

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPTSTR lpCmdLine, int nCmdShow) 
{ 
    g_hInst = hInstance; 
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL,(DLGPROC)DialogProc); 
    return 0; 
} 


INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_INITDIALOG: 
      SetClassLongPtr(hWnd, GCLP_HICONSM, 
       (LONG_PTR)LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_IMAGEPROCESSOR2))); 
      break; 
     case WM_COMMAND: 
      switch (LOWORD(wParam)) 
      { 
       case IDCANCEL: 
        EndDialog(hWnd, LOWORD(wParam)); 
        break; 
       case IDB_LOADVID: 
        OpenDialog(hWnd); 
        break; 
       case IDB_GETFRAME: 
        if (selectedAVI==0) 
         { 
          MessageBox(NULL, "Select the file by pressing Load button first", "Info", MB_OK); 
          break; 
         } 
        else 
        GetFrame(hWnd); 
        break; 
      } 
      break; 
     break; 
    } 
    return FALSE; 
} 

void OpenDialog(HWND hWnd) 
{ 
    OPENFILENAME ofn; 
    TCHAR szFile[MAX_PATH]; 
    char* renamedfile; 

    ZeroMemory(&ofn, sizeof(ofn)); 
    ofn.lStructSize = sizeof(ofn); 
    ofn.lpstrFile = szFile; 
    ofn.lpstrFile[0] = '\0'; 
    ofn.hwndOwner = hWnd; 
    ofn.nMaxFile = sizeof(szFile); 
    ofn.lpstrFilter = TEXT("All files(*.*)\0*.*\0"); 
    ofn.nFilterIndex = 1; 
    ofn.lpstrInitialDir = NULL; 
    ofn.lpstrFileTitle = NULL; 
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 


    if (GetOpenFileName(&ofn)) 
     { 
      //call to rename function 
      ofn.lpstrFile=renamedfile; 
      MCIWndCreate(GetDlgItem(hWnd, IDC_ANIRENDER), (HINSTANCE)g_hInst,WS_CHILD|WS_VISIBLE|WS_SYSMENU|MCIWNDF_NOOPEN|MCIWNDF_NOMENU|MCIWNDF_NOTIFYALL, ofn.lpstrFile); 
      selectedAVI=ofn.lpstrFile; 
      SetDlgItemTextA(hWnd, IDC_EDIT1, selectedAVI); 
     } 
} 

//rename function is here 

void GetFrame(HWND hWnd) 
{ 
    LONG hr; 
    PAVIFILE pfile; 
    SetDlgItemTextA(hWnd, IDC_EDIT2, selectedAVI); 

    AVIFileInit();   // opens AVIFile library 
    //further AVI processing functions are here 
    AVIFileExit();   // releases AVIFile library 
} 

내가 받고있는 이유 이제 설명해주십시오 :

EDIT1에서

: \ 테스트 \의 testAVI : 올바른 경로는 "D로 (파일로 ţ ™ Öj8p "나는 같은에서 읽기 때문에이 같은 문자열을 표시해야합니다 생각

"로 끝나는 등등하고, "îţîţîîţîţîîţîţî : .AVI") EDIT2에서

" 전역 변수. 내가 뭘 잘못하고 있니? 어떻게 그럴까요?

selectedAVI이 포인터 자체의 어떤 기억이 없기 때문에 당신에게

답변

3

감사, 그것이 가리키는 것 것은 (OpenDialogOPENFILENAME 구조) 지역 변수의 일부입니다 (저장을 가지고 있음) 범위를 벗어나서 IDC_EDIT2에 도착할 때까지 덮어 썼습니다.

이 문제를 해결하려면 길이가 MAX_PATH 인 배열로 변경하고 strcpy 또는 유사하게 할당하십시오. 그럼 당신이 원하는대로 작동해야합니다.

+0

예수님! 나는 포인터에 대해서만 항상 생각하고 있었고 포인터가 가리키는 값에 대해서는 생각하지 않았습니다. 무엇 embarasing 순간 : D 감사합니다 – Smejki

+0

, 모두가 그런 순간을 가지고 있습니다. :-) –

관련 문제