Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Call DLL from Memory Error (https://www.delphipraxis.net/183256-call-dll-memory-error.html)

Lyan 23. Dez 2014 21:29

Call DLL from Memory Error
 
Hi,

habe grade ein Problem, leider in c++, daher versuche ich das Problem mal in reine Worte zu verfassen.

Ich habe ein Programm welches mir eine DLL aus dem Speicher lädt und mappt. Das funktioniert soweit,
allerdings wenn aus dieser DLL Funktionen aus einer anderen DLL geladen und aufgerufen werden crasht das Programm.

Die DLL funktioniert einwandfrei wenn sie nicht aus dem Speicher, sondern mit LoadLibrary geladen wird.


Hat jemand eine Idee woran das liegen könnte?

Vielen Dank für die Hilfe.

himitsu 23. Dez 2014 23:05

AW: Call DLL from Memory Error
 
Natürlich könnte man noch verrate wie man die DLL läd, da das ja kein Standardverhalten ist.

Grundsätzlich würde ich jetzt mal vermuten, daß eventuell die DLL falsch geladen und z.B. vergessen wurde irgendwelche Reallocations aufzulösen/anzupassen oder daß die Importe nicht richtig geladen und verlinkt wurden.

ODER ... Ist die DLL von dir? ... die Aufrufkonventionen oder Funktionsparameter sind falsch deklariert. :stupid:

Zacherl 24. Dez 2014 00:11

AW: Call DLL from Memory Error
 
Zitat:

Zitat von Lyan (Beitrag 1284604)
allerdings wenn aus dieser DLL Funktionen aus einer anderen DLL geladen und aufgerufen werden crasht das Programm.

Ja, definitiv die Imports nicht (korrekt) resolved, wenn es nur dann auftritt, wenn du eine importierte Funktion aufrufen willst.

Lyan 24. Dez 2014 11:21

AW: Call DLL from Memory Error
 
Ja genauer gesagt habe ich eine selbstgeschriebene DLL, die mit winsock (ws2_32.dll) einen Speedtest durchführt.
Meine DLL funktioniert einwandfrei wenn ich sie normal mit Loadlibrary lade. Sie crasht jedoch immer dann wenn ich sie aus dem Speicher lade und versuche eine Funktion aus der ws2_32.dll aufzurufen.
Mein Programm, das die DLL lädt hat ws2_32 schon geladen, d.h. meine DLL die aus dem Speicher geladen wird, holt sich das Handle einfach via GetModuleHandle().

Habe mir aus meinem Mainprogramm die Adresse von socket() ausgeben lassen, welche mit der Adresse von msocket() (dynamisch gecallt) aus meiner DLL übereinstimmt. Beim Versuch msocket() aus der dll zu callen crash, wie schon gesagt.

Ich denke den Code brauch ich nicht zu posten, da ich ihn komplett posten müsste (sind zu viele Macros etc, um codeparts zu posten) was wiederum eine Zumutung wäre zu verlanden das alles durchzulesen^^

Hoffe einfach auf jemanden der ein ähnliches Problem hatte oder sich vorstellen kann woran es liegen könnte.

Zacherl 24. Dez 2014 12:45

AW: Call DLL from Memory Error
 
Unmöglich das ohne konkreten Code zu sagen. Wenn du dein Projekt mal anhängst, würde ich mich erbarmen mal drüberzuschauen. Was benutzt du denn zum manual mappen? Was selbstgeschriebenes oder eine fertige Lösung wie BlackBone?

Lyan 24. Dez 2014 15:34

AW: Call DLL from Memory Error
 
Zacherl+1. Vielen dank für die große Hilfe die du mir anbietest! Das Problem war viel zu simple -es hat nur wsastartup gefehlt:oops:

Neutral General 25. Dez 2014 17:26

AW: Call DLL from Memory Error
 
Nur aus Interesse: Warum tut man sowas? Warum kein LoadLibrary?

Lyan 6. Jan 2015 08:21

AW: Call DLL from Memory Error
 
Zitat:

Zitat von Neutral General (Beitrag 1284677)
Nur aus Interesse: Warum tut man sowas? Warum kein LoadLibrary?

Mein Programm funktioniert mit Modulen. Ein Modul, bzw. eine DLL führt einen Speedtest für den Upload durch. Das Programm bekommt diese DLL nicht gleich mitgeliefert - es bekommt via tcp den Downloadlink zu einem unbestimmten Zeitpunkt gesendet. Die DLL wird dann also runtergeladen und befindet sich dann verschlüsselt im Arbeitsspeicher. Sie darf nicht dekodiert auf das filesystem gedroppt werden - deshalb dekodiere sie ich sie zur Laufzeit im Speicher und mappe sie dann. Was dann passiert geht ja mehr oder weniger aus meiner Frage hervor..

himitsu 6. Jan 2015 10:33

AW: Call DLL from Memory Error
 
Dann kopiert man sich eben diese Datei schön fertig entschlüsselt aus dem Arbeitsspeicher. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz