Unbehandelte Ausnahme, Access Violation
-
Hallo,
ich möchte eine DLL erstellen mit C++ und diese dann aus Visual Basic aufrufen. Meine testdll.cpp sieht so aus:
#include <windows.h> #include <string.h> #include "testdll.h" #define WINAPI __stdcall long WINAPI TestBMP (HBITMAP hBmp) { BITMAP bm; BITMAP * bm2; long row; long col; long i; BYTE bPixel; GetObject( hBmp, sizeof(BITMAP), &bm ); bm2 = new BITMAP; bm2->bmBitsPixel = bm.bmBitsPixel; bm2->bmHeight = bm.bmHeight; bm2->bmPlanes = bm.bmPlanes; bm2->bmType = bm.bmType; bm2->bmWidth = bm.bmWidth; bm2->bmWidthBytes = bm.bmWidthBytes; memcpy(bm2->bmBits,bm.bmBits, bm.bmWidthBytes * bm.bmHeight); //weitere Verarbeitung folgt noch return (long)hBmp; }die header-datei testdll.h:
extern "C" __declspec(dllexport) long WINAPI TestBMP (HBITMAP hBmp);der Aufruf aus Visual Basic klappt ganz gut, nun kommt aber dieser Fehler:
Unbehandelte Ausnahme in Testprojekt.exe (TESTDLL.DLL): 0xC0000005: Access Violation.
bei der Zeile mit memcpy!
Testprojekt.exe ist mein VB Projekt... an diesem sollte es nicht liegen...
ich denke dass die DLL kein Zugriff auf den Speicher hat!? nun wie kann ich dennoch drauf zugreifen? gibt es einen umweg?
Vielen Dank im Voraus
Gruß
Steffen
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
debuggen?!
-
Warum allokierst Du 'bm2' denn dynamisch ?
-
wenn ich
bm2.bmBits = malloc(bm.bmWidthBytes * bm.bmHeight);davor mache dann geht alles

aber ich brauche nun das bm2 doch nicht, kann den speicher ja auch direkt ändern...
danke für eure Bemühungen!:)
-
Steffen82 schrieb:
wenn ich
bm2.bmBits = malloc(bm.bmWidthBytes * bm.bmHeight);davor mache dann geht alles

Kein Wunder - wenn du keinen Speicher für die Bits anlegst, zeigt der Zeiger ins Nirvana (und da hast du Glück gehabt, daß er in einen 'verbotenen' Speicherbereich gezeigt hat - im Ernstfall kommt nämlich gar keine Meldung und du zerlegst dir unbemerkt Speicher, den du woanders noch benötigst).