0xC0000005: Zugriffsverletzung ausführen Position 0x00000000
Schreibe ich ein MFC-Projekt, versuchen Sie, rufen Sie eine Funktion in die DLL wird wieder einige Informationen in einem string. Die Funktion in der DLL ist wie folgt:
int GetInfo(char* Info)
Die Funktion 0 zurück, wenn Erfolg. Informationen zurückgegeben werden, die in der string-parameter. Die aufrufende routine ist wie folgt:
typedef int (WINAPI *FUNC1)(char* szInfo);
HINSTANCE hinstLib;
FUNC1 GetInfo;
char szInfo[50];
hinstLib = LoadLibrary(TEXT("DevInfo.dll"));
//If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
GetInfo = (FUNC1) GetProcAddress(hinstLib, "GetInfo");
//If the function address is valid, call the function.
if (NULL != GetInfo)
{
if((GetInfo) (szInfo)) //Error here!!
{
AfxMessageBox(_T("Error Reading"));
}
}
FreeLibrary(hinstLib);
}
Diesem code keinen Fehler beim kompilieren und verknüpfen. Bei der Ausführung wird es wieder den Fehler "Zugriffsverletzung ausführen Position 0 x 00000000" an der Stelle oben angegeben. Kann jemand Rat?
int WINAPI(char*)
und int(char*)
sind nicht das gleiche. Ihre Funktion sollte mindestens Prototyp als int WINAPI GetInfo(char*)
Sind Sie sicher, dass der Fehler dort und nicht in der
GetInfo
Funktion?Was macht der debugger zeigen, wie der Aufruf-stack, etc, wenn die exception geworfen wird?
Ich habe nicht den DLL-code. Somit kann es nicht ändern, die Funktion. Ich habe versucht, die änderung der typedef int (WINAPI FUNC1)(char szInfo) typedef int (FUNC1)(char szInfo) und noch immer den gleichen Fehler.
Der call-stack wird gezeigt, wie Sie 00000000() [Frames unten vielleicht falsche und/oder fehlende] DevInfo.dll!002711eb()
InformationsquelleAutor user2845698 | 2013-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du versucht zu schreiben (oder zu dereferenzieren) einen NULL-Zeiger. Als Sie überprüft alle möglichen Null-Werte an den aufrufenden code, der Fehler höchstwahrscheinlich in deinem code genannt.
Wenn Sie überprüft haben Ihre namens-code und kann nicht einen Grund finden, sich für eine null-Verweis-Ausnahme gibt es entweder, berücksichtigen Sie, dass Sie verpasst haben, zu entsprechen, die Aufrufkonventionen richtig. Der Typ des funktionszeigers, sollte GENAU das gleiche wie in Ihrer Bibliothek:
Für
int GetInfo(char* Info)
die Typdefinition solltetypedef int (*FUNC1)(char* szInfo);
Nein, ich als. Und ich habe es weggelassen, weil die alle irgendwie komisch Sachen passiert, wenn Sie nicht übereinstimmen, aber dies wäre das erste mal, dass ich eigentlich jemand bekommen, der eine lesbare Fehlermeldung aus Stapel unbalancing. Bitte beachten Sie auch, dass ich sagte "wahrscheinlich", weil ohne die genannten code, es ist eine Vermutung, am besten.
Was wäre ein nicht lesbar Fehler dann? Und was tut der Lesbarkeit zu tun haben mit der stack überhaupt?
Ich weiß nicht, wie Menschen, die downvote und kritisieren, ohne eine Anstrengung, um die tatsächlich zu verbessern. Falls meine Antwort war flach und falsch, oder er hatte geschrieben eine bessere Antwort oder geholfen hat der original poster in irgendeiner Weise, würde ich anders darüber denken. Hat er aber nicht. Zu der Zeit unserer Kommentar, der post war auf "-1", die ich denke, ist völlig unbegründet, nur weil ich nicht das wiederholen, was andere schon gesagt.
Ich denke deine Antwort wäre besser, wenn es detaillierter wird die Aufruf-Konvention überein. Es spielt keine Rolle, wenn andere gesagt haben, es in die Kommentare. Sollten Sie sagen es hier der Vollständigkeit halber aufgeführt. Die Tatsache, dass jemand nicht geschrieben Ihre eigene Antwort in keiner Weise disqualifizieren Sie aus kommentieren andere. Sie haben keine Ahnung, wer eigentlich downvoted. Ich würde sagen, dass @IInspectable ist ein gut, ALSO Benutzer, die macht eine Menge guter Beiträge.
InformationsquelleAutor nvoigt
Es ist auch möglich, dass mehr als 50 Zeichen werden in den buffer geschrieben (szInfo):
char szInfo[50];
Glauben Sie falsch verstanden, Jay ' s Absicht. Es ist gemeint als: "Eine Möglichkeit unter mehreren." I.-e. Zusätzlich zu den anderen Antworten.
InformationsquelleAutor Jay