Aufgrund des Stichwortes "DLL-Injection" gehe ich davon aus, dass es um Programmierung unter Windows geht. Dort ist eine "DLL" prinzipiell das gleiche wie ein "Programm" alias "EXE". Nur der Startcode unterscheidet sich in beiden geringfügig. Die Verkopplung der Adressierung von Funktionen und Daten zwischen den Dingern ist völlig gleich.
Ob Du also eine Funktion in einem "Programm" oder einer "DLL" aufrufen willst, ist wurscht.
Ein wenig irritierend wirkt, dass Du von einer "Adresse 0x??????" schreibst... Eine Funktion in einem externen Modul (egal ob DLL oder EXE) spricht man, solange man eine Hochsprache verwendet, immer mit dem vom Programmierer vergebenen Namen an. Zum Funktionsaufruf gehört nicht nur, den Befehlszeiger der CPU auf den Einsprung-Punkt der Funktion zu setzen, sondern auch, einen sogenannten "Stackframe" zu erzeugen, bei dem eine Reihe von Daten in genau festgelegtem Format und Reihenfolge auf den "Stack" abgelegt werden müssen, bevor der Funktionseinsprung erfolgt. Das alles willst Du nicht von Hand erledigen. Das macht man nicht mal, wenn man Assembler programmiert.
Was Du wollen wirst, ist, die Funktion in Deiner Hochsprache aufzurufen. Und da macht man das mit genau nichts anderem als ihrem Namen.
Damit der Compiler oder Interpreter der Hochsprache diesen Funktionsnamen den ganzen eben erklärten Details zuordnen und diese ganze Arbeit für Dich erledigen kann, muss ihm natürlich mitgeteilt werden, wenn man eine Funktion in einem externen Modul aufrufen will. Auch dieses Mitteilen übernehmen in der Hochsprache mitgelieferte Werkzeuge. In C++ lässt Du "Header" des externen Moduls includen, die genau nichts anderes machen, als dessen Einsprungpunkte erstmal zu "deklarieren". In den Deklarationen steht alles drin, was zum Erzeugen des richtigen "Stackframes" notwendig ist. Damit nach dem Laden des Programms und des externen Moduls an eine x-beliebige Stelle im Arbeitsspeicher (die Du definitiv nicht beeinflussen kannst, solange Du nicht schwerere Hacking-Geschütze auffährst) die Aufrufe dann auch an die richtige Adresse gehen, kümmert sich der Programm-Lader des Betriebssystems darum, dass nach dem Laden eines Moduls (wurscht, ob DLL oder EXE) sämtliche Aufrufpunkte in den Modulen auf die aktuell gültigen Adressen der zugehörigen Eintrittspunkte gesetzt werden. Dies wird in Tabellen im Programmcode festgehalten.
Wenn diese Antwort nicht treffen sollte, müsste mal mehr Hintergrundinformation her.Bisher gehe ich davon aus, dass Dereta sich in C++ einarbeitet und dort dabei ist, Module kombinieren zu wollen. Und auch dort gerade beim Einarbeiten in die Grundprinzipien ist.