Zitat von
Spider:
Müsste ich GetMem für jeden einzelnen PChar aufrufen?
Du kannst genausogut einen einzigen Speicherblock allokieren, der groß genug für alle Strings inklusive Nullterminator (einen für jeden String, logischerweise) ist, aller Strings der Reihe nach (inklusive Nullterminator) reinkopieren und die Pointer für das verwendete Record passend setzen. Dürfte wahrscheinlich sogar effizienter beim Speicher sein, es ist aber mindestens schneller, weil nur ein Speicherblock angefordert wird.
Zitat von
Spider:
Wo müsste ich das dann aufrufen? In der
DLL oder in meinem Programm?
Zitat von
Frickeldrecktuxer_TM:
Ich weiß nicht genau, wie GetMem() sich über Module-Grenzen hinweg verhält, aber eigentlich sollte es damit gehen, um in der
DLL Speicher zu allokieren, den der Hauptprozess sieht.
Probier's aus und schau im Debugger, ob der Speicher wieder freigegeben wird, wenn das Modul finalisiert wird.
Zitat von
Spider:
Könnte man nicht die Records für
DLL -> Programm mit PChar machen, im Programm dann aber als String speichern?
Kannste auch, dann brauchst du halt zwei Records, überlässt dafür aber dem Compiler das Kopieren des Speichers (Stimmt das? Schau zur Sicherheit lieber, ob beim Zuweisen UniqueString() aufgerufen wird). Ist genau das gleiche in grün, nur daß vorne noch 8 Byte extra für RefCount und StrLen stehen.
Für mich wäre es logischer, es bei einem Record zu belassen und meine Strings selber zu kopieren.
Zitat von
Spider:
Delphi-Quellcode:
{ TLanguageDLLCommunicator }
procedure TLanguageDLLCommunicator.SetFileName(
const Value:
String);
begin
try
FreeLibrary(FHandle);
FOpened := false;
except
{ Do nothing } // argh
end;
FFileName := Value;
try
FHandle := LoadLibrary(PChar(Value));
if FHandle = 0
then
begin
raise Exception.Create('
Can not load languagedll'#13#10+Value);
end;
FOpened := true;
except
raise Exception.Create('
Can not load languagedll'#13#10+Value);
// argh
end;
end;
Was ist das denn bitte? Die mit "argh" gekennzeichneten Stellen sind genau das, wie man's nicht macht.
Hinweis: Calls ins
Win32-
API erzeugen keine Exceptions. Wenn "FOpened := False" oder "FreeLibrary(FHandle)" eine
Exception werfen, hast du ganz andere Probleme, die du auf keinen Fall mit einem leeren Except-Block zu schlucken hast. Genauso verhält es sich mit dem zweiten "argh". Dein Code sollte keine
Exception verursachen, außer deine eigene. Die fängst du ab und wirfst sie nochmal? Lass den try-Müll da weg, der hat an dieser Stelle nichts zu suchen. Wenn das
Exception-Handling nötig wird, hast du ein so massives Problem, daß es einfacher sein wird, dein System neu zu installieren, als nach einer Fehlerursache zu forschen.