Einzelnen Beitrag anzeigen

Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#7

Re: DLL: Record aus DLL holen

  Alt 24. Apr 2006, 20:01
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.
  Mit Zitat antworten Zitat