2014-06-12 10 views
1

Hy, 디버깅 문제로 인해 도움을 받으실 수 있습니다.프로그램이 원활하게 실행되지만 CreateWindowW (내 Quess)에서 액세스 위반으로 인해 디버깅이 실패합니다 ... 어떻게 가능합니까?

첫 번째로, 저는 이것이 프로그램을 만드는 첫 번째 시도라고 말해야합니다. 나는 새롭지 않다, 나는 코딩에 최신이고, 결코 그것을 bevore하지 않았다.

** 간단한 방식으로 멀티 스레드 응용 프로그램을 디버깅 할 수 있습니까?

누군가가 "이봐, 왜 그가 C/Winapi를 사용하고 있는지, 더 나은 방법이있다"라고 대답하는 경우에만 대답 할 수 있습니다. I/O 카드의 DLL은 C로 작성되어 있기 때문에 나는 대답 할 수 있습니다. 엔지니어, 코더/프로그래머가 아닙니다.

내 문제는 내 app (가상 Comport에서 데이터를 읽고 txt로 저장하는 프로그램)을 실행할 때 모든 것이 괜찮을 것입니다. 하지만 디버거를 사용할 때 매우 fisrt CreateWindowW 호출에서 오류가 발생합니다.

나는 다중 스레드 프로그래밍을 사용하여 Window7 x64를 실행 중이며 디버거가 무엇을 말하고 싶어하는지 알지 못합니다. x64에서 Winapi32를 실행할 수 있습니까?

** 필자는 Pelles-C를 사용하고 있으며 디버거가 말하고자하는 것을 수행하는 방법을 파악하는 데 어려움을 겪고 있습니다. 그는 "exceptiom 레코드에 대해 .exr 0000000000000008BBB0을 입력하십시오."라고 말하지만, .exr을 작동시키는 방법이나 명령을 배치 할 위치는 없습니다. 시간을 훔쳐서 정말 유감이지만,이 문제를 해결하기 위해이 스레드를 열어 보았습니다.

ODS는 : 액세스 위반이 에서 발생했습니다 "C : \ 사용자 \ dhin \ 바탕 화면 \ Ver11 \ CSR-Messung HB628.exe"0000000075094D62에있는 명령은

에서 읽으려고 :

ODS를

ODS : 잘못된 주소 0000000000000010

ODS * 예외 레코드

ODS를위한 000000000008BBB0 .exr 입력 * 콘테위한 000000000008B6C0를 입력 .cxr XT

ODS * 다음 폴트 스택을

예외 얻을 KB : C000041D

디버거 변수 섹션

를, 그 hwnd1 (메인 윈도우의 핸들) ADRESS 00000000를 갖고 SAIS .. 그게 나쁜 징조 야? 컴파일러조차 아무것도 불평 않습니다 allthough 여기

, 나는 이런 일이 왜 궁금

