Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TStringList Max String länge (https://www.delphipraxis.net/130628-tstringlist-max-string-laenge.html)

EWeiss 11. Mär 2009 15:17

Re: TStringList Max String länge
 
Zitat:

Zitat von Klaus01
Hallo Emil,

wie es ausschaut, wirst Du wohl nicht viel anderes
übrigbleiben als Dir Dein eigenes ExtractFilePath
zu schreiben.

Die Routinen könnten in etwa so aussehen:

Delphi-Quellcode:
function extractFileName(s:string):String;
var
  i: Integer;
begin
  i:= length(s);
  while (i > 0) and (s[i] <> '\') do
    begin
      dec(i);
    end;
  result := copy(s,i+1,length(s)-i+1);
end;

function extractFilePath(s:string):String;
var
  i: Integer;
begin
  i:= length(s);
  while (i > 0) and (s[i] <> '\') do
    begin
      dec(i);
    end;
  result := copy(s,1,i-1);
end;
Kann man sicherlich noch eleganter machen ...

Grüße
Klaus

Danke werd mal schaun ob es hilft.

gruss Emil

EWeiss 11. Mär 2009 20:19

Re: TStringList Max String länge
 
Ich übergebe den Pfad nun mit GetShortName ist das einzigste was mir einfällt.
Kann aber nicht sagen ob das jetzt wieder mit anderen Sprachen probleme macht.

Was mir noch aufgefallen ist und ebenfalls mit zu dem Problem beiträgt ist
das diese DLL "CosmicBelt.svp" ein exception auslößt.

Wie kann man bei LoadLibrary das exception abfangen ohne das es zum crash kommt ?
Delphi-Quellcode:
  try
    dll := LoadLibrary(PAnsiChar(APlugin));
  except
    exit;
  end;
hilft nix kracht trotzdem.

gruss Emil

quendolineDD 11. Mär 2009 21:27

Re: TStringList Max String länge
 
Zu deinem Problem mit dem Pfad:

Zitat:

In Windows API MAX_PATH is 260 characters long. WinRAR supports only this length. At the same time, Windows Unicode API support 32767 character long filen paths. Microsoft promised to include support of long naming in whidbey but I don't know if it's supported with .net applications now. To access file paths using this API program should call the file using \\?\ prefix before the path. The only reason, I guess, why most programs are still using old APIs are compatibility reason although, to tell the truth, a very few programs are now support non-NT OSes and the security as they say that this limitation is used intentionally to prevent buffer overflow attacks. Thus having the full path of 260 we are actually limited to a 248 character-long directory name as the remaining 12 are needed for the filename.
See this article for details. See this for the _MAX_XXXX constant description and their values. By the way there is an interesting bug within the next Visual Studio codenamed Orcas posted just a few days ago.
Quelle: hier #13

Zu deiner letzten Frage (eigentlich nur eine Frage pro Thread :roll: )
Versuch mal GetLastError auszulesen. Kann natürlich sein, das die DLL Fehler in ihrer DllMain()-Procedur hat und dort die Exception auftritt. Diese kannst du dann natürlich nicht abfangen.

EWeiss 11. Mär 2009 21:37

Re: TStringList Max String länge
 
Zu 1. Danke das ist gelößt mit GetShortName. Mehr kann ich da eh nicht machen :)
Zu 2. Die DLL wurde gepackt daher kam es zum Exception. Hab sie gelöscht und mir einen vermerk gemacht.

Vielen Dank.

gruss Emil

Muetze1 11. Mär 2009 21:59

Re: TStringList Max String länge
 
1. MSDN: Maximum Path Length
2. Delphi-Referenz durchsuchenSafeLoadLibrary()

Luckie 11. Mär 2009 22:01

Re: TStringList Max String länge
 
Zitat:

Zitat von EWeiss
Ich übergebe den Pfad nun mit GetShortName ist das einzigste was mir einfällt.

Du musst aber aufpassen:
Zitat:

Zitat von Windows PSDK
When an application calls this function and specifies a path on a volume that does not support 8.3 aliases, the function fails with ERROR_INVALID_PARAMETER if the path is longer than 67 bytes.

Man kann die Unterstützung für kurze Dateinamen unter NTFS abschalten. Du solltest auf alle Fälle den Fehler abfangen.

EWeiss 11. Mär 2009 22:39

Re: TStringList Max String länge
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von EWeiss
Ich übergebe den Pfad nun mit GetShortName ist das einzigste was mir einfällt.

Du musst aber aufpassen:
Zitat:

Zitat von Windows PSDK
When an application calls this function and specifies a path on a volume that does not support 8.3 aliases, the function fails with ERROR_INVALID_PARAMETER if the path is longer than 67 bytes.

Man kann die Unterstützung für kurze Dateinamen unter NTFS abschalten. Du solltest auf alle Fälle den Fehler abfangen.

Danke für die Infos war mir nicht bekannt .. gut zu wissen.
Denke das müßte reichen.
Delphi-Quellcode:
procedure SearchFiles(PluginType: byte;
                      path: string;
                      recurse: BOOL; var List :TStrings);
var
  sr : TSearchrec;
  tmpPath: string;

begin

 if (Path[length(path)] <> '\') then
    path := path + '\';

 try
     tmpPath := GetShortName(Path);
 except
     if GetlastError = ERROR_INVALID_PARAMETER then
       tmpPath := Path;
 end;
@Mutze1
1. da war ich schon daher auch die Idee mit GetShortName
2. Habe es mal mit SafeLoadLibrary() versucht das gleiche problem
Die DLL ist mit Petite Kompremiert http://www.un4seen.com/petite/
dieser scheint die Datei zerschossen zu haben oder es ist einfach nicht möglich diese dann mit LoadLibrary zu laden.

trotzdem danke muss halt alles versuchen.

gruss Emil

Luckie 11. Mär 2009 23:13

Re: TStringList Max String länge
 
Denk aber daran, dass API-Funktionen keine Exception werfen, sondenr einen Fehlercode zurückgeben. Deine Funktion GetShortName muss also im Fehlerfall eine Exception werfen.

EWeiss 11. Mär 2009 23:16

Re: TStringList Max String länge
 
Zitat:

Zitat von Luckie
Denk aber daran, dass API-Funktionen keine Exception werfen, sondenr einen Fehlercode zurückgeben. Deine Funktion GetShortName muss also im Fehlerfall eine Exception werfen.

Verstehe ich jetzt nicht was du meinst.. sorry
Ist was falsch an meiner Error prüfung ?

EDIT:
Ach so verstehe jetzt was du meinst
Hier mal die Funktion aus dem Forum hier...

Delphi-Quellcode:
var
  ErrorCode: DWord;
Delphi-Quellcode:
function GetShortName(sLongName: string): string;
var
  sShortName:   string;
  nShortNameLen: Integer;
begin
  SetLength(sShortName, MAX_PATH);
  nShortNameLen := GetShortPathName(PChar(sLongName), PChar(sShortName), MAX_PATH - 1);
  if (0 = nShortNameLen) then
  begin
    ErrorCode := ERROR_INVALID_PARAMETER; // Du meinst das hier in etwa ? 
    Exit;
  end;
  SetLength(sShortName, nShortNameLen);
  Result := sShortName;
end;
gruss Emil

Muetze1 12. Mär 2009 07:57

Re: TStringList Max String länge
 
Zitat:

Zitat von EWeiss
@Mutze1
1. da war ich schon daher auch die Idee mit GetShortName

Und warum nutzt du dann nicht die im Text angegebene Möglichkeit über UNC Angaben um wenigstens auf eine Pfadtiefe von 32767 Zeichen zu kommen?

Zitat:

Zitat von EWeiss
2. Habe es mal mit SafeLoadLibrary() versucht das gleiche problem

Ich hatte gehofft, dass es ein MS Visual C Startup Code in der DLL ist, der das CW der FPU umsetzt, ansonsten hätte es keine Auswirkungen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr.
Seite 2 von 3     12 3      

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