Access Violation NTDLL.DLL



  • Hallo zusammen.
    Ich habe eine DLl in der ein Webcambild eingelesen wird und in Graustufe umgewandelt wird. Beim Aufruf einer Prozedur erhalte ich aber immer den Fehler "Access Violation...".
    Hier der Code aus der Dll sowie der Aufruf aus dem VB-Programm:

    // ImageProcessor.cpp : Definiert den Einsprungpunkt für die DLL-Anwendung.
    //
    
    #include "stdafx.h"
    #include "VFW.h"
    
    unsigned char *Buffer ;			//Zeiger auf den Pic-Buffer
    BITMAPINFO BmpInfo ={0};		//Bitmapinfo				
    DWORD ArrWidth;			//Weite des Buffer-Arrays
    HDC hBufferDC;							//DC des Buffers
    HGDIOBJ hObject;						//GDI-Objekt
    HWND m_CamHandle;
    HWND DestinateWin;
    CAPSTATUS CapStatus;
    unsigned char *grayImage;
    unsigned char *workingImage;
    
    LRESULT FAR PASCAL _FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr);
    
    //------------------------------------------------------------------------
    // Die folgende Funktion unverändert belassen
    
    BOOL WINAPI DllEntryPoint ( HINSTANCE hDLL, DWORD dwREASON, LPVOID Reserved )
    {
    	switch (dwREASON)
        { 
    		case DLL_PROCESS_ATTACH: {
    									break; 
    								 }
    
    		case DLL_PROCESS_DETACH: {
    									break; 
    								 } 		 
        }
    	return TRUE;
    }
    
    //------------------------------------------------------------------------
    
    void _stdcall OpenCam(HWND LiveWnd,HWND DestWnd)
    {
    	m_CamHandle = capCreateCaptureWindow("Capture",WS_CHILD|WS_VISIBLE,0,0,320,240,LiveWnd,1);
    //	::SendMessage(m_CamHandle,WM_CAP_DRIVER_CONNECT,0,0);
    //	capGrabFrameNoStop(m_CamHandle);
    	capDriverConnect(m_CamHandle, 0);
    	::SendMessage(m_CamHandle,WM_CAP_SET_PREVIEWRATE,30,0);
    	::SendMessage(m_CamHandle,WM_CAP_SET_OVERLAY,1,0);
    	::SendMessage(m_CamHandle,WM_CAP_SET_PREVIEW,1,0);
    	DestinateWin = DestWnd;
    	capGetStatus(m_CamHandle,&CapStatus,sizeof(CapStatus));
    	BmpInfo.bmiHeader.biSize = sizeof(BmpInfo.bmiHeader);
    	BmpInfo.bmiHeader.biHeight = CapStatus.uiImageHeight ;
    	BmpInfo.bmiHeader.biWidth = CapStatus.uiImageWidth ;
    	BmpInfo.bmiHeader.biPlanes = 1;
    	BmpInfo.bmiHeader.biBitCount = 24;
    	capSetVideoFormat(m_CamHandle, &BmpInfo, sizeof(BITMAPINFO));
    }
    
    void _stdcall CloseCam()
    {
    
    	::SendMessage(m_CamHandle,WM_CAP_DRIVER_DISCONNECT,0,0);
    }
    
    void _stdcall StartCallback()
    {
    //	BmpInfo = {0};
    	grayImage = new unsigned char[3*CapStatus.uiImageHeight * CapStatus.uiImageWidth];
    	workingImage = new unsigned char[3*CapStatus.uiImageHeight * CapStatus.uiImageWidth];
    	capSetCallbackOnFrame(m_CamHandle,(LPVOID) _FrameCallbackProc);
    	capGrabFrameNoStop(m_CamHandle);
    
    }
    
    void _stdcall StopCallback()
    {
    
    	capSetCallbackOnFrame(m_CamHandle,NULL);
    
    }
    
    /*
    Die Anordnung der Farben ist nicht RGB sondern BGR
    Das Bild müsste von unten links nach oben rechts im Speicher liegen
    */
    
    LRESULT FAR PASCAL _FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr) {
    
    	LARGE_INTEGER lStart, lEnd, lFreq;
    	QueryPerformanceFrequency(&lFreq);
    	QueryPerformanceCounter(&lStart);
    
    	char buffer[20];
    	unsigned long y;
    	long gray;
    	unsigned char* capPointer =(unsigned char*)(lpVHdr->lpData);
    	HDC DestDC = ::GetDC(DestinateWin);
    	ArrWidth = lpVHdr->dwBufferLength ;
    
    		for(y=0;y<=lpVHdr->dwBufferLength;(y+=3))
    		{
    			gray = ((capPointer[y] * 30) + (capPointer[y+1] *60) + (capPointer[y+2] *10))/100;
    /*		if(gray >= 100)
    		{
    		grayImage[y] = 255;
    		grayImage[y+1] = 255;
    		grayImage[y+2] = 255;
    		}
    		else
    		{
    		grayImage[y] = 0;
    		grayImage[y+1] = 0;
    		grayImage[y+2] = 0;
    		}
    		*/
    		grayImage[y] = capPointer[y];
    		grayImage[y+1] = capPointer[y+1];
    		grayImage[y+2] = capPointer[y+2];
    		}
    //	::SetDIBitsToDevice(DestDC,0,0,CapStatus.uiImageWidth ,CapStatus.uiImageHeight ,0,0,0,CapStatus.uiImageHeight ,grayImage,&BmpInfo,DIB_RGB_COLORS);	//Bits in der Picturebox setzen
    //	::ReleaseDC(DestinateWin,DestDC);
    
    	QueryPerformanceCounter(&lEnd);
    	int ms=((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart ;
    	itoa(ms,buffer,10);
    	return 1;
    
    } 
    
    void _stdcall GrabImage_and_Grayscale()
    {
    	unsigned long y;
    	long gray;
    	HDC DestDC = ::GetDC(DestinateWin);
    	for(y=0;y<=ArrWidth;(y+=3))
    		{
    			gray = ((grayImage[y] * 30) + (grayImage[y+1] *60) + (grayImage[y+2] *10))/100;
    			workingImage[y] = gray;
    			workingImage[y+1] = gray;
    			workingImage[y+2] = gray;
    		}
    	::SetDIBitsToDevice(DestDC,0,0,CapStatus.uiImageWidth ,CapStatus.uiImageHeight ,0,0,0,CapStatus.uiImageHeight ,workingImage,&BmpInfo,DIB_RGB_COLORS);	//Bits in der Picturebox setzen
    	::ReleaseDC(DestinateWin,DestDC);
    }
    
    void _stdcall GrabImageGray_and_Histogram(long H[])
    {
    	int x;
    	unsigned long y;
    	long gray;
    	long Ht[256] = {0};
    	HDC DestDC = ::GetDC(DestinateWin);
    	for(y=0;y<=ArrWidth;(y+=3))
    		{
    			gray = ((grayImage[y] * 30) + (grayImage[y+1] *60) + (grayImage[y+2] *10))/100;
    			Ht[gray]++;
    			workingImage[y] = gray;
    			workingImage[y+1] = gray;
    			workingImage[y+2] = gray;
    		}
    
    	::SetDIBitsToDevice(DestDC,0,0,CapStatus.uiImageWidth ,CapStatus.uiImageHeight ,0,0,0,CapStatus.uiImageHeight ,workingImage,&BmpInfo,DIB_RGB_COLORS);	//Bits in der Picturebox setzen
    	::ReleaseDC(DestinateWin,DestDC);
    	for(x=0;x<=255;x++)
    	{
    		H[x] = Ht[x];
    	}
    }
    

    Der Aufruf:

    Private Sub Command6_Click()
    Dim H(0 To 255) As Long
    Dim x As Integer
    For x = 0 To 255
        H(x) = 0
    Next x
    GrabImageGray_and_Histogram (H(0))
    End Sub
    

    Kann mir da jemand weiterhelfen?

    Ronnie


  • Mod

    Callstack zeigt was?
    Lass es crahsen und attache den Debugger, wenn es nicht schon im Debugger läuft. Dan schu Dir an welcher Array vermutlich zu klein ist.



  • Hallo.
    Also, die Array sind nicht zu klein.
    Das komische ist, dass der Fehler auftaucht wenn die Prozedur beendet wird und auch nur wenn die Webcam angeschlossen ist.

    Ronnie



  • Hallo.
    Also, ich hab mich geirrt. Es crasht jetzt auch ohne Webcam.
    Hab hier mal einen Auszug von der Aufrufliste und dem Debug-Fenster:

    letzte 10 Einträge in Aufrufliste zum Zeitpunkt des Crash:
    NTDLL! 7c91eddc() push ebx
    NTDLL! 7c9479d6() test byte ptr [eax+5Fh],4
    NTDLL! 7c94799c() cmp dword ptr [ebp-4],0
    NTDLL! 7c9478c5() xor ebx,ebx
    NTDLL! 7c94783a() test al,al
    NTDLL! 7c91eafa() or al,al
    NTDLL! 7c91378b() pop edi
    NTDLL! 7c91eafa() or al,al
    NTDLL! 7c91378b() pop edi
    NTDLL! 7c91eafa() or al,al

    Debug-Fenster:
    Nicht abgefangene Ausnahme in Projekt1.exe (MSVBVM60.DLL): 0xC0000005: Access Violation.
    Nicht abgefangene Ausnahme in Projekt1.exe: 0xC0000005: Access Violation.
    Nicht abgefangene Ausnahme in Projekt1.exe: 0xC0000005: Access Violation.
    Nicht abgefangene Ausnahme in Projekt1.exe: 0xC0000005: Access Violation.
    Nicht abgefangene Ausnahme in Projekt1.exe: 0xC0000005: Access Violation.
    .
    .wiederholt sich mehrere 100 mal
    .
    Nicht abgefangene Ausnahme in Projekt1.exe (NTDLL.DLL): 0xC0000005: Access Violation.

    Vielleicht kann ja jemand was damit anfangen.

    ronnie



  • Hallo zusammen,
    kann mir denn da wirklich niemand helfen??

    Ronnie


Anmelden zum Antworten