DLL weitergeben

  • C++/CLI

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

    DLL weitergeben

    Hey.
    Ich habe eine CLI Dll gemacht mit WinForms.

    MainForm.cpp:

    C-Quellcode

    1. #include "MainForm.h"
    2. using namespace Test;
    3. [STAThreadAttribute]
    4. int Main()
    5. {
    6. Application::EnableVisualStyles();
    7. Application::SetCompatibleTextRenderingDefault(false);
    8. Application::Run(gcnew MainForm());
    9. return 0;
    10. }


    main.cpp:

    C-Quellcode

    1. #include "linker.h"
    2. #include <windows.h>
    3. BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
    4. switch(fdwReason)
    5. {
    6. case DLL_PROCESS_ATTACH:
    7. DisableThreadLibraryCalls(hinstDLL);
    8. CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Main, NULL, 0, NULL);
    9. break;
    10. }
    11. return true;
    12. }


    MainForm.h ist dann das GUI.

    Jetzt habe ich ein Problem.
    Das GUI ist einfach nicht sichtbar auf anderen PC´s. Es öffnet sich nicht. Es kommen keine Fehler, nichts, aber auch kein Fenster was ich gemacht habe.
    Wenn ich DLL´s ohne GUI mache, also kein CLI, brauche ich nur "Laufzeitbibliothek" auf "Multithreaded (/MT)" stellen statt "Multithreaded-DLL (/MD)" damit die Console auch andere Computer öffnen können.
    Doch bei CLI kann ich das nicht umstellen:



    Ist ja auch klar irgendwie :D
    Habe schon am Testpc c++ redistributable installiert, alles hilft nichts. Was braucht der Benutzer so einer DLL um sie zu "öffnen"? Oder wie linke ich das Projekt korrekt?
    Gemacht ist das ganze in Visual Studio 2013.

    Stehe da grade auf dem Schlauch.
    Vielen Dank für jede Lösung :D
    Mfg.
    1. Bevor hier Leute noch den falschen weg nehmen: Warum zur Hölle willst du überhaupt C++ CLI verwenden?
    2. mach dir doch mal einfach paar MessageBoxen(kannst ja WinAPI verwenden) in den Einstiegspunkt um nen paar Infos rauszubekommen, ich könnte mir vorstellen, dass die DLL schlicht und einfach nicht geladen wird...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Frage 1 hast immernoch nicht beantwortet.
    Das Problem sehe ich eher beim injecten selbst - wir injectest du(code, fertiges Programm)
    Hast du das mit msgbox versucht, was ist das Ergebnis? Wird dein eintrittspunkt aufgerufen und mit welchen parametern?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich hab jetzt halt lange daran gearbeitet.

    Habe nun MessageBoxen eingebaut und die DLL an eine Testperson ohne VS2013 geschickt:


    main.cpp:

    C-Quellcode

    1. ​#include "linker.h"
    2. #include <windows.h>
    3. BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
    4. switch (fdwReason)
    5. {
    6. case DLL_PROCESS_ATTACH:
    7. MessageBox(0, "Attached", "DLL Message", MB_OK | MB_ICONINFORMATION);
    8. DisableThreadLibraryCalls(hinstDLL);
    9. MessageBox(0, "Disabled ThreadLibraryCalls", "DLL Message", MB_OK | MB_ICONINFORMATION);
    10. CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Main, NULL, 0, NULL);
    11. MessageBox(0, "Created Main", "DLL Message", MB_OK | MB_ICONINFORMATION);
    12. break;
    13. }
    14. return true;
    15. }


    Bei ihm kam nicht eine MessageBox und der Prozess startete normal..
    Bei mir kommen alle MessageBoxen.
    Ähm - können jvbsl und Gonger mal eine Antwort bekommen?
    Warum hälst du an einer C++ - Version fest, die keinen Vorteil gegenüber c# oder vb.net hat, die konzeptionell und architektonisch Schrott ist, und die diverse C++ - Standards mit Füßen tritt?

    Es bringt keine Performance, denn es wird ins selbe IL übersetzt.
    Und lernen tuste da auch nix, sondern aufgrund des konzeptionellen Schrotts gewöhnst du dir da nur Sch... an.

    ErfinderDesRades schrieb:

    Warum hälst du an einer C++ - Version fest, die keinen Vorteil gegenüber c# oder vb.net hat, die konzeptionell und architektonisch Schrott ist, und die diverse C++ - Standards mit Füßen tritt?

    Besser hätte mans nicht formulieren können ;)

    Das was ich hier sehe ist der Versuch eine verwaltete Dll mit nativem Einstiegspunkt in einen fremden Prozess zu injecten. Wozu das?
    naja, erstell ein Projekt - vb oder c#, Typ Klassenbibliothek, gib ihm einen Verweis auf Winforms, und mach deine Forms da rein.

    ich mach üblicherweise ein WinForms-Projekt, und nachträglich ändere ich den ProjektTyp auf Klassenbibliothek.
    Dann weiß ich, dasss die für WinForms nötigen Verweise bereits korrekt gesetzt sind.

    TheGameSiders schrieb:

    Es muss aber
    Poste bitte mal eine vollständige und belastbare Problembeschreibung.
    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!