C++ Dll in VB.Net pInvoken, nicht erkannt [ERRC 0x8007007E]

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    C++ Dll in VB.Net pInvoken, nicht erkannt [ERRC 0x8007007E]

    Hey liebe Community!
    Ich bin ein "noob" und habe keine Ahnung wie man solch einen Thread startet also starte ich mal mit dem üblichen "Ich hab keine Ahnung wie man anfängt..."


    Zu meinem Programm -> VB.Net (x32) Application die eine unmanaged/native C++ Dll nutzt um über den Kernel eine gewisse Mänge an Speicher im Heap allocated.


    Wozu? -> Neugierde und spaß am neuen verstehen (man kennts doch)

    Fehler (exakt) ->
    "System.DllNotFoundException: Die DLL "Engine.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
    bei Wibs.Form1.Retrv2(Byte[] bruh, Int32 x)
    bei Wibs.Form1.FL001() in C:\Users\Zeto\source\repos\ZYPHERJIX\Wibs\Form1.vb:Zeile 17."

    Was ich versucht habe:
    -Dll in Sys ordner Kopiert (einfach alle, es waren alle sys Ordern (verzweiflung war groß))
    -Dll über Declare und über DllImport "einbinden"


    VB - Code

    Quellcode

    1. <DllImport("Engine.dll")> Public Shared Function Retrv( ByVal x As Integer) As Integer
    2. End Function
    3. Declare Function Retrv2 Lib "Engine.dll" Alias "Retrv" ( ByVal x As Integer) As Integer
    4. Private Sub FL001() Handles MyBase.Load
    5. Try
    6. Retrv( 0)
    7. Catch ex As Exception
    8. Try
    9. Retrv2( 0)
    10. MsgBox(ex.ToString)
    11. Catch ex2 As Exception
    12. MsgBox(ex2.ToString)
    13. My.Computer.Clipboard.SetText(ex2.ToString)
    14. End Try
    15. End Try
    16. End Sub


    C++ Code [.Header]:

    C-Quellcode

    1. #pragma once
    2. #include <iostream>
    3. #include <string>
    4. #include <Windows.h>
    5. #include <TlHelp32.h>
    6. #include <fstream>
    7. #include <winbase.h>
    8. #ifdef ENGINE_EXPORTS
    9. #define LIBRARYINJECT_API __declspec(dllexport)
    10. #else
    11. #define LIBRARYINJECT_API __declspec(dllimport)
    12. #endif
    13. extern "C" LIBRARYINJECT_API int __stdcall Retrv( int x);
    14. extern "C" LIBRARYINJECT_API int __stdcall BsPsDn();


    Dll - code [Class]

    Quellcode

    1. extern "C" LIBRARYINJECT_API int __stdcall Retrv( int kr)
    2. {
    3. HANDLE gPH;
    4. gPH = GetProcessHeap();
    5. LPVOID meSS = HeapAlloc(
    6. gPH,
    7. HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY,
    8. 300000000
    9. );
    10. if (meSS != 0)
    11. {
    12. if (HeapFree(gPH,
    13. HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY,
    14. meSS)) {
    15. return 420;
    16. }
    17. else
    18. {
    19. return 2;
    20. }
    21. }
    22. else
    23. {
    24. return 0;
    25. }
    26. }


    WICHTIG!!!!

    Auf meinem PC funktioniert alles, nur nicht in der virtuellen Maschine (VirtualBox & VmWare).

    Dependency-Walker spuckt mir nur Errors aus, die System-dlls sind jedoch alle korrekt (schon ausgetauscht, neuaufgesetzt etc.)

    Die richtigen versionen .Net 4.0 und VC++ 10 sind installiert (obwohl es richtiges C++ ist, was ich verwende aber sicherheit geht vor)




    sorry für Rechtschreibfehler, ich respektiere euch und vielen Dank im Voraus!
    Lg, Ich

    whitesoul19 schrieb:

    "System.DllNotFoundException: Die DLL "Engine.dll": Das angegebene Modul wurde nicht gefunden.
    Steht doch da.
    Das Programm findet die Datei nicht.
    So wie der Code aussieht, sollte die DLL unmittelbar neben der Exe liegen.
    Wo relativ zur Exe liegt sie?
    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!
    Vielen dank schon mal für die schnelle Antwort :D

    Ich habe die Dll im selben Ordner wie die Application, habe ebenso schon die Dll in die Sys Ordner copiert und nichts ging, auf meinem Main-System geht es, auf der VM jedoch nicht :/

    EDIT: ich habe nun eine neue DLL erstellt, die sehr simpel ist (code folgt)
    -> die DLL kann trotzdem nicht benutzt werden, eine fehlerhafte DLL ist auszuschließen.

    Installation anderer Programme ist dennoch möglich, was bedeutet, dass die Dll-nutzung funktionieren kann.

    neuer DLL code: Header

    C-Quellcode

    1. [c]#pragma once
    2. #include <Windows.h>
    3. #include <iostream>
    4. #ifdef DPL_EXPORTS
    5. #define DPL_API __declspec(dllexport)
    6. #else
    7. #define DPL_API __declspec(dllimport)
    8. #endif
    9. extern "C" DPL_API int __stdcall GETLOC();[/c]


    neuer DLL code: Classe

    Quellcode

    1. #include "Header.h"
    2. extern "C" DPL_API int __stdcall GETLOC() {
    3. return 0;
    4. }

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „whitesoul19“ ()

    @whitesoul19 Passt zwar nicht zur Fehlermeldung, aber probierma
    x86
    oder
    x64
    nicht aber AnyCPU.
    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 hatte Dll und Anwendung in Debug und release auf x64 gestellt, der Error ist gleich



    Ich habe die Architektur nun auf x64 umgestellt, interessant ist hierbei, dass die Fehlermeldung nun eine andere ist.
    Den Error habe ich heraus provoziert um festzustellen, ob die DLL gefunden werden konnte.

    EDIT: Also, die DLL war in x64 und die Anwendung in x32 compiliert.



    Es war zu begin des Projekts in32 Bit (Anwendung + DLL) auf einer 64-Bit VM getestet.

    whitesoul19 schrieb:

    der Error ist gleich
    Nö.
    Unten das ist der x86-x64-Fehler, oben wird eine "DPL.dll" nicht gefunden.
    Ich denke mal, dass da einfach noch mindestens eine weitere DLL benötigt wird, wenn die "Engine.dll" geladen wird.
    In diesem Falle hast Du in Post #1 den Fehlertext falsch abgeschrieben.
    Also:
    Beim nächsten Mal gleich nen Screenshot machen.
    Und:
    Mit Alt+Druck wird nur das aktive Fenster fotografiert.
    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!
    Den Fehler habe ich eben herausprovozieren wollen, um feststellen zu können,
    ob die Engine.dll für die Anwendung "existiert".

    Der Errorcode ist ein direkter Copy über My.Computer.Clipboard.SetText(exception.ToString())
    und somit genau das, was mir die Anwendung rausgibt.

    Die Screenshots enthalten alle Fehlermeldungen die ich bekomme.

    Wichtig: Diese Errors treten nur in den virtuellen Umgebungen auf (VMs) jedoch nicht auf meinem PC oder den meines Freundes. Es liegt wohl an der VM jedoch weiß ich nicht weshalb.

    EDIT: Die DLL hat nun einen anderen Code und benötigt keine weiteren DLL's...
    Bitte alles durchlesen, ich habe genau geschildert, was ich versucht habe...


    Der Sourcecode der DLL ist auch zu finden!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „whitesoul19“ ()

    whitesoul19 schrieb:

    Der Sourcecode der DLL ist auch zu finden!
    Dann füge das DLL-Projekt Deiner Projektmappe hinzu und verweise im Hauptprogtamm auf das Projekt, nicht aber auf die DLL.
    Feddich.
    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!