Debug Assertion Failed: _CrtIsValidHeapPointer(block)

  • C++

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Debug Assertion Failed: _CrtIsValidHeapPointer(block)

    Hallo zusammen,

    Ich bin dabei mich etwas in C++ einzuarbeiten und habe schon den ersten Fehler wozu ich keine Lösung finden kann.

    Cpp

    C-Quellcode

    1. namespace Core
    2. {
    3. Information ExtractInformation(string utf8pdf)
    4. {
    5. Information out;
    6. out.Author = "test";
    7. out.CreationDate = "test";
    8. out.Creator = "test";
    9. out.ModDate = "test";
    10. out.Producer = "test";
    11. out.Title = "test";
    12. out.Version = 1.5;
    13. return out;
    14. }
    15. }

    h

    C-Quellcode

    1. #include "string"
    2. using namespace std;
    3. namespace Core
    4. {
    5. class Information {
    6. public:
    7. string Author;
    8. string Title;
    9. string Creator;
    10. string Producer;
    11. string CreationDate;
    12. string ModDate;
    13. double Version;
    14. };
    15. extern "C" __declspec(dllexport) Information ExtractInformation(string utf8pdf);
    16. }


    Sobald ich dann in C# die Funktion über DLLImport aufrufen möchte bekomme ich eine Fehlermeldung:




    Was mach ich falsch und weshalb kommt diese Fehlermeldung. ?(
    @LonelyGrayWolf Irgendwie stimmt Deine Deklaration nicht oder Du verwendest eine falsche Strin-Deklaration (Ansi / Unicode).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde das ein bisschen anders machen.

    Die einfachste Vorgehensweise so über den Daumen beschrieben und ungetestet

    - Hol dir eine neue Instanz mit new (das wäre ein Pointer) von deiner Klasse Information.

    VB.NET-Quellcode

    1. <DllImport("MyDll.dll")>
    2. Public Function Instance() As IntPtr
    3. End Function

    C-Quellcode

    1. EXP32 Information * _stdcall Instance(){ return new Information;}


    - Im Gegenzug mach dir auch gleich eine Dispose Methode in deiner Dll, um den Pointer wieder zurückzusetzen mit delete instance; also Dispose(inst as intptr)

    - Füll deine Instanz mit Werten, mit deiner Funktion ExtractInformation(inst as intptr)

    - Hol die die einzelnen Variablen jeweils mit einer Funktion. Z.B. Author

    VB.NET-Quellcode

    1. <DllImport("MyDll.dll")>
    2. Public Function Author(ByVal inst As IntPtr,byref sz as int32) As IntPtr
    3. End Function

    C-Quellcode

    1. EXP32 const char* _stdcall Author(Information *instanc,int &sz)
    2. {
    3. sz = instanc->Author.length();
    4. return instanc->Author.c_str();
    5. }


    Was du mit IntPtr zurückbekommst, musst du noch umwandeln in eine Byte-Array

    VB.NET-Quellcode

    1. Dim b = New Byte(sz - 1) {}
    2. Marshal.Copy(authorptr, b, 0, b.Length)
    3. Dim strauthor = Encoding.UTF8.GetString(b)


    Es gibt ein bisschen Schreibarbeit.
    Ist aber eine einfache Vorgehensweise, ohne vorherige komplizierte Marshalling.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()