![]() |
Dll von *.res Datei laden
Habe eine Resourcendatei erstellt und dort eine DLL eingebunden
wie kann ich die jetzt aus dieser laden ? Hab hier schon gesucht aber keine Infos gefunden Also nicht aus einer EXE oder DLL sondern aus der *.res Datei gruss Emil |
Re: Dll von *.res Datei laden
Beim Programmstart aus der Ressource ins Temp-Dir extrahieren,
während der laufzeit dynamisch drauf zugreifen und bein Beenden wieder vom Filesystem entfernen. |
Re: Dll von *.res Datei laden
Zitat:
dann will ich sie auch nicht auf die Platte schreiben sondern mit MemoryModule direkt im speicher ausführen. Die DLL hat nur eine größe von 3,5 K da macht es keinen sinn die Datei im projekt mit auszuliefern. mit welcher API oder reicht da
Delphi-Quellcode:
var
DLL : Pointer; begin irgendwas.machmal := DLL, Pchar('geladen'); end; nein im ernst ein kleines sample wäre nicht schlecht oder zumindest die API funktionen die ich benutzen muss. gruss Emil |
Re: Dll von *.res Datei laden
Ungebrüft und absolut ungetestet !!!
Ressource extrahieren ![]() DLL dynamisch laden
Delphi-Quellcode:
Am besten kapselst du die DLL-Funktionen in eine Klasse, dann bleibt der Code schön aufgeräumt
type
TMyFunc = function (p: PChar): Boolean; var mylib: THandle; myfunc: TMyFunc; begin mylib := LoadLibrary(PChar('Pfad\zu\meiner.dll')); if mylib <> 0 then begin myfunc := TMyFunc(GetProcAddress(mylib, PChar('myfunc'))); if myfunc(PChar('blah')) then begin { weiss auch nich :P } end; end; FreeLibrary(mylib); end; |
Re: Dll von *.res Datei laden
Zitat:
habe es aber auch oben geschrieben .. trotzdem Danke Ich möchte meine DLL welche sich in meiner 'additional.res' befindet in den speicher zu laden. dort wird sie direkt ausgeführt ohne sie auf die Platte zu speichern EDIT: habe mir das beispiel mal angeschaut!
Delphi-Quellcode:
für was steht HInstance?
procedure TForm1.Button1Click(Sender: TObject);
var ResStream: TResourceStream; begin ResStream := TResourceStream.Create(HInstance, 'Sounds', 'WAV'); ResStream.SaveToFile('Sound1.wav'); // brauch ich nicht ResStream.Free; end; Da ich keine dll vom Pfad lade .. reicht es nicht wenn man anstelle dessen nur ein 0 übergibt? gruss Emil |
Re: Dll von *.res Datei laden
Was spricht dagegen sie über einen TRessourcestream und Savetofile ins Tempdir zu extrahieren?
Wie das geht hab ich im Post oben mal was hier aus dem Board verlinkt. Wie du ans Tempdir kommst findest du in der Library Ah ja... hab es oben nicht so explizit geschrieben... kapsel am besten alle Funktionen der DLL in eine Klasse. Bei einer c-DLL gehört hinter den Func-Type glaube(!!!) noch ein cdecl; als Aufrufkonvention Ich hab mich das letzte mal vor Jahren durch sowas gequält und freu mich derzeit mehr an C# und .NET und denke deshalb Andern können dir bei näheren Problemen (oder meinen gelegten Bug-Eiern) besser helfen. Edit zu deinem Edit: HInstance ist das Modul, dass gerade ausgeführt wird, also deine Exe-Datei, die auch die Ressource drin hat. HInstance ist eine Konstante. Ich weiss nicht ob die 0 ist... also nimm einfach HInstance :mrgreen: |
Re: Dll von *.res Datei laden
Zitat:
---- eigentlich nur das die Datei nicht öffentlich werden soll und bei Vista .. keine Ahnung wie sich das verhält könnte es probleme geben wenn man sich nicht an gewisse Regeln hält. Das möchte ich alles vermeiden. Für den Tip bzw. das suchen von TRessourcestream nochmal danke.. hilft mir schonmal weiter Wenn man nicht weiss wonach man suchen soll ist das schon aussichtlos von vornherein ;) Zitat:
aber das soll es ja nachher nicht mehr. Zitat:
Werde das mal so versuchen :) gruss Emil |
Re: Dll von *.res Datei laden
Zitat:
Zitat:
Notfalls entpack die Datei halt als "~tmp1456.dat" wenn du dir nur über die Endung sorgen machst. Sollte LoadLibrary auch schlucken (hoff ich). Aber wirklich sicher bekommste es nicht. |
Re: Dll von *.res Datei laden
Zitat:
Zitat:
gruss Emil |
Re: Dll von *.res Datei laden
Dann hol ich das Modul eben spätestens aus dem Speicher... mal im Ernst... wenn es alles sooo top-secret ist wirst du um eine verschlüsselte Verbindung zu einem Webservice nicht herum kommen.
HA! ich habs... du hast keine Lizenz für die komerzielle DLL !!! bitte nicht zu ernst nehmen :drunken: :mrgreen: |
Re: Dll von *.res Datei laden
Zitat:
Bin auch nicht so pingelig.. Meine Datei ist die BassVis welche von Developern im Forum von Un4Seen in deren projekte eingebunden wird um verschiedene arten von Visualisations Plugins auszuführen. Ich will denen nicht zumuten sich mit dieser zusätzlichen DLL rumzuschlagen deshalb will ich allen eventualitäten vorbeugen. Die müssen ja nicht wissen das in BassVis noch ne DLL versteckt ist. auch wenn man es jetzt weiss. Zitat:
ist lediglich ein Wasabi Wrapper für die neuen Winamp Plugins der code in c++ läßt sich leider in Delphi wegen der Classen nicht übersetzen .. aber eagl gruss EMil |
Re: Dll von *.res Datei laden
Zitat:
Zitat:
Zitat:
Wenn du sie unbedingt aus der Ressource laden willst, dann dürftest du wesentlich mehr Probleme unter Vista bekommen, als wenn du sie ins temporäre Verzeichnis entpackst. Du kannst dir ja mal Nicos Code angucken, wie er eine Exe aus den Speicher ausführt: ![]() |
Re: Dll von *.res Datei laden
Zitat:
Es sind halt undokumentierte Wasabi Funktionen enthalten die ich mir mühsam erarbeitet habe. Bei offenlegung der DLL kann sie jeder für seine zwecke nutzen nur dafür habe ich mir nicht die mühe gemacht. In verbindung mit BassVis kein problem solange sie nur dort verwendet wird. Nicht mal im Forum von Winamp wollte man mir helfen.. :wall: Denke alleine das ist ein grund diese nicht publik zu machen. Werde mir das Sample mal anschauen .. Danke gruss Emil |
Re: Dll von *.res Datei laden
Wenn du wirklich nur die Funktionen brauchst und nicht die Load und Unload Events
dann könnte ich mir vorstellen das du darauf zugreifen kannst. Du müstest vorher die relativen Adressen der Funktionen mit GetProcAddress ermitteln und notieren. Dann die Res in den Stream laden und die Proceduralen variablen mit den entsprechenden Zeigern belegen. Ich weiß nicht ob das bei DLLs funktioniert aber mit *.com Dateien (kein Datenregister) konnte man sowas früher machen. Und du wirst bei solchen Actionen (s. inmemexe.exe) auf jedenfall probleme mit Virenscannern bekommen. Mein Kasperski meckert einen heur.Trojan.generic an bei Michaelpuffs inmemexe und heutzutage verzichtet kaum ein Scanner auf heuristic. Tatsächlich willst du ja Daten als Code ausführen...das ist das verhalten eines Virus. Vielleicht hilft es Dir die Datei nicht nur im $TempDir abzulegen sondern auch ein flag zu setzen dem Zufolge die Datei beim Schließen vom Betriebssystem gelöscht wird...das macht zwar auch probleme mit Virenscannern.... |
Re: Dll von *.res Datei laden
Zitat:
habe da, glaube ich das richtige gefunden vielleicht ist es auch für andere ganz interessant ![]() This tutorial describes a technique how a dynamic link library (DLL) can be loaded from memory without storing it on the hard-disk first. genau das was ich erreichen will. gruss Emil |
Re: Dll von *.res Datei laden
Auch wenn es gehen mag, halte ich das für den falschen Weg. Zum einem, weil es wohl undokumentiert ist, das heißt, du musst bei jedem Update prüfen, ob es noch funktioniert und das bei zich Systemen und Konfigurationen. Du wirst also nie sicherstellen können, dass es läuft. Und zum anderem wird jemand der an die Funktionen will und deine Exe debuggt, sehr schnell sehen, was Sache ist und hat sich deine DLL ohne weiteres aus der Ressource mit einem Resourcenhacker extrahiert.
Zitat:
|
Re: Dll von *.res Datei laden
Zitat:
werde es erstmal ausgibig testen davon abgehen kann ich immer noch. muss mich mal informieren ob das den Leuten genehm ist wenn sie 2 DLL's bekommen gruss Emil |
Re: Dll von *.res Datei laden
Zitat:
|
Re: Dll von *.res Datei laden
hab mich jetzt entschieden..
Mache es wie cruiser vorgeschlagen hat. aus resource extrahieren Attribute auf hidden , dann nach Anwender /Lokale Einstellungen/temp Beim beenden dll löschen (was es nicht immer tut (Zugriff verweigert) --------- Eigentlich müßte das gehen DLL (Winamp Plugin) wird entladen in "Finalize" der letzte aufruf bevor BassVis geschlossen wird mit DeleteFile zum Pfad der extrahierten dll diese löschen.. dürfte eigentlich kein zugriff mehr sein. gruss Emil |
Re: Dll von *.res Datei laden
Uwe sagt mir das ich eine *.obj Datei in Delphi einbinden kann
Nun habe ich diese dem Projekt hinzugefügt als Meldung kommt [Pascal Error] Winamp_IO.pas(138): E2045 Bad object file format: GetAPIService.obj'
Delphi-Quellcode:
jetzt frage ich mich ob es daran liegt das sie mit MSVC erstellt wurde..
{$MINENUMSIZE 4}
{$ALIGN ON} {$L GetAPIService.obj} jemand irgendwelche informationen darüber warum es nicht geht ? bzw.. geht es theoretisch wenn ich diese mit Borland c++ erstelle und compiliere.(müßte dann erst noch installieren) Das wäre denke ich die optimale lösung für mein DLL problem gruss Emil |
Re: Dll von *.res Datei laden
Der linker ist passend konfiguriert?
|
Re: Dll von *.res Datei laden
Zitat:
gruss Emil |
Re: Dll von *.res Datei laden
Kann mir jemand sagen ob ich mit C++ Builder ein Object von einer MSVC DLL erstellen kann
oder muss diese mit C++ Builder compiliert sein ? gruss Emil |
Re: Dll von *.res Datei laden
Eventuell musst du bei deinem C-Compiler noch irgendwelche Einstellungen vornehmen, damit Delphi die generierte Objektdatei akzeptiert. Guck doch mal, was du da für Einstellungen vornehmen kannst.
|
Re: Dll von *.res Datei laden
Zitat:
Hab ne neue DLL estellt mit Borland C++ Builder die wird aktzeptiert <vcl.h> eingebunden Aber neues problem.. Bei der released addiert der Linker hunderte Exports die er unter Delphi eingebunden haben will. Bei der debug function _memcmp Scheint nicht wirklich zu funktionieren ein Obj einzubinden... Kann aber auch sein das ich einfach zu blöd dafür bin. gruss Emil |
Re: Dll von *.res Datei laden
Doch das geht. Das haben schon andere Leute gemacht. Nur leider gehöre ich nicht zu diesen, so dass ich dir nicht helfen kann.
|
Re: Dll von *.res Datei laden
Zitat:
Du hast es auf jedenfall versucht.Das rechne ich dir hoch an. Muss halt warten ob sich ein C++ Delveloper bereit erklärt sich das mal anzuschauen. Habe auch die vermutung das Msvc und C++ Builder nicht die gleichen syntaxe verwenden gibt nicht umsonst so tools wie VCTOBPR scheint es aber nicht mehr zu geben. gruss Emil |
Re: Dll von *.res Datei laden
Ich wüsste jemanden, aber der hat sich leider hier im Forum abgemeldet: Nico Bendlin aka NicoDE.
|
Re: Dll von *.res Datei laden
Zitat:
gruss Emil |
Re: Dll von *.res Datei laden
Zitat:
|
Re: Dll von *.res Datei laden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz