AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Record mit Widestring am DLL übergeben bei XE2
Thema durchsuchen
Ansicht
Themen-Optionen

Record mit Widestring am DLL übergeben bei XE2

Ein Thema von Codehunter · begonnen am 2. Jul 2013 · letzter Beitrag vom 2. Jul 2013
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Record mit Widestring am DLL übergeben bei XE2

  Alt 2. Jul 2013, 14:34
Hallo!

Ich komm grad bei der Übergabe eines Records an eine DLL-Procedure nicht weiter. Der Record enthält eine Widestring-Variable, welche leer an die DLL übergeben wird, dort geschrieben werden soll und dann innerhalb der Anwendung weiter verarbeitet.

Mein Textcode funktioniert so lange wie ich die dynamisch geladene DLL per FreeLibrary wieder entlade. Dann gibt der Speichermanager alles frei was innerhalb der DLL existiert hat und ich bekomme logischerweise in der Anwendung eine AV. Kommentiere ich das FreeLibrary einfach aus funktioniert es wunderbar. Was mich da stutzig macht: Ich bekomme trotz FastMM4 beim Schließen der Anwendung keine Memleaks angezeigt, obwohl die DLL nicht richtig entladen wurde.

Wobei mir wichtiger ist zu verstehen, wie man Widestrings richtigerweise mit DLLs austauscht und die Inhalte der Widestrings über das FreeLibrary hinaus "konserviert". Hier mein Testcode:
Delphi-Quellcode:
// === Die DLL ===

library MyDLL;

uses
  FastMM4,
  System.SysUtils,
  System.Classes,
  ModuleInfo in '..\..\Common\ModuleInfo.pas';

{$R *.res}

procedure GetModuleInfo(AModuleInfo: PModuleInfo); stdcall;
const
  MODULENAME: String = 'My DLL';
begin
  if AModuleInfo <> NIL then begin
    AModuleInfo^.ModuleName:= MODULENAME;
  end;
end;

exports GetModuleInfo;

begin
end.

// === ModuleInfo.pas ===

unit ModuleInfo;

interface

uses
  Windows, SysUtils;

type
  TModuleInfo = record
    ModuleName: String;
  end;
  PModuleInfo = ^TModuleInfo;

  TModuleInfoProc = procedure (AModuleInfo: PModuleInfo); stdcall;

  function GetModuleInfo(const AModuleFile: TFileName; AModuleInfo: pModuleInfo): Boolean;

implementation

function GetModuleInfo(const AModuleFile: TFileName; AModuleInfo: PModuleInfo): Boolean;
var
  hDLL: THandle;
  hProc: TModuleInfoProc;
begin
  result:= FALSE;
  hDLL:= SafeLoadLibrary(AModuleFile);
  if hDLL <> 0 then begin
    @hProc:= GetProcAddress(hDLL, 'GetModuleInfo');
    if Assigned(hProc) then begin
      hProc(AModuleInfo);
      result:= TRUE;
    end;
    // FreeLibrary(hDLL); <-- Die magische Zeile ;-)
  end;
end;

end.

// === Die Hostanwendung ===

procedure TForm1.Button1Click(Sender: TObject);
var
  MI: TModuleInfo;
  Path: TFileName;
begin
  Path:= IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'Modules\MyDLL.dll';
  if GetModuleInfo(Path, @MI) then begin
    Label1.Caption:= MI.ModuleName; // <-- Mit FreeLibrary gibts hier die AV
  end;
end;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter ( 2. Jul 2013 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Record mit Widestring am DLL übergeben bei XE2

  Alt 2. Jul 2013, 15:15
Du arbeitest nicht mit Widestrings sondern bei XE2 mit Unicodestrings.

Widestrings werden von Windows-MM verwaltet. Unicodestrings vom Delphi-MemoryManager.


Laufen beide (DLL/Exe) mit FastMM wirst du bei Unicodestrings vermutlich das Define "AttemptToUseSharedMM" benötigen
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Record mit Widestring am DLL übergeben bei XE2

  Alt 2. Jul 2013, 15:25
Man ich geh gleich baden... Du hast vollkommen recht. Ich habe mir für D7 (womit ich eigentlich am häufigsten code) und XE2 zwei verschiedene Verzeichnisse für FastMM4 angelegt. In der D7-Version hatte ich die Shared Mem Optionen vor langer Zeit schon aktiviert und jetzt bei XE2 wunder ich mich dass das nicht so will wie ich es von D7 gewohnt bin ^^

Mit den Unicodestrings haste auch recht.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz