![]() |
Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Hallo suche Hilfe auf Stundenbasis in Ludwigsburg
bestehendes Delphiprojekt wurde von Delphi 3 auf delphi XE5 portiert und angepasst , seitdem läuft eine bisher eingbundene DLL nicht mehr StdCall EXTERNAL xxxx.dll gibt keine Daten mehr zurück |
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Vermutlich ein Unicode-Problem
|
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Hallo,
mkinzler hat es schon angesprochen. Wie sieht die Signatur (Parameter-Liste) der DLL-Methoden aus? alt procedure Dll_1(Name: String); procedure Dll_2(Name: PChar); neu (müsste geändert werden) procedure Dll_1(Name: AnsiString); procedure Dll_2(Name: PAnsiChar); |
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Hallo
dies wird übergeben als erstes sollte der Name der Datei übergeben werden. Die Dll prüft in einem Verzeichniss alle Dateien auf folgende Zeichen " IF POS('0 1 2 3 4 5 6 7 8 9',HStr)=1 THEN " und falls vorhanden soll der Name übergeben werden. F
Delphi-Quellcode:
DLL:
UNCTION ExtFlrFirst (Name : STR255;
VAR Kopf : TFlrKopf; VAR ExtFlrDat : TExtFlrDat) : INTEGER; StdCall EXTERNAL 'Flr_Ein.dll' INDEX 1; FUNCTION ExtFlrNext (VAR Kopf : TFlrKopf; VAR ExtFlrDat : TExtFlrDat) : INTEGER; StdCall EXTERNAL 'Flr_Ein.dll' INDEX 2; FUNCTION ExtFlrKopf (Name : STR255; Bez : STR255; VAR Kopf : TFlrKopf) : INTEGER; StdCall EXTERNAL 'Flr_Ein.dll' INDEX 3; FUNCTION ExtFlrLesen (Name : STR255; Bez : STR255; VAR Kopf : TFlrKopf; VAR Anz : INTEGER; VAR C,X : TEHTSpalte) : INTEGER; StdCall EXTERNAL 'Flr_Ein.dll' INDEX 4; FUNCTION ExtFlrLoeschen (Name : STR255; Bez : STR255; TmpName : STR255) : INTEGER; StdCall EXTERNAL 'Flr_Ein.dll' INDEX 5;
Delphi-Quellcode:
FUNCTION StringIstLeer (HStr : STRING) : BOOLEAN;
VAR I : INTEGER; BEGIN I := LENGTH(HStr); WHILE (I>0) AND (HStr[I]=' ') DO DEC(I); StringIstLeer := I=0; END; {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } BEGIN HoleZeile := FALSE; IF Dat.Flag AND (Dat.BPos<Dat.Size) THEN BEGIN Zeile.Anfg := Dat.BPos; Zeile.Txt := ''; Zeile.Typ := -1; CR := FALSE; LF := FALSE; I := 0; REPEAT IF Dat.BPos>=Dat.Pos THEN LeseBlock(Dat); IF Dat.Flag AND (Dat.BPos<Dat.Size) THEN BEGIN B := Dat.Blk[Dat.BPos-Dat.BAnf]; INC(Dat.BPos); INC(I); IF B=$0A THEN LF := TRUE ELSE IF B=$0D THEN CR := TRUE ELSE IF Length(Zeile.Txt)<128 THEN BEGIN {Zeichen kleiner ' ' in Leerzeichen wandeln, fuehrende und mehrfache Leerzeichen gleich aussondern:} IF (B>ORD(' ')) THEN Zeile.Txt := Zeile.Txt+CHR(B) ELSE IF (LENGTH(Zeile.Txt)>0) AND (Zeile.Txt[Length(Zeile.Txt)]<>' ') THEN Zeile.Txt := Zeile.Txt+' '; END ELSE IF I>MaxZL THEN Dat.Flag := FALSE; END; UNTIL (NOT Dat.Flag) OR CR OR LF OR (Dat.BPos>=Dat.Size); {Zeilenabschluss mit CR, folgt noch ein zugehoeriges LF?} IF CR AND Dat.Flag AND (Dat.BPos<Dat.Size) THEN BEGIN IF Dat.BPos>=Dat.Pos THEN LeseBlock(Dat); IF Dat.Flag AND (Dat.Blk[Dat.BPos-Dat.BAnf]=$0A) THEN INC(Dat.BPos); END; {Zeile gelesen?} IF Dat.Flag THEN BEGIN HoleZeile := TRUE; {Enthaelt die Zeile Daten?} HStr := Zeile.Txt; {Leerzeile?} IF StringIstLeer(HStr) THEN Zeile.Typ := 0 ELSE {Spaltenbeschriftung?} IF [B]POS('0 1 2 3 4 5 6 7 8 9',HStr)=1[/B] THEN BEGIN IF StringIstLeer(COPY(HStr,20,255)) THEN Zeile.Typ := 1; |
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
wie ist denn z.B. "B" definiert oder der Type: STR255 (Array[0..254] of char?)
Grüße Klaus |
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Delphi-Quellcode:
LIBRARY Flr_Ein;
USES SysUtils,Classes; TYPE TWert = RECORD Gueltig : BOOLEAN; Wert : DOUBLE; END; CONST MaxEHT = 7200; MaxEHTSP = 7200; TYPE [B]STR255 [/B] = Ansistring;{STRING[255];} PEHTSpalte = ^TEHTSpalte; TEHTSpalte = ARRAY[0..MaxEHTSP] OF DOUBLE; TYPE TFlrKopf = RECORD Bez : STR255; {Bezeichnung} EHT : STR255; {Dateiname EHT} Bea : STR255; {Bearbeiter} Bem : STR255; {Bemerkung} Dat : STR255; {Datum/Uhrzeit} DFl : BOOLEAN; {Flag Stoessel gelesen} DRS : TWert; {Durchmesser Rollenstoessel} Wkl : TWert; {Bezugswinkel} Spg : TWert; {1=Gespiegelt} Fkt : TWert; {Bewertungsfaktor} Inch : BOOLEAN; {Flag fuer Masssystem} Norm : BOOLEAN; {Flag, Daten normal auf T-Bahn} END; TYPE TExtFlrDat = ARRAY[0..255+4] OF BYTE; . . . .FUNCTION HoleZeile (VAR Dat : TDatei; VAR Zeile : TZeile) : BOOLEAN; CONST MaxZL = 500; VAR [B] B [/B] : BYTE; CR,LF : BOOLEAN; I,J,E : INTEGER; HStr : STR255; |
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Hallo ,
wir brauchen die Definition aller Datentypen, ST255, TFlrxxxxx Dort muss alles von String auf AnsiString, von Char auf AnsiChar geändert werden. |
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Abgesehen vom offensichtlichen problem mit den Shortstrings, die ja zum Unicode-Problem führen sind da noch mehr Fallstricke vergraben, die man im hier geposteten Code sieht. Da wäre vielleicht mal ein Refactoring angesagt - das ist auch kein Hexenwerk und sicher rasch erledigt.
|
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
Könnte man diese Diskussion vielleicht in eine andere Kategorie verschieben? Ursprünglich ging es ja um ein Job-Angebot.
|
AW: Hallo suche Hilfe auf Stundenbasis in Ludwigsburg Delphi XE5
UnicodeProblem:
Ja, erstmal ist "String" (nicht der Typ "String[123]") seit Delphi 2009 ein Alias für einen UnicodeString und vorher war er es für AnsiString. Aber der Typ "String[123]" ist und war immer ANSI. Was bedeutet
Delphi-Quellcode:
?
Ansistring;{STRING[255];}
Es was mal String[255] und ist jetzt AnsiString? String/AnsiString/UnicodeString sind "LongStrings", was "intern" ein Zeiger auf einen String ist, also im Record oder den Parametern mit diesem Typen ist immer nur ein "Pointer" drin. Beim Typen String[123] ist es aber ein "ShortString", was "intern" ein Record/StatischesArray ist, also da wo dieser Typ drin ist, dort sind die Chars direkt drin. (und ich wette, es war beim Record TFlrKopf und den Parametern, für die DLL-Schnittstelle, auch absichtlich so) PS: statt
Delphi-Quellcode:
kann man auch
if StringIstLeer(HStr) then
Delphi-Quellcode:
verwenden
if Trim(HStr) = '' then
und statt
Delphi-Quellcode:
würde ich heutzutage eher
if Pos(...) = 1 then
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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