#include <windows.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 
    #include <process.h> 

    #include "Procs.h" 
    #include "Res.h" 

    #define My_Icon 1 

    //_Generierung der Fenster______________ 



    HWND hwnd1; 
    HANDLE getmutex,writemutex,paintmutex,readmutex; 
    MSG msg; 
    HINSTANCE hInstance; 
    short int compare,AmountOfDatapointBufferint; 
    HBRUSH syst; 
    void * lpParam; 

    int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) 
    { 
    WNDCLASSW main1;  
        main1.hInstance   = hInstance;      // Instanz 
        main1.style    = CS_HREDRAW | CS_VREDRAW ;  // das fenster wird bei Vergrößern neu gezeichnet (später aber gesperrt &~WS_THICKFRAME macht das kein Rahmen zum vergrößern da ist) 
        main1.cbClsExtra   = 0;        
        main1.cbWndExtra   = 0;        
        main1.hbrBackground  = GetSysColorBrush(COLOR_3DFACE); // Hintergrundaret/farbe 
        main1.lpszMenuName  = NULL;       // Pop-down menü -> aus 
        main1.hCursor    = LoadCursor(NULL, IDC_ARROW); // Cursor -styles 
        main1.hIcon    = LoadImage(NULL, "MyIcon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR);// Icons -- 


    //____________________________________________________ 
        main1.lpszClassName  = L"Anzahl_der_Messaufbauten_angeben";  
        main1.lpfnWndProc   = AnzProc; 

        if(!RegisterClassW(&main1))        
        { 
        MessageBox(NULL, TEXT("Fehler beim Registrieren der ''Anzahl_der_Messaufbauten_angeben'' Fensterklasse!"), NULL, MB_OK | MB_ICONERROR); 
        return (0); 
        } 


    //__________________________________________________________ 
       main1.lpszClassName   = L"Graph"; 
       main1.lpfnWndProc   = SecProc;  

       if(!RegisterClassW(&main1))         
        { 
        MessageBox(NULL, TEXT("Fehler beim Registrieren der Graph Fensterklasse!"),NULL, MB_OK | MB_ICONERROR); 
        return (0); 
        } 


    //___________________________________________________ 
        main1.lpfnWndProc   = MainProc;      
        main1.lpszClassName   = L"CSR_Messung_V_1.0"; 

        if(!RegisterClassW(&main1)) 
         { 
         MessageBox(NULL, TEXT("Fehler beim Registrieren der MAIN - Fensterklasse!"), NULL, MB_OK | MB_ICONERROR); 
         return (0); 
         } 
        compare=3;//Standard - Schreibt Formatiert und Unformatiert! 
        AmountOfDatapointBufferint=3; //Standard : 3 Kanäle 

        hwnd1 = CreateWindowW(L"CSR_Messung_V_1.0",L"CSR_Messung_V_1.0",WS_POPUPWINDOW &~WS_THICKFRAME |WS_VISIBLE ,0,0,835,585,NULL,(HMENU)0,hInstance,NULL); 


        ShowWindow (hwnd1, SW_SHOWNORMAL);     
        UpdateWindow(hwnd1); 

    //_________________________________________________________ 
     //Initialisiert die Mutex'es 


    etmutex=CreateMutex(NULL,FALSE,"get");    
     readmutex=CreateMutex(NULL,FALSE,"val");    
     writemutex=CreateMutex(NULL,FALSE,"write");   
     paintmutex=CreateMutex(NULL,FALSE,"paint"); 


    //___________________________________________________ 
    while (GetMessage(&msg,hwnd1,0,0)) 
     { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
     } 
    return (int) msg.wParam;         
    } 

에서이 occures 코드의 조각이다. CALLBACK 함수는 proc.h 파일을 통해 연결된 다른 시트에 있습니다. 나는 아무것도하지 않는다. 왜냐하면 나는 이것이 올바르게 행해지 지 않을 때 문제를 야기한다는 것을 읽었 기 때문이다.

따라서 제 질문은 왜 디버거가 75 번째 줄인 CreateWindowW 명령을 멈추게합니까 ??

시간과 도움에 감사드립니다!

PS :

 LRESULT CALLBACK MainProc(HWND hwnd1, UINT msg, WPARAM wParam, LPARAM lParam); 
    // is the main window 

    The other two are of equal design, theyr important part of the inner structure is: 


switch(msg) 
    { 

    break; 
    case WM_CREATE: 
     { 
// The Main-window is visible, the Graph not, this is indicated by iHide=1; 
     iHide=1; 

//_________________________________________________________________________________________________________________________________________________________________________________ 
// Groupbox-Frames 
     iSet=0;    
     while(iSet<4) 
      { 
      GruppenBox[iSet]=CreateWindowW(L"button", L"Start",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_CENTER,(20 + (iSet * 160)), 50, 150, 430, hwnd1, (HMENU) iSet, NULL, NULL); 
      iSet=iSet+1; 
      }    
     GruppenBox[16]=CreateWindowW(L"button", L"Comport Nr.",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_CENTER,20 ,490,150,80, hwnd1, (HMENU) iSet, NULL, NULL); 
     GruppenBox[15]=CreateWindowW(L"button", L"Messwerte (N)",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_CENTER,660 ,50,150,430, hwnd1, (HMENU) iSet, NULL, NULL); 
     GruppenBox[18]=CreateWindowW(L"button", L"",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_CENTER,180 ,490,630,80, hwnd1, (HMENU) iSet, NULL, NULL); 
     GruppenBox[19]=CreateWindowW(L"button", L"",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_CENTER,-10 ,-20,900,54, hwnd1, (HMENU) iSet, NULL, NULL); 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Measurement-values-display-boxes 
// Boxes for mV-formated data 
     iSet=0;    
     while(iSet<AmountOfDatapointBufferint) 
      { 
      MeasvalueC[iSet]=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_VISIBLE| ES_CENTER,515,(80+(iSet * 50)),120,30,hwnd1,(HMENU)0,NULL,NULL); 
      iSet=iSet+1; 
      } 
// Boxes for Newton-formated data   
     iSet=8; 
     while(iSet<AmountOfDatapointBufferint+8) 
      { 
      MeasvalueC[iSet]=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_VISIBLE| ES_CENTER,675,(80+((iSet - 8) * 50)),120,30,hwnd1,(HMENU)0,NULL,NULL); 
      iSet=iSet+1; 
      } 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Checkboxes for CHannel choosing 
     iSet=1;   
     while(iSet<AmountOfDatapointBufferint+1) 
      { 
      CheckBox[iSet]=CreateWindowW(L"button",L"",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_PUSHLIKE,34,(80 + ((iSet-1) * 50)),120,30, hwnd1, NULL,0,0); 
      iSet=iSet+1; 
      }  
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Buttons 

     Knopf[1]=CreateWindowW(L"button",L"Start",WS_VISIBLE | WS_CHILD | ES_CENTER ,187,507,100,55, hwnd1, (HMENU) 2,0,0); 
     Knopf[5]=CreateWindowW(L"button",L"x",WS_VISIBLE | WS_CHILD | BS_CENTER | ES_CENTER ,805,5,23,23, hwnd1, (HMENU) 2,0,0); 
     Knopf[2]=CreateWindowW(L"button",L"Halt",WS_VISIBLE | WS_CHILD | ES_CENTER ,355,507,100,55, hwnd1, (HMENU) 2,0,0);  
     Knopf[3]=CreateWindowW(L"button",L"Weiter",WS_VISIBLE | WS_CHILD | ES_CENTER ,530,507,100,55, hwnd1, (HMENU) 2,0,0); 
     Knopf[4]=CreateWindowW(L"button",L"Graph ein",WS_VISIBLE | WS_CHILD | ES_CENTER ,110,5,100,23, hwnd1, (HMENU) 2,0,0);  
     Knopf[6]=CreateWindowW(L"button",L"Probe",WS_VISIBLE | WS_CHILD | ES_CENTER ,703,507,100,55, hwnd1, (HMENU) 2,0,0); 
     Knopf[7]=CreateWindowW(L"button",L"Menü",WS_VISIBLE | WS_CHILD | ES_CENTER ,5,5,100,23, hwnd1, (HMENU) 2,0,0); 
     Knopf[8]=CreateWindowW(L"button",L"_",WS_VISIBLE | WS_CHILD | BS_CENTER | ES_CENTER ,777,5,23,23, hwnd1, (HMENU) 2,0,0); 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Meastime-input/display Boxes 
     iSet=0;  
     while(iSet<AmountOfDatapointBufferint) 
      { 
      MeastimeC[iSet]=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_VISIBLE| ES_CENTER,204,(80+(iSet * 50)),100,30,hwnd1,(HMENU)0,GetModuleHandle(NULL),NULL); 
      iSet=iSet+1; 
      }     
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Samplerate input/display Boxes 
     iSet=0; 
     while(iSet<AmountOfDatapointBufferint) 
      { 
      SamplerateC[iSet]=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_VISIBLE| ES_CENTER,363,(80+(iSet * 50)),100,30,hwnd1,(HMENU)0,GetModuleHandle(NULL),NULL); 
      iSet=iSet+1; 
      } 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Comport number-entering Box 
     ComportNumber=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","3",WS_CHILD|WS_VISIBLE| ES_CENTER,60,520,70,30,hwnd1,(HMENU)0,GetModuleHandle(NULL),NULL); 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Standard-Valus are inserted into the boxes 
     iSet=0; 
     while(iSet<AmountOfDatapointBufferint) 
      { 
      SetWindowText(SamplerateC[iSet],"2"); 
      SetWindowText(MeastimeC[iSet],"1000"); 
      myPosition[iSet]=0; 
      iSet=iSet+1; 
      } 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Names are dedicated to some Boxes (for optical purpose only, handles do exist aside these)  
     // Frames 
     SetWindowText(GruppenBox[0],"Kanal");SetWindowText(GruppenBox[1],"Messdauer (Std)");SetWindowText(GruppenBox[2],"Samples pro Std.");SetWindowText(GruppenBox[3],"Messwert (mV)"); 
     // Checkboxes 
     SetWindowText(CheckBox[1],"Kanal 1");SetWindowText(CheckBox[2],"Kanal 2");SetWindowText(CheckBox[3],"Kanal 3");SetWindowText(CheckBox[4],"Kanal 4");SetWindowText(CheckBox[5],"Kanal 5");SetWindowText(CheckBox[6],"Kanal 6");SetWindowText(CheckBox[7],"Kanal 7");SetWindowText(CheckBox[8],"Kanal 8"); 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// Disabling of certain elements 

     // Buttons 
     EnableWindow(Knopf[2], FALSE);EnableWindow(Knopf[3], FALSE); 
     EnableWindow(Knopf[4], FALSE);EnableWindow(Knopf[6],TRUE); 
     // Textboxes 
     iSet=0; 
     while(iSet<16) 
      { 
      EnableWindow(MeasvalueC[iSet], FALSE); 
      iSet=iSet+1; 
      } 
     iSet=0; 
     while(iSet<9) 
      { 
      iBuffer[iSet]=0; 
      iSet=iSet+1; 
      } 
     iSet=0; 
     while(iSet<8) 
      { 
      Newtonscale[iSet]=""; 
      countmeup[iSet]=0; 
      iSet=iSet+1; 
      } 
//_________________________________________________________________________________________________________________________________________________________________________________ 
// clearing the memory and writing "0" entryis to certain arrays 
     iSet=0;iGraph=0; 
     while (iSet<55) 
      { 
      while(iGraph<8) 
       { 
       UArray[iSet][iGraph]=0; 
       iGraph=iGraph+1; 
       } 
      iSet=iSet+1; 
      } 
     return (int) lParam; 
     } 
    break; 
    case WM_DESTROY:  //removed the commands because their not part of my current problem 
    break; 
    case WM_CLOSE: //removed the commands because their not part of my current problem 
    break; 
    case WM_COMMAND: //removed the commands because their too long to be displayed and do work propperly 
    break; 
    case WM_PAINT:  //removed the commands because their not part of my current problem 
    break; 
    case WM_TIMER:  //removed the commands because their not part of my current problem 
    break; 
    } 
return DefWindowProc (hwnd1, msg, wParam, lParam); 

여러분의 도움에 감사드립니다 : 여기 콜백의 WndProc 물건입니다!

PPS : 저를 나쁜 코더로 모욕 할 수는 있습니다. 내 키보드 주변에서 야생 원숭이처럼 보일 것입니다.

**** 이것은 디버거가 나를 어떻게 소리 치기 시작했는지 (/ 내 코드)입니다.

프로세스 1B00이 시작되었습니다. 스레드 171C가 시작되었습니다. CSR- 메신저 HB628이로드되기 시작했습니다.0000000077460000로드에서 제목 0000000000400000로드에서 EXE 제목 0000000076D80000에서 제목 제목 로드 언로드 0000000074E30000에서 제목 제목로드 언로드 0000000076D80000에서 제목 0000000074C50000로드에서 제목 0000000074C60000로드에서 0000000074CC0000 로드 제목에서 제목 0000000077640000로드에서 제목이로드 언로드 제목 0000000074E30000로드에서 제목 0000000077360000 하역 제목로드 제목 0000000074D80000,691에서 제목 0000000074E20000로드에서 제목 00000000760A0000로드 에서 제목 0000000076900000로드에서 제목 0000000074FF0000로드에서의 에서 0000000071760000로드 제목에서 제목 0000000075F80000로드에서 제목 0000000075C90000로드에서 제목 0000000010000000 로드에서 제목 0000000074D10000로드에서 제목 0000000074D20000로드 에서 0000000075E90000로드 제목에서 제목 00000000768B0000로드에서 제목 0000000076A00000로드에서 제목 0000000076320000로드에서 제목로드 0000000005F90000 0000000073F70000에 제목 없음로드 중로드 중 0000000071350000에서 제목 없음 ODS :

% s -------------------------------- ----------------

--- Themida Professional은 ---


스레드 38C는 스레드 1E54이 스레드 1EF4이 스레드 14AC 을 시작했다 시작 스레드 1D6C를 시작 시작 --- (C) 2012 Oreans 기술 ---

는 15D4 스레드 시작 스레드 16C0이 스레드 1698 이 1AE4이 스레드 1EC8이 스레드 1734을 시작 시작 스레드 시작 시작 시작은 1B7C가 이 스레드 1718 스레드 1570이 스레드 1F54는 스레드 1910 이 스레드 1434이 스레드 B8C은E30 스레드를 시작 시작 시작 시작 시작 시작 시작 1840 스레드 1FB0이 스레드를 시작 시작 스레드 시작시작 스레드 1F24 시작 스레드 19A4 시작 스레드 1B40 시작됨 스레드 1E54는 0으로 끝났습니다 스레드 1EF4는 0으로 끝났습니다 스레드 15D4는 0으로 끝나는 스레드 38C는 0으로 끝났습니다 스레드 16C0은 0으로 끝났습니다 스레드 1AE4 은 0으로 끝났습니다 스레드 1EC8은 스레드로 끝났습니다 스레드 1734는 0으로 끝났습니다. 스레드 1B40은 0으로 끝났습니다 스레드 1570은 0으로 끝났습니다 스레드 1B7C는 0으로 끝났습니다 스레드 1FB0은 0으로 끝났습니다 스레드 1F54는 0으로 끝났습니다 스레드 030은 끝났습니다 0 스레드 1718은 0으로 끝났습니다 스레드 1840은 0 스레드로 끝났습니다 스레드 1910 0으로 끝난 스레드 1698 0으로 끝난 스레드 1D6C 0으로 끝난 스레드 19A4는 0으로 끝났습니다. 스레드 1F24는 0으로 끝났습니다. 스레드 1434는 0으로 끝났습니다. 스레드 B8C는 0으로 끝났습니다 스레드 14AC는 0으로 끝났습니다. ODS :

*는 액세스 위반이 에서 발생했습니다 "C : \ 사용자 \ dhin \ 바탕 화면 \ Ver11 \ CSR-Messung HB628.exe".exr 000000000008BBB0 .cxr 000000000008B6C0 KB :

ODS : 명령에 0000000074C94D62는 ODS로부터 판독하려고 일 : 잘못된 주소 0000000000000010

ODS : *이 예외 레코드 ODS를위한 000000000008BBB0 .exr 입력 * 입력한다.문맥 ODS에 대한 CXR 000000000008B6C0 : 맞춤법 misstakes 정정 (일반적으로 영어 lanquage에 아주 나쁜 생각/gramatic)

** 편집 : 다음 *킬로바이트는 오류가있는 스택을

* 편집 1을 얻을 수 2 : IDE에 대한 정보를 추가,

추가 질문을 **** 편집 3 : 제가 알아 낸 잘못된 ADRESS의 하나가 원인이되는 것을 :

편집 4 유용 할 수있다 오메 물건을 추가 권한있는 지시 나중에 액세스 위반, 내가 사용하고있는 외부 lib 안에 있습니다.

00000010 20 20 20 20 20 20 20 20 31 32 33 31 33 39 39 30 12313990

UPDATE :

내가 찢어 내가 wrong.It이 같은 다소 찾고 오전 때 날 쏠 말라 모든 것을 뼈에 보내고, 하나의 단추로 알몸의 창을 만들었고, 여전히 오류가 발생했습니다. 그런 다음 링커에서 hb628.lib을 꺼냈다. 결과는 완벽하게 작동하는 디버그/실행이었습니다. 불행히도 이것은 내가 직접 I/O 카드 드라이버와 통신하는 방법을 찾아야한다는 것을 의미합니다. Jesus, 난 .lib 또는 dll을 편집하는 방법을 모르겠다. ...

시간을내어 도와 주셔서 감사합니다!

+0

입니다 경우에 조건 같은 단지가 유효한 경우 hwnd1를 사용하면 검색 할 수있는 오류를 hwnd1 사용하여 코드를 확인 어디 프로그램 충돌을합니까? 충돌이 발생했을 때 스택 백 트레이스는 어떻게 보이나요? –

+0

문제는 사용 중에 전혀 충돌하지 않는다는 것입니다. 그것은 문제없이 1000Hours의 측정을했지만 창은 동결되었습니다 (다른 스레드는 잘 수행되었습니다). 디버거가 불평하지만 programm가 실행 중입니다. 무엇이 나를 궁금하게 만듭니다. – user3733593

+0

자신의 게시물과 여기에 붙여 넣은 디버거 출력을 읽으면 스택을 덤프하는 방법을 반드시 볼 수 있습니다. –

답변

1

코드를 편집기 행에 붙여 넣으면 75가 UpdateWindow 호출입니다. 이 경우 hwnd1은 0이라는 나쁜 신호입니다. UpdateWindow 호출에는 유효한 윈도우 핸들 (ShowWindow도 마찬가지입니다)이 필요합니다. CreateWindowW 호출이 실패하는 이유를 알아야합니다. 당신은 GetLastError()와 오류를 검색 할 수 있습니다, 참조 :

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx

반환 값 섹션을.

hwnd1은 0

+0

hwnd1에서 맞습니다. 유효하지 않은 것 같습니다. 이 문제를 어떻게 해결할 수 있습니까? – user3733593

+0

CreateWindowW가 0을 반환하는 경우 GetLastError() 호출을 추가하지 않은 경우 GetLastError가 반환하는 것은 무엇입니까? 오류 코드는 잘못된 점을 알려줍니다. –

+0

나는 이렇게했다 : 정수를 생성했다. er = GetLastError(); 디버거가 두 번 충돌하는 명령을 실행하게하십시오. Er의 값은 00000715입니다. Lord Google이 다음과 같이 말했습니다. 0x00000715 ERROR_RESOURCE_TYPE_NOT_FOUND => 지정한 리소스 유형을 이미지 파일에서 찾을 수 없습니다. 글쎄, 그건 해결의 측면에서 나에게 조금 의미합니다. – user3733593