Hallo Thomas,
ja, das stimmt.
Speicher(variablen) wird solange gehalten bis sie nicht mehr genutzt werden.
Es gibt zwei Arten, wie Variablen gehalten werden:
Heap => innerhalb einer Prozedur/Funktion gültig (lokaler Scope), und:
Stack => überlebt, wenn die Prozedur/Funktion verlassen wird.
Das mit den Array war ja auch so in meine Richtung...
Eine in C++ verwendete
std::map< std::string, void* > Insntanzen;
Dann braucht man nur noch in etwa sowas machen: instanzen["foo"] = 0xcafebabe;
und die map im globalen Scope belassen, dann überleben die Pointer.
Aber ich habe gerade ein anderes Problem:
hier verwende ich einen Delphi-PChar:
Delphi-Quellcode:
{$APPTYPE CONSOLE}
program Project1;
uses Windows;
type
TMyFunction =
procedure(s: PChar);
cdecl;
var
DLLHandle: HMODULE;
MyFunction: TMyFunction;
begin
DLLHandle := LoadLibrary('
foo.dll');
if DLLHandle = 0
then
begin
MessageBox(0,'
Error: DLL could not be loaded.','
Error',0);
ExitProcess(1);
end;
try
@MyFunction := GetProcAddress(DLLHandle, '
TestFunction');
if @MyFunction =
nil then
begin
MessageBox(0, '
Error: TestFunction not found in DLL.', '
Error', 0);
ExitProcess(1);
end;
MyFunction(PChar('
jukel'));
finally
FreeLibrary(DLLHandle);
ExitProcess(0);
end;
end.
und hier nur einen 0-terminierten C char *:
Code:
#include <windows.h>
#include <iostream>
#ifdef _WIN64
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
extern "C" {
DLL_EXPORT void TestFunction(char* func) {
std::cout << "Func: " << func << std::endl;
}
};
beide Image-Dateien sind im 64-Modus kompiliert.
Aber ich erhalte als Ergebnis (auf der Konsole):
Func: j