Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit Strings in DLL (https://www.delphipraxis.net/118222-problem-mit-strings-dll.html)

helgew 3. Aug 2008 01:03


Problem mit Strings in DLL
 
Guten Abend,

Wie bekomme ich es gebacken, Strings global verfügbar zu machen?

Mein Ansatz bisher :

Delphi-Quellcode:
unit GlobalStrings;

interface
  uses
    windows;

type TGlobalString = packed record
  length: WORD;
  hMapObj: THandle;
end;



function SetGlobalString(str: String): TGlobalString;
function GetGlobalString(gstr: TGlobalString): String;
procedure FreeGlobalString(var gstr: TGlobalString);


implementation


function SetGlobalString(str: String): TGlobalString;
var
  pstr : PChar;
begin
  result.length := length(str);
  result.hMapObj := CreateFileMapping(
                INVALID_HANDLE_VALUE,  // use paging file
                nil,                  // default security attributes
                PAGE_READWRITE,        // read/write access
                0,                     // size: high 32-bits
                result.length,             // size: low 32-bits
                'dllmemfilemap'); // name of map object

  pstr := MapViewOfFile(
                result.hMapObj ,    // object to map view of
                FILE_MAP_WRITE, // read/write access
                0,             // high offset: map from
                0,             // low offset:  beginning
                0);            // default: map entire file
  CopyMemory(pstr,@str[1],result.length);
end;

procedure FreeGlobalString(var gstr: TGlobalString);
begin
  if gstr.hMapObj <>0 then
  begin
    gstr.length := 0;
    CloseHandle(gstr.hMapObj);
    gstr.hMapObj := 0;
  end;
end;

function GetGlobalString(gstr: TGlobalString): String;
var
  pstr : PChar;
begin
  if gstr.hMapObj <> 0 then
  begin
    pstr := MapViewOfFile(
                gstr.hMapObj ,    // object to map view of
                FILE_MAP_READ, // read/write access
                0,             // high offset: map from
                0,             // low offset:  beginning
                0);            // default: map entire file
    result := string(pstr);
    setlength(result,gstr.length);
  end;
end;

end.
Das ist noch nicht ausgegoren, aber wann muss ich einen solchen String erstellen?

helgew 3. Aug 2008 02:20

Re: Problem mit Strings in DLL
 
ok, hatte garnichts damit zu tun. Wenn die dll natürlich vom System verwendet wird, sind keine Daten mehr von einem anderen Benutzer (Programm) vorhanden. Ich habe nun Message Broadcasts genutzt, um mit dem Hauptprogramm zu kommunizieren

Dax 3. Aug 2008 02:26

Re: Problem mit Strings in DLL
 
Du kannst Strings nicht einfach zwischen DLLs und Programmen verschieben (dazu braucht es FastMM4, ShareMem oder einen ähnlichen Memory Manager, der sowas erlaubt). Wenn du statt Strings einfach PChars verwendest, bist du auf der sicheren Seite: dann können nämlich Programme aller Sprachen deine DLL benutzen, nicht nur Delphi-Programme.

helgew 3. Aug 2008 02:33

Re: Problem mit Strings in DLL
 
Danke für den Hinweis. Das Problem ist jedoch weit schwerwiegender ( da braucht man ja auch immer ein Weilchen, bis mans rausgefunden hat. die Bibliothek beinhaltet keine dynamischen Variablen, das war mein Fehler. Da kann ich rummachen mit Strings, so viel ich will. unter

http://www.delphipraxis.net/internal...t.php?t=139471

werde ich dann gleich das fertige Programm hochladen... moment


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz