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 SubKann mir da jemand weiterhelfen?
Ronnie
-
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,alDebug-